Forum: Mikrocontroller und Digitale Elektronik Sinus mit Atmel


von Michael O. (Gast)


Lesenswert?

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

von Flo (Gast)


Lesenswert?

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.

;-)

von Michael O. (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

>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.

von guest (Gast)


Lesenswert?

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.

von Robert L. (manateemoo)


Lesenswert?

100kHz Grundfrequenz mit einem PWM ist ja schon recht heftig.
Ich würde es mit einem D/A Konverter Chip versuchen z.B. (LTC1661)

von Billy (Gast)


Lesenswert?

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.

von Michael O. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Die Anforderungen an die Rechenleistung hängt stark von der Breite des 
Phasenakkumulators ab, möchte ich behaupten.

von Ulrich (Gast)


Lesenswert?

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.

von Stephan M. (stephanm)


Lesenswert?

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
Noch kein Account? Hier anmelden.