Hallo Ich möchte mit meinem Atmega 88 einen Sinus erzeugen. Dieser sollte zwischen 1kHz und 100kHz umschaltbar sein (Oder auch zwei anderen Frequenzen). Wichtig ist, dass diese Frequenzen recht genau sind. Ich hab schon mit PWM und Filtern gearbeitet, Problem hier ist aber, dass zwei verschiedene Filter verwendet werden müssen, für die beiden Frequenzen und auch die genauigkeit lässt zu wünschen übrig. Auch mit R2R hab ich gearbeitet, leider war das aber auch nicht wirklich genau. Nun hab ich an einen DDS Chip gedacht, aber ist das nicht einwenig overskillt für meine Anforderungen? Würd mich über Hilfe freun. Grüsse Michi
Definiere dein ungenau, stimmt die frequenz nicht? Hast du den einen Quarz für deinen uC spendiert? Ohne den wird deine Ausgabefrequenz nie genau sein, egal wie du die Sinuswelle letztendlich erzeugst. ;-)
Durch die Rundung der Sinustabelle ist er halt nicht besonders genau. Auch die Verwendung von unterschiedlichen Filtern gefällt mir nicht. Ja habe einen 12MHz Quarz dran.
>Nun hab ich an einen DDS Chip gedacht, aber ist das nicht einwenig >overskillt für meine Anforderungen? Auf jeden Fall. Hier unter Projekte findest Du einen schönen Signalgenerator (DDS-Prinzip), der einen Mega8 benutzt.
Elm Chan hat einen DDS Generator mit zwei 16 bit Kanälen, beliebigen Mustern per SD Karte und überschaubarer Hardware entworfen. Evt. kann man da ein paar Ideen aufgreifen und mit einfließen lassen. Wenn es aber nur ein Sinus sein soll führt ein DDC Chip mit Sicherheit schneller zur Lösung.
100kHz Grundfrequenz mit einem PWM ist ja schon recht heftig. Ich würde es mit einem D/A Konverter Chip versuchen z.B. (LTC1661)
Das würde ich auch machen. Einfach die Werte vorab berechnen, da kannst du die Genauigkeit ja festlegen und dann speicherst du das in einer Tabelle ab. Wir haben so etwas mal im Studium gemacht um ein elektronisches Klavier zu bauen. Hat wunderbar funktioniert.
Danke für die Zahlreichen Antworten. Hab mich jetzt doch nochmals an die PWM Variante rangemacht. Eventuell kann ich die obere Frequenz von 100kHz noch runternehmen. In welchem Frequenzbereich kann ich mit der PWM Variante in etwa arbeiten? Habe folgende Präsentation gefunden: http://www.avr-asm-tutorial.net/avr_de/praesentation/Teil_8_Beispiel_11.pdf Hier wird auf Seite 8 mit einem Programm gearbeitet, welches alles nötige ausrechnet. Wo krieg ich das Programm her? hat das eventuell irgendwer? Habs leider per google und auf der Page nicht gefunden. Grüsse Michi
Michael O. schrieb: > Danke für die Zahlreichen Antworten. Hab mich jetzt doch nochmals an die > PWM Variante rangemacht. Eventuell kann ich die obere Frequenz von > 100kHz noch runternehmen. Das muss dann aber deutlich drunter liegen. > In welchem Frequenzbereich kann ich mit der PWM Variante in etwa > arbeiten? rechne nach. Mit einer 8 Bit PWM kannst du maximal 12 1 8 = 1.5 1.5 Mio mal pro Sekunde einen neuen PWM Wert erzeugen. Mehr geht nicht, denn der PWM Counter muss von 0 bis 255 durchzählen, bis ein PWM Zyklus durch ist. Das bedeutet, dass du bei 100kHz eine Sinusschwingung aus gerade mal 15 Samples zusammensetzen kannst. Von deinem gewünschten Sinus wird da nicht mehr viel übrig bleiben. > Habe folgende Präsentation gefunden: > http://www.avr-asm-tutorial.net/avr_de/praesentation/Teil_8_Beispiel_11.pdf > > Hier wird auf Seite 8 mit einem Programm gearbeitet, welches alles > nötige ausrechnet. Wo krieg ich das Programm her? hat das eventuell > irgendwer? Hast du dir auch angesehen, mit welcher Frequenz die Demo arbeitet? In die gleiche Kerbe fällt auch: > Wir haben so etwas mal im Studium gemacht um ein elektronisches > Klavier zu bauen. Hat wunderbar funktioniert. Tonfreuquenzen sind winzig gegen das was du vor hast. Bei kleinen Frequenzen ist es simpel per DDS eine Signalform zu erzeugen. Interessant wird es bei hohen Frequenzen.
Karl heinz Buchegger schrieb: > rechne nach. > Mit einer 8 Bit PWM kannst du maximal 12 1 8 = 1.5 > 1.5 Mio mal pro Sekunde einen neuen PWM Wert erzeugen. > Mehr geht nicht, denn der PWM Counter muss von 0 bis 255 durchzählen, > bis ein PWM Zyklus durch ist. Du meinst eher
1 | 12 / 1 / 2^8 |
. Das sind auch gerade mal 46kHz. Das kommt mir schon realistischer vor. Nicht umsonst haben gängige DDS ICs 50 oder 100MHz Takt.
Simon K. schrieb:
> Du meinst eher
1 | 12 / 1 / 2^8 |
. Das sind auch gerade mal 46kHz.
> Das kommt mir schon realistischer vor.
Drum kam mir die Zahl so hoch vor.
Danke für die Korrektur.
Karl heinz Buchegger schrieb: > Simon K. schrieb: > >> Du meinst eher
1 | 12 / 1 / 2^8 |
. Das sind auch gerade mal 46kHz. >> Das kommt mir schon realistischer vor. > > Drum kam mir die Zahl so hoch vor. > Danke für die Korrektur. Keine Ursache, musste aber auch erst mal schmunzeln und nachgucken. Übrigens: Wenn man einen 20MHz AVR Typ nimmt, dann kommt man schon fast auf die doppelte Frequenz bei 8 Bit Auflösung. Alternativ einen der Tiny's die eine 64MHz PLL für die Timer eingebaut haben. Wobei dann natürlich die Rechenleistung für die DDS selber fehlt.
Die Anforderungen an die Rechenleistung für die DDS schleife sind nicht so hoch. In ASM sind das etwa 8-12 Zyklen. Auch wenn man den 8 Bit PWM mit 64 MHz hat, sind das noch 64 Zyklen bei 16 MHz. Da sind 100 kHz theoretisch gerade noch dirn, aber besser wäre da doch ein echter DA Wandler oder ein R2R Netzwerk.
Die Anforderungen an die Rechenleistung hängt stark von der Breite des Phasenakkumulators ab, möchte ich behaupten.
So schlimm ist das mit dem Phasenakkumulator nicht. Ein Byte mehr braucht 1 Zykluns mehr. Realistisch sind ohnehin vor allem 24 oder 32 Bit für den Phasenakkumulator. Die größere Frage ist da eher ob die Sinustabelle 256,512 oder 1024 Einträge hat.
Mit einem 32 Bit Phasenakkumulator und einer 512 Byte LUT für den Sinus kriegt man bei 12MHz Taktfrequenz 1MS/s aus einem AVR heraus. (1.5MS/s wären mit 18MHz Takt auch noch zu machen, wenn der verwendete AVR das mitmacht.) Ich hab hier seit ein paar Tagen einen Testaufbau mit den genannten Daten stehen, mit DAC0800 als D/A-Konverter und einem Butterworth-Filter 7. Ordnung als Filter. Auch ein 250kHz-Signal am Ausgang sieht auf dem Oszilloskop noch schön nach Sinus aus. Bei Interesse am Projekt bitte melden. Liebe Grüße, Stephan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.