Forum: Mikrocontroller und Digitale Elektronik Sinus per DDS erzeugen


von Andi (Gast)


Lesenswert?

Hallo Forengemeinde...

ich habe eine Frage bezüglich der Erzeugung einer Sinuswelle im hörbaren 
Bereich, sagen wir 10kHz. Ich möchte für diese Aufgabe ein ATMega8 
verwenden, indem ich ein 8-Bit-Port mit einem Widerstandsnetzwerk als 
DAC belege. Nun habe ich viel darüber gelesen und auch einige Rechnungen 
dazu nachvollzogen. Allerdings sind mir noch einige Punkte unklar. Ich 
möchte, dass der Sinus so "schön" wie möglich ist und würde daher auch 
die 8-Bit Auflösung ausnutzen wollen. Was für ein XTAL wäre für meine 
Zwecke optimal? Und wie schnell sollte meine Interruptroutine arbeiten 
bzw aufgerufen werden? ich würde 256 Werte in einer Tabelle ablegen. Ist 
es korrekt, dass ich dann eine Interruptfrequenz von 256*10000Hz habe? 
Das wären 2,048MHz. Ist das zu handlen? Oder benötige ich bei der 
Frequenz gar nicht so eine Hohe Auflösung?
Wäre euch sehr dankbar, wenn ich Ihr mir auf die Sprünge helfen 
könntet...
Vielen Dank schon mal und Gruss
Andi

von Matthias L. (Gast)


Lesenswert?

>Ist es korrekt, dass ich dann eine Interruptfrequenz von 256*10000Hz habe?
>Das wären 2,048MHz.
In dem Fall ja.

>Ist das zu handlen?
Nicht mit nem Atmel und Interrupts.

>Oder benötige ich bei der
>Frequenz gar nicht so eine Hohe Auflösung?

Ja, benötigst du nicht. Mach dich mal mit der Problematik der Abtastung 
vertraut. Stichwort Abtasttheorem. Du wilslt einen reinen Sinus bauen. 
Dazu reicht es, rein theoretisch, zwei Werte pro Periode auszugeben. 
Also mindestens 20kHz Ausgaberate. Das funktioniert aber nur, wenn dein 
Tiefpass hinter dem DAC ideal ist. Da er das nicht ist, musst du die 
Ausgabefrequenz weiter erhöhen.

Aus dem Bauch heraus würde ich mal von Faktor 5..10 schätzen..

von Jadeclaw D. (jadeclaw)


Lesenswert?

Geht nicht gibt's nicht:
http://www.myplace.nu/avr/minidds/index.htm

Gruß
Jadeclaw.

von Michael L. (Gast)


Lesenswert?

Hallo,

schau dir mal AD5930 an. Der müßte das können.

Gruß,
  Michael

von hans (Gast)


Lesenswert?

hallo andi,

bei 10 khz reichen auch weniger ausgaben.

da du wohl nicht nur eine feste frequenz ausgeben willst solltest
du deinen ansatz ändern.
bei 10 khz würden z.b. 50 ausgaben aus einer 256 byte-tabelle reichen
-> 500 khz für timer

alle 2 µs erfolgt eine neue ausgabe. du hast einen zähler mit 2 byte
und einen additionswert, der deiner frequenz entspricht.
das high-byte des zählers ist deine tabellenposition, low-byte
sozusagen die nachkommastellen.
bei einem großen additionswert werden in der tabelle positionen
übersprungen, bei kleinen mehrfach ausgegeben.

dadurch erhälst du einen recht sauberen verlauf mit fester 
prozessorauslastung.

hoher takt und assembler (evtl. c mit "naked" interrupt) sind
von vorteil.

gruß hans

von Andi (Gast)


Lesenswert?

Vielen Dank an alle,

echt super von euch... Die Seite ist Top, Minimalbeschaltung ohne die 
Schnittstellenkonvertierung, hatte ich auch so vor, allerdings dann über 
USB und Buspowered.

@Hans:
Hört sich sehr Interessant an, allerdings versuche ich gerade dein 
posting zu verstehen und such mich schlau aber irgendwie verstehe ich ab
>alle 2 µs erfolgt eine neue ausgabe.
leider nicht alles. Auch wenn ichs gern verstehen würde.
Also ich hab ein TimerInt alle 2µs bei 500kHz. Ich habe ein 16bit Timer 
und ein Additionswert. (Additionswert==Schrittweite?) Was genau 
entspricht meiner Frequenz? Und meinst du da die Ausgangsfrequenz?

>das high-byte des zählers ist deine tabellenposition, low-byte
>sozusagen die nachkommastellen.
>bei einem großen additionswert werden in der tabelle positionen
>übersprungen, bei kleinen mehrfach ausgegeben.

Hört sich sehr interessant und auch für mich sehr relevant an, aber ich 
versteh das nicht so ganz. Kanns du das vielleicht näher erläutern?

>dadurch erhälst du einen recht sauberen verlauf mit fester
>prozessorauslastung.

Da wäre ich ein Fan von :-)

Vielen Dank nochmal für eure Mühe...
Netten Gruss Andi

von Falk B. (falk)


Lesenswert?

@ Andi (Gast)

>>alle 2 µs erfolgt eine neue ausgabe.
>leider nicht alles. Auch wenn ichs gern verstehen würde.
>Also ich hab ein TimerInt alle 2µs bei 500kHz.

Nein, die Endlosschleife dauert 2us.

>Ich habe ein 16bit Timer
>und ein Additionswert. (Additionswert==Schrittweite?)

Ja.

> Was genau entspricht meiner Frequenz?

Das hängt von deinem Additionswert ab. Auch als Freqeuncy Tunning Word 
bekannt, siehe DDS.

>versteh das nicht so ganz. Kanns du das vielleicht näher erläutern?

Lies das Tutorial von Analog Devices und denk drüber nach. Ja, das 
dauert ein wenig.

MFG
Falk

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.