www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sinus per DDS erzeugen


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

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

Gruß
Jadeclaw.

Autor: Michael Lenz (hochbett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß,
  Michael

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.