Forum: Mikrocontroller und Digitale Elektronik Tonerzeugung durch PWM


von Achim S. (achims)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

Was für eine Kurvenform willst du erzeugen? Rechteck oder Sinus?

MfG Spess

von Achim S. (achims)


Lesenswert?

Leider kann ich die Kurvenform nicht mehr verändern, da der Tiefpaas 
fertig im BOT ist. Wahrscheinlich wird eine sehr verwaschene Form 
erzeugt. Es geht mir mehr um die Frequenz.
achim

von ... (Gast)


Lesenswert?

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.

von Achim S. (achims)


Lesenswert?

Fürs erste genügt mir schon die Freuquenz ohne Oberwellen oder anderes. 
Durch die PWM wird eine bestimmte Tönhöhe mit Tiefpass erzeugt. Leider 
ist mir der Zusammenhang mit den Angaben im Prg nicht klar.
achim

von Spess53 (Gast)


Lesenswert?

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

von Achim S. (achims)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Achim S. (achims)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Karl H. (kbuchegg)


Lesenswert?

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.

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.