Tonerzeugung durch PWM

OP #2799922
Hallo
in einem Prg zur Wiedergabe von Musik(Noten) habe ich folgendes 
gefunden:

Die Frequenz für ein C berechnet sich aus:
     f = 8.176 Hz * (2^Oktave)
   Ein Dis berechnet sich aus:
     f = 9.723 * (2^Oktave)

Es waren auch die Stellen bei WIKI zur Oktave und bei Senkspiel 
angegeben.
Noten werden dann damit angegeben: z.B.

/* 1. Oktave */
  1953/8.176,
  1953/8.662,
  1953/9.177,

Für die Tonhöhe und zur Berechnung wird das angegeben:

Der Timer kann von 1 bis 256 zählen. Die Timer-Werte müssen also in dem 
Intervall landen:
     1953/8.176 = 238 (niedrigster Ton C0)
     1953/(2*15.434) = 63 (höchster Ton H1)

Könnte mir jemand erklären, wie der Zusammenhang ist.
Wenn ich z.B. feste Frequenzen wie 100Hz, 1000KHz und 10Khz erzeugen 
will, wie muss das aussehen? Wie kann ich die Tohnöhe ermitteln?
Wenn ich Tonhöhe mit einem Generator (Sinus/Rechteck) vergleiche, kommen 
ganz andere Töne zustande. Sie klingen anders und die Tonhöhe kann man 
durch die unterschiedliche Kurvenform sehr schlecht vergleichen. Beim 
BOT wird der PWM durch ein Sarry.Key-Filter (Tiefpass) (2) geschickt.
achim
Gast #2799994
Achim Seeger schrieb:
> Wie kann ich die Tohnöhe ermitteln?
> Wenn ich Tonhöhe mit einem Generator (Sinus/Rechteck) vergleiche, kommen
> ganz andere Töne zustande.

Das liegt an Dingen wie Klangfarbe, Spektrum, Oberwellen. Zur 
Bescheibung von Tönen reicht die Angabe der Frequenz nicht aus.
Gast #2800036
Hi

Deine Angaben sind etwas mangelhaft. Man kann entweder mit PWM ein 
sinusähnliches Signal erzeugen und filtern oder ein Rechtecksignal so 
filtern, das nur noch die Grundfrequenz übrig bleibt. Dafür wäre dann 
CTC ausreichend.

Was trifft nun bei dir zu?

MfG Spess
OP #2800090
Nehmen wir die einfachste Sache an. Einfach mit PWM eine Frequenz 
erzeugen. Sinusähnlich reicht. Am Filter kann ich nichts mehr machen,der 
ist vorhanden.
Mit den Angaben oben wird ein Ton erzeugt. Die Tonerzeugung geht so. 
Stehen die Zahlen (Angabe Noten) im direkten Zusammenhang zur Tönhöhe?
achim
Gast #2800145
Hi

>Mit den Angaben oben wird ein Ton erzeugt. Die Tonerzeugung geht so.
>Stehen die Zahlen (Angabe Noten) im direkten Zusammenhang zur Tönhöhe?

Ich habe die Zahlen aus deinem Eröffnungspost mal nachgerechnet. Die 
Berechnung der Timer-Werte passen zu einem 8-Bit-Timer im CTC-Mode mit 
einem Timertakt von 3,9063 kHz. Das entspricht einem Vorteiler von 256 
bei einem Controllertakt von 1MHz oder Vorteiler 1024 bei 4MHz.

Die 1953 errechnen sich aus Controllertakt/(2xVorteiler)

Die genauen Hintergründe findest du im Datenbalatt deines Controllers 
unter Timer->CTC.

MfG Spess
#2800240
Achim Seeger schrieb:
> Einfach mit PWM eine Frequenz
> erzeugen. Sinusähnlich reicht.

Das ist eigentlich ein Widerspruch.

Um einfach (mit der PWM-Einheit eines Timers) eine Frequenz (Rechteck) 
zu erzeugen, stellt man die Betriebsart auf PinToggeln und CTC ein und 
verändert mit dem Compare-Wert die (halbe) Periodendauer und somit 
sekundär die Frequenz.

Um Sinus oder andere Kurvenformen zu erzeugen, lässt man den Timer eine 
möglichst hohe (feste) Trägerfrequenz erzeugen und moduliert in einem 
Vielfachen der gewünschten Frequenz mittels Compare-Wert den Tastgrad, 
legt also während einer Periode mehrere Samples in das Compare-Register, 
die die Kurvenform abbilden. Das nachgeschaltete Filter (Tiefpass reicht 
meist) filtert dann die Trägerfrequenz aus, wodurch nur noch die per 
Tastgrad modulierte Kurvenform niedrigerer Frequenz übrig bleibt.

...
OP #2800356
Hallo Hannes
danke dir für deine Antwort. Habe im Netz weiter gesucht, z.B. im WIKI 
PWM. Das mit dem einfachen Rechteck und Toggeln ist damit klar.
Wenn ich aber einen Sinus erzeugen will, ist es sehr viel Aufwand. Zum 
Prinzip habe ich etwas gefunden. Leider sind die Beispiele meist in ASM. 
Kennst du viellleicht eine Seite um die Sache besser zu verstehen oder 
etwas in C.
achim
#2800682
Achim Seeger schrieb:
> Leider sind die Beispiele meist in ASM.

Meine auch:
http://www.hanneslux.de/avr/divers/melody/index.html

> Kennst du viellleicht eine Seite um die Sache besser zu verstehen oder
> etwas in C.

Leider nicht, für C bin ich zu doof, ich mach's in ASM, das ist 
wenigstens eindeutig und birgt daher die wenigsten Missverständnisse.

Du könntest Dir aber mal den Melodieplayer von Elm-Chan anschauen, der 
ist glaube in C programmiert und sehr leistungsfähig.

...
#2800695
Achim Seeger schrieb:

> Wenn ich aber einen Sinus erzeugen will, ist es sehr viel Aufwand. Zum
> Prinzip habe ich etwas gefunden. Leider sind die Beispiele meist in ASM.
> Kennst du viellleicht eine Seite um die Sache besser zu verstehen oder
> etwas in C.

Allerdings klingt ein einfacher Sinus auch nicht wirklich wahnsinnig 
viel besser als eine Rechteckschwingung.
Für einen schönen Streichersound muss man dann eben doch mehr Aufwand 
treiben.

Belass es bei Rechteck. So wie die Sache aussieht, ist das schon 
Herausforderung genug, bis dann endlich mal 'Alle meine Entlein' aus dem 
Lautsprecher kommen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.