Sinus am Lautsprecher ausgeben (Assemler, ATMEGA32)

Gast #2217501
Lesenswert?

Hallo,

ich möchte einen Sinuston oder zumindest einen stark sinus-ähnlichen Ton 
mittels ATMEGA32 in Assembler generieren. Es soll kein reiner Rechteck 
sein, da der Ton dann absolut grausig kling.

Weitere Anforderungen: Die Tonhöhe soll wählbar sein. Und zwar zwischen 
500 und 1000Hz. Weiter soll die Dauer des Tones variabel sein. Und zwar 
zwischen 24 und 1200ms.

Ist das realisierbar? Habe ein Eval-Board mit ATMEGA32@16MHz.

Oder gibt es Tongenerator ICs, die programmierbar sind? Z.B. via 1-Wire?




Gruß
Cheffe
#2217983
Lesenswert?

So als Anregung: Nimm doch einfach eine Tabelle mit einer Handvoll 
berechneter Werte (z.B. 15). Diese legst Du in den Speicher hinein. Ich 
kenne die Adressierung des Mega32 nicht, aber angenommen, Deine Daten 
fangen bei $FFF0 an, und reichen bis $FFFF, so fragst Du die Werte aus 
dem Speicher mit $FFFX ab. X ist dabei ein Zählerwert. Dadurch, dass Du 
das $FFF nicht inkrementierst, springst Du beim Übertrag automatisch auf 
$FFF0 zurück. Deine Werte werden damit in einer Schleife gelesen und du 
erhälst keine Verzögerung durch den Sprung auf die Basisadresse.

Aschließend (soweit der Mega32 dafür überhaupt genügend Speicher hat) 
lässt Du das Signal durch einen IIR-Filter laufen. Mit Matlab kannst Du 
die Koeffizienten dafür berechnen lassen.

Schnell wird das mit Sicherheit nicht, aber im kHz-Bereich ist auf 
jedenfall was machbar.

> Oder gibt es Tongenerator ICs, die programmierbar sind? Z.B. via 1-Wire?

Braucht es nicht. Zur Not gibt es den MAX7400
#2217990
Lesenswert?

Cheffe schrieb:
> Hallo,
>
> ich möchte einen Sinuston oder zumindest einen stark sinus-ähnlichen Ton
> mittels ATMEGA32 in Assembler generieren. Es soll kein reiner Rechteck
> sein, da der Ton dann absolut grausig kling.
>
> Weitere Anforderungen: Die Tonhöhe soll wählbar sein. Und zwar zwischen
> 500 und 1000Hz. Weiter soll die Dauer des Tones variabel sein. Und zwar
> zwischen 24 und 1200ms.

Das Verfahren, das hier üblicherweise eingesetzt wird, heisst "Direct 
Digital Synthesis" DDS.

Erklärung:
http://www.analog.com/static/imported-files/tutorials/450968421DDS_Tutorial_rev12-2-99.pdf

Mit einem AVR sollte es wohl möglich sein, ein dsPIC wäre aber die 
bessere Architektur für solche Sachen.

fchk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren