Sinus-Ton per PWM, Frequenz verändern.

OP #3337751
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ß
@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"
OP
Danke schon mal für die Antworten.
Bitte NICHT am DTMF festmachen, das hatte ich nur als Einstieg 
benutzt.

Mir geht es eher darum, wie man aus einer vorgegebenen Sinus- oder wie 
auch immer, diese Schwingung in der Tonhöhe verändern kann.
(Firma: fritzler-avr.de)
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.