PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Töne über PWM?



C_Classic
06.06.2009, 14:22
Hallo,
ich möchte einen Ton mit dem Atmega8 auf einem der PWM-Ports ausgeben. Nicht mit der Funktion "Sound", sondern über einen der Timer mit PWM.
Mein Problem liegt darin, dass wenn ich einen Lautsprecher an den PWM-Ausgang gegen GND lege(was ja so stimmen müsste) und eine PWM-Frequenz festlege, der Ton immer gleich ist. Egal welche PWM-Frequenz ich angebe.
Muss da noch irgendwas an der Hardware geändert werden? Momentan nur VCC/GND und der Lautsprecher an PB.0 gegen GND.
Wie muss der Code aussehen? Eigentlich reicht doch ein Programm, dass mir einen Timer als PWM-Timer definiert und dann die "Frequenz" festlegt.
Vielen Dank für eure Antworten schon mal im vorraus.

021aet04
06.06.2009, 15:00
Du darfst nicht die Frequenz ändern, sondern den Tastgrad (Verhältnis Puls-Pause)

C_Classic
06.06.2009, 15:04
Wie meinst du das, 021aet04? Sind die PWM-Frequenz und der Tastgrad nicht das Gleiche?
Könntest du mir bitte ein Code-Beispiel geben?

021aet04
06.06.2009, 15:19
Nein das ist nicht das Gleiche. Hier ist PWM beschrieben. http://www.rn-wissen.de/index.php/Pwm
1Hz =1 Periode pro Sekunde

C_Classic
06.06.2009, 16:53
OK... Aber wie lege ich nun einen Ton fest? Kann mir jemand mal einen Beispielcode schreiben? (soll wenn möglich Hardware-PWM sein).
Ich bekomme es zwar hin, eine LED über PWM zu "dimmen", aber wenn ich nen Lautsprecher hinhäng bekomm ich bei jedem angegebenen PWM-Wert den gleichen Ton bzw. einen sehr ähnlichen.

Thomas$
06.06.2009, 16:59
PWM PUlSWEITENMODULATION es regelt die pulsweiten und nicht die frequnz.
wenn du töne erzeugen willst must du das pwm sinus förmogig mach also laut (länger an als aus) und dann wieder leise (länger aus als an)

du must dier aber vorher irgendwie sinus nutzen können oder ne tabelle nutzen.
um zusehen was dein pwm macht solltest du die pwm frequens runternehem und mit deiner Sound karte und einem soudkartenoszi programm anschauen oder man hat ein oszi

Sauerbruch
07.06.2009, 07:52
Moment, moment, moment...

Mit "Normalem" PWM hast Du ein Rechtecksignal mit konstanter Frequenz, dessen Impuls-Pausen-Verhältnis variiert werden kann. Das macht den Ton u.U. laut und leise - aber ändert nix am Ton.

Um verschiedene Tonhöhen zu erzeugen, muss der Timer im "CTC"-Modus betrieben werden. CTC heißt "Clear Timer on Compare". Heißt also, dass er von 0 bis zum Wert im OCR-Register hochzählt, und beim Erreichen dieses Wertes auf 0 zurückgesetzt wird. Bei jedem Rücksetzen wird der OC-Pin getoggelt. Somit wird der Ton umso höher, je niedriger der OC-Wert ist.

Die Formel kann man sich überlegen, sie heißt f = Xtal/(Prescaler * OCR * 2).

Bascom (zumindest meine Version) unterstützt den CTC-Modus nicht, das musst Du direkt auf Registerebene lösen.

Klar? :-)

Thomas$
07.06.2009, 11:00
ich meinte damit aus den Rechtreck pulsweiten ein sinus zu machen

C_Classic
07.06.2009, 15:15
Erstmal danke für deine Antwort Sauerbruch!
Habs zwar noch nicht ganz verstanden, aber ich hab mal nach Bascom und CTC gesucht und das hier gefunden: https://www.roboternetz.de/phpBB2/viewtopic.php?p=359346
Das ist doch das, was du meinst?

Sauerbruch
07.06.2009, 16:03
Genau. Mit welchem Controller arbeitest Du denn, welchen Timer verwendest Du und in welchem Bereich sollen die Frequenzen liegen?

Thomas$
07.06.2009, 16:04
"ich möchte einen Ton mit dem Atmega8 auf einem der PWM-Ports ausgeben. "

C_Classic
07.06.2009, 16:17
Genau, ein Atmega8. ;)
ich würde gerne Timer1 nehmen, denn das müsste doch der 16-Bit Timer sein. (oder ist das dann bei dieser Methode egal)
Der Frequenz-Bereich ist nicht so wichtig, die Töne sollen jedoch vom Menschen hörbar sein. (Für Melodien oder Töne für kleine Spiele und so)

yaro
07.06.2009, 17:33
Sauerbruch hat volkommen Recht. Das PWM muss im CTC-Modus verwendet werden.
Hörbare frequenzen sin von ca. 8Hz bis ca 20000Hz.
Eine Rechnung hat Sauerbruch auch schon geliefert, nach ihr kannst du ann die Frequenzen einstellen.
Wie du den Timer einstellst, d.h. wie du welche Register setzten musst, steht im datenblatt: http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf (kapitel 16bit timer/counter 1)

Gruß, Yaro

stefan_Z
08.06.2009, 23:09
Edler gehts mit einem ATMEGA2560 z.B...
Da kann man zwei Timer an einem Pin kombinieren und damit modulieren... Hab von Frequzenkram null Ahnung, hatte ich nur zufällig gelesen...
http://www.atmel.com/dyn/resources/prod_documents/doc2549.PDF
Das ganze heißt "Output Compare Modulator (OCM1C0A)"