PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sinuswelle digital erzeugen



grizzly
12.12.2010, 13:13
Hallo
Ich frage mich, wie man mit möglichst geringem Material- und Pin-bedarf eine Sinuswelle und am besten auch andere Wellenformen mit guter Auflösung erzeugen kann.
Ich konnte im Internet keine für Anfänger wie mich leicht verständlichen Informationen finden.
Mit einem Kondensator allein gehts wohl nicht. Ausserdem könnte man die Wellenform nicht ändern. PWM fällt beim ATMega168, den ich dazu verwende sowieso weg(500Hz).
Vielleicht könnte man verschiedene Pins mit unterschiedlichen Widerständen im Takt ansteuern?
Also:
1 volt Pin, dann 2v, dann 3, 4, 5, und wieder 4, 3, 2, 1?
Oder gehts mit noch weniger Pins?
z.B. Software PWM mit >50 khz?
Oder weniger Rechenintensiv?
Vielen Dank für eure Antworten!

TobiKa
12.12.2010, 13:31
Hi

Ja du kannst dir einen DA Wandler aus Widerständen bauen, ist sehr einfach und günstig.
Oder du benutzt einen fertigen DA Wandler, aber meist teuer.
Oder du benutzt nen AVR der schon nen DA Wandler drin hat, z.B. nen Xmega.

hardware.bas
12.12.2010, 13:54
Mit einen DA-Wandler mit Widerständen, wie ToBiKa empfiehlt, sind sehr
hohe Frequenzen möglich und das System ist auch frei von eventuellen
PWM-Resten. DA-Wandler nach der R2R-Widerstandsmethode brauchen
beispielsweise 8 Pins zur Darstellung von 256 Analogstufen.
In Frequenzumrichtern wird der "Sinus" mit reiner PWM erzeugt, hierbei
erfolgt die Glättung mit der Motorinduktivität. VG Micha

Besserwessi
12.12.2010, 14:04
Das passende Verfahren heißt DDS. Für die Ausgabe braucht man da einen Digital-Analogwandler, in irgendeiner Form. Der µC ist dabei schon relativ stark beschäftigt.

Wenn die Frequenz der Sinuswelle nicht so hoch sein muss, kann man auch beim Mega168 einen PWM Ausgang als DA Wandler nutzen. Bei 7 Bit PWM Auflösung kommt man schon auf rund 150 kHz PWM Frequenz (bei 20 MHz takt) und könnte damit auch noch einen Sinus bis etwa 10 kHz darstellen. Am Ausgang braucht man dann als Hardware nur einen Tiefpassfilter - je niedriger die Frequenz, desto einfacher kann der Filter ausfallen.

Besser wird es mit einem externen DA Wandler oder halt einer R2R Widerstandskette, für wenig PINs ggf. auch am SPI Anschluß.

hardware.bas
12.12.2010, 16:44
Bei der R2R-Lösung mit SPI zum DA-Wandlerm wäre SPI jedoch wieder
ein Nadelöhr, sicher bei niedrigen Frequenzen kein Problem. Ansonsten
Atmega32 o.ä. und dafür vielleicht 16 Pins vorsehen. Die Parallelausgabe
durfte nicht so zeitkritisch sein und 16 bit sind ja schon eine quasilineare
Auflösung. VG Micha

PICture
12.12.2010, 17:40
Hallo!

Vielleicht wäre es am einfachsten den Sinus in einer "lookup table" in Flash ablegen und mit gewünschter Frequenz nur ablesen und per R2R ausgeben. ;)

MfG

Besserwessi
12.12.2010, 19:23
So schlimm ist die Begrenzung der Datenrate durch SPI nicht - wenigstens nicht bei einem 8 Bit Wandler. Bei Hardware SPI kommt man bis 2 Zyklen pro Bit - mit einem Bit als Leerlauf (läßt sich nicht oder schwer vermeiden) kommt man da auf 18 Zyklen. Das wären bei 20 MHz Takt schon etwa über 1 MHz Abtastrate für den Ausgang.

So viel schneller kriegt man die DDS Schleife ohnehin nicht wenn die CPU nebenbei noch irgendwas machen soll. Selbst mit 100% Rechenzeit in der DDS Schleife liegt man auch schon bei wenigstens 9 bis 12 Zyklen.

TobiKa
12.12.2010, 19:35
So mal ne ganz andere Idee, wie wäre es z.B. einen XR2206 zu benutzen?! Dann musst dich um kaum noch was kümmern.

PICture
12.12.2010, 20:11
.. und nur mit R2R die Frequenz im Verhältnis 1000:1 ändern ... ;)

MfG

grizzly
12.12.2010, 20:50
Danke für die vielen schnellen Antworten.
Ich möchte unbedingt das Prinzip verstehen und auch nicht neue Bauteile besorgen müssen, deshalb möchte ich es so einfach wie Möglich ohne IC Bauen.

@Besserwessi:
Ich verstehe nicht ganz, wie das geht, Ich habe gedacht, die PWM - Frequenz des ATMega168 sei 500 Hz
Ausserdem möchte ich die Welle auch schnell und unkompliziert ändern können.

Damit ich es richtig verstehe: Ich nehme z.B. nur 4 Pins
Ich möchte die ganzen 40 mA des 168 nutzen , also müssen die Widerstände nach dem Ohmschen Gesetz
Pin 1: 25
Pin 2: 50
Pin 3: 75
Pin 4: 100
betragen. Der Controller macht also:
0 an, warten, 0 aus 1 an, ..., 4 aus 5 an, 5 aus 4 an, ...

Oder gehts effizienter?
Noch eine ganz andere Frage: wenn ich die Widerstände wie oben dimensioniere, fliessen dann, egal welche Last dran hängt, 40 mA?
Und was ist R2R?
Danke

hardware.bas
12.12.2010, 21:23
Warum die ganzen "40mA nutzen"??? Um einen Ausgangsverstärker kommt
man sicherlich eh nicht umhin. Warscheinlich OPV. VG Micha

Besserwessi
12.12.2010, 21:49
Die Sinuserzeugung nach dem DDS prinzip geht etwas anders:
Es wird eine Variable mit z.B. 24 oder 32 Bit für Phase reserviert. Die oberen 8 Bit werden als Zeiger einer Sinustabelle genutzt. Es wird dann fortlaufend, z.B. alle 5 µs der Phasenwert um einen bestimmten Betrag erhöht und dann ein Wert aus der Sinustabelle ausgelesen und über den DA Wandler (z.B. 6 -8 Bits) ausgegeben. Die Frequenz wird verändert über den Betrag um den sich die Phase jeweils erhöht. Die Freuquenz kann so sehr fein (Schritte von rund 0.02 Hz bei 24 Bit Phase) eingestellt werden.
In Grenzen geht auch eine andere Wellenform, wenn man die Tabelle austauscht.

Die R2R schaltung ist eine andere Möglichkeit mit Widerständen einen DA Wandler aufzubauen. Man braucht zwar doppelt so viele Widerstände wie mit den gewichteten Widerständen, aber dafür nur 2 Werte im Verhältnis 1:2. Die Widerstände sollte man auch eher größer wählen, denn die IO-Ports haben einen Ausgangswiderstand von etwa 30-50 Ohm. Die externen Widerstände sollten deutlich größer sein, sonst kommt man nicht mal auf 4 Bit Auflösung. Für die R2R Kette würde ich eher 4,99 K und 10 K vorschlagen.
Um einen Verstärker am Ausgang wird man nicht herumkommen.

Die PWM Freuquenz beim Mega168 ist nicht immer 500 Hz. Die kann man in Grenzen Wählen bis maximal µC-Takt / "Zahl der stufen".

Es gibt schon einiger fertige DDS Projekte mit einem AVR im Netz, da kann man sich schon einiges anschauen.

hacker
12.12.2010, 22:22
Für die Sinusschwingung kann man auch anstatt einer Lookup Tabelle eine Differenzengleichung lösen, bei der die Lösung schwingt. Das ist dann quasi ein digitaler Sinusgenerator.

hardware.bas
15.12.2010, 08:20
Vielen Dank an Besserwessi - von DDS habe ich bisher noch nie was
gehört, dieses Prinzip scheint ja hochinteressant zu sein. VG Micha

Besserwessi
15.12.2010, 18:39
Ein Link zum Weiterlesen zu DDS Prinzip:
http://www.mikrocontroller.net/articles/DDS
Da ist auch eine Link zu einem kleinen Generator mit einem AVR dabei.

Waldschrat
15.12.2010, 21:06
Hallo,
mal eine doofe Frage: kann man nicht ein Rechtecksignal erzeugen und mit einem steilen Tiefpass die Oberwellen filtern, dass nur noch die Grundwelle bleibt? Das wäre ja dann sogar ein echter Sinus mit Zeit-kontinuierlichen Werten
LG
Waldschrat

Janigut
15.12.2010, 21:52
Moin,
Könnte man nicht rein theoretisch einen mechanischen Sinusgenerator mit einem Schiebepoti und einer Kurbelwelle, die sich mit absolut konstanter Geschwindigkeit bauen, der einen perfekten Sinus erzeugt?

Besserwessi
15.12.2010, 21:57
Erst ein Rechteck und dann ein Tiefpassfilter kann man machen, aber praktisch nur bei einer relativ festen Frequenz. Etwas besser geht es mit einem Bandpass statt tiefpass. Bei einer Recheckspannung ist die sehr feine Einstellung der Frequenz nicht so einfach (ein guter Weg ist da z.B. erst ein Sinus per DDS und daraus ein Rechteck).

Zum DDS Generator gehört auch ein Tiefpassfilter dahinter. Der muss sich nur an der Sampelrate orientieren und es geht bei allen niedrigeren Frequenzen.

hardware.bas
19.12.2010, 13:08
Habe grad in einem anderen Thread PLL empfohlen.
Wäre sicher auch hier ein Vorschlag. VG Micha

Richard
19.12.2010, 13:29
Habe grad in einem anderen Thread PLL empfohlen.
Wäre sicher auch hier ein Vorschlag. VG Micha

Oder einmal über Schwingkreise b.z.w. Wien bücken Generator, Phasenschieber schlau lesen. :-)

Gruß Richard

Besserwessi
19.12.2010, 17:09
Ein PLL kann helfen um eine Frequenz zu stabilisieren oder fein digital einstellbar zu machen. Ob die Frequenz dann ein Sinus wird, hängt von VCO ab. Gerade bei niedrigen Frequenzen (< 1 MHz) ist das oft erstmal nur ein Rechteck oder Dreieck.

Das DDS-Prinzip in Software auf einem AVR ist bis etwa 20-100 kHz schon eine gute Lösung. Wenn man es analog (per Poti) bedienen will, und keine Quarzstabile Frequenz braucht, geht auch die Wien-brücke recht gut.

hardware.bas
19.12.2010, 17:29
Das der VCO "sinustauglich" sein muss, ist klar. Richard erwähnte schon
die althergebrachten, jedoch bewährten Lösungen. Der AVR kontrolliert
dann mittels PLL den VCO. Das nannte oder nennt man dann
"Frequenzsynthese" obwohl der Sinus eigentlich vom VCO kommt,
welcher jedoch - bei guter PLL - mit dem AVR phasenstarr mitläuft.
In der reinen HF-Technik natürlich DIE Lösung.
Die "volle digitale" Erzeugung ist es natürlich nicht, das wären
dann die anderen hier beschriebenen Lösungen. VG Micha