Forum: Mikrocontroller und Digitale Elektronik Sinus am Lautsprecher ausgeben (Assemler, ATMEGA32)


von Cheffe (Gast)


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

von holger (Gast)


Lesenswert?

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

Ja, per PWM, per R-2R Netzwerk oder einen SPI oder I2C DAC.

von bitte löschen (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist meine aktuelle Lösung dafür. Das ganze ist noch in Entwicklung.

von Cheffe (Gast)


Lesenswert?

Hallo, danke für die Antworten. Ich könnte ja auch einen Rechteck 
ausgeben und dann durch ein SC-Filter-IC schicken. Tiefpass fünfter 
Ordnung reicht. Gibt es günstige, die man als Privatmensch einkaufen 
kann und die nach Möglichkeit mit nur einer positiven 
Versorgungsspannung auskommen?


Gruß
Cheffe

von bitte löschen (Gast)


Lesenswert?

Habe gerade noch ein paar Unstimmigkeiten in meinem Code entdeckt. :-O
Werde mich die Tage noch darum kümmern.

von Martin S. (sirnails)


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

von Michael A. (Gast)


Lesenswert?

Such doch mal nach "Jesper miniDDS" und guck hier:
Beitrag "Re: ASM von MiniDDS in WinAVR kompilieren. Wie?"
9 Zeilen Assembler

von Frank K. (fchk)


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

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.