Sinus-Ton per PWM, Frequenz verändern.

#3337751
Lesenswert?

Ich möchte einen "Synthesizer" für ein oder zwei Töne bauen um zum 
Beispiel DTMF-Töne auszugeben. (Ein genauer Zweck besteht nicht, mir 
geht es eher um die Grundlagen)

Ich benutze den mega32 @16 MHz, Timer 1 im Mode 14 (Fast PWM) ohne 
Prescaler.
Der Timer läuft bis ICR1 = 363, das ergibt ca. 44,1 kHz als Frequenz. 
Eine Sinustabelle mit 256 Elementen habe ich. Nach jedem Timer-Overflow 
wird das nächste Element aus der Tabelle ins Capture-Register 
geschrieben. Mit angeschlossenem Tiefpass kommt auch exakt die 
berechnete Frequenz am PWM-Pin raus. (86 Hz) Ganzahlige Vielfache 
hiervon sind auch kein Problem, nur jeden zweiten oder dritten Wert aus 
der Tabelle nehmen. Soweit ist noch alles klar.

Ich möchte jetzt aber auch "beliebige" Frequenzen erzeugen, also zum 
Beispiel 100 Hz.
Wie geht man da vor? Den Timer nicht mehr ganz so weit zählen lassen und 
den Capture-Wert entsprechen anpassen?
(Es gibt hier so ein geniales Synthesizer-Projekt, leider steige ich da 
durch die Assemblerroutinen nicht durch)

Vielen Dank für jede Hilfe/Gedankenanstoß
#3337793
Lesenswert?

@Martin Kreiner (maart)

>Ich möchte einen "Synthesizer" für ein oder zwei Töne bauen um zum
>Beispiel DTMF-Töne auszugeben. (Ein genauer Zweck besteht nicht, mir
>geht es eher um die Grundlagen)

OK.

>Ich benutze den mega32 @16 MHz, Timer 1 im Mode 14 (Fast PWM) ohne
>Prescaler.
>Der Timer läuft bis ICR1 = 363, das ergibt ca. 44,1 kHz als Frequenz.

DTMF in CD-Qualität! Das hat Stil!

>Ich möchte jetzt aber auch "beliebige" Frequenzen erzeugen, also zum
>Beispiel 100 Hz.
>Wie geht man da vor?

Siehe DDS.

Beitrag "Re: DDS sample-Auswahl Rundungsfehler"
(Firma: fritzler-avr.de) #3337846
Lesenswert?

Auch wenns nicht an DTMF festgemacht werden soll, les die Appnote ;)
Die DTMF Frequenz muss ja recht genau sein und da hat Atmel nen kleinen 
Trick in die Appnote gepackt.
Zudem musste den 2. ton ja nicht synthetisieren.

Der Trick kurz zusammengefasst:
Anstatt bei einer Tabelle mit 128 Einträgen mit einer 7 bit Variable zu 
zählen (und bei dieser 1, 2 ,3 oder sonstwas Schritte vor zu springen), 
wird eine 11 bit Variable genommen und von der wird auf diese 7 bit 
abgebildet.
(oder was sonst durch shiften statt division erreicht werden kann)
Gast #3338748
Lesenswert?

Martin Kreiner schrieb:
> (Ein genauer Zweck besteht nicht, mir
> geht es eher um die Grundlagen)

Ah..ja.
Dann guck mal in die Lernbetty (tibetanische Gebetsmühle...) wo die 
Ausgabe von beliebigen Tönen sprich Audio per PWM erledigt wird. Ist im 
Prinzip völlig einfach, man muß es bloß tun und einen hinreichend 
potenten µC benutzen. Die Betty hat nen ARM drin, aber du willst ja 
ohnehin nur die Grundlagen wissen.

W.S.

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