Hallo zusammen,
ich bin gerade dabei ein PWM Signal zu erzeugen. Das Signal an sich ist
aber nicht mein Problem.
Das Problem liegt darin, dass ich gerne jede beliebige Frequenz
einstellen möchte.
Ist das generell möglich?
Wenn ja, wie sieht das dann in C aus?
Danke für eure Hilfe!
Steffen wrote:
> ich bin gerade dabei ein PWM Signal zu erzeugen. Das Signal an sich ist> aber nicht mein Problem.> Das Problem liegt darin, dass ich gerne jede beliebige Frequenz> einstellen möchte.> Ist das generell möglich?
Generell nein.
Jede beliebige Frequenz kann keine Hardware auf der ganzen Welt, Du mußt
sie schon in Bereich und Auflösung eingrenzen.
Mußt Du nur die Frequenz einstellen, dann ist PWM falsch.
Mußt Du Frequenz und Pulsweite einstellen, dann gehts aufm AVR nur in
Software.
Peter
>Ist das generell möglich?
Mit ein paar Analogbausteinen problemlos.
>Wenn ja, wie sieht das dann in C aus?
Gar nicht:-) Ist ja schließlich Analogtechnik.
Falls du da auf einem Mikrocontroller machen möchtest, hängt das
C-Programm sehr stark vom gewählten Modell ab. Wie soll man das
beantworten? Ausserdem haben die allemreisten Controller so etwas wie
ein diskretes Register zur Frequenzeinstellung. Das hat dann 256 oder
auch 32768 diskrete Werte, vielleicht in Kombination auch mehr.
"Beliebige" Frequenzen lassen sich damit trotzdem nicht einstellen.
Oliver
Danke schon mal für eure Antworten.
Aber meines Wissens kann ich vorgeben (beim ATMega32)ob ich ein 8, 9
oder 10 Bit PWM Signal haben will. Auf diese Weise ist meine Frequenz ja
schon fast festgelegt. Nun kann ich sie nur noch über den Prescaler
teilen.
Aber ist es vielleicht irgendwie möglich auch ungefähr 1,5 kHz
einzustellen. Sprich einen Wert der nicht in dem Teilungsverhältnis
liegt?
1. Welcher µC ?
2. Was verstehst Du unter "beliebiger Frequenz" ?
3. Geht es um's Tastverhältnis oder Anzahl Peaks ?
4. Warum muß die Frequenz "beliebig" sein ?
> Mußt Du Frequenz und Pulsweite einstellen, dann gehts aufm AVR nur in> Software.
Das stimmt nicht. Einige AVRs bieten bei ihre 16-bit-Timern die
Möglichkeit, einen TOP-Wert einzustellen. Damit kann ich ihn im
16-bit-Bereich bis zu jedem beliebigen Wert zählen lassen und damit die
PWM-Frequenz im Prinzip verstellen. Man muß natürlich den OCR-Wert immer
mit anpassen, wenn sich die Frequenz, aber nicht das Tastverhältnis sich
ändern soll.
> 1. Welcher µC ?
ATMega 32
> 2. Was verstehst Du unter "beliebiger Frequenz" ?
War vielleicht von mir ein wenig schlecht ausgedrückt.
Ich meinte damit ob ich die Frequenz der PWM die durch die Bit-Auflösung
und den Prescaler definiert ist, z.B. über irgendein Vergleichsregister
beeinflussen kann.
> 3. Geht es um's Tastverhältnis oder Anzahl Peaks ?
Es geht erstmal nur um die Frequenz des PWM-Signals!
> 4. Warum muß die Frequenz "beliebig" sein ?
Ich brauche eine Frequenz im Bereich von 1,5 kHz und diese kann ich
nicht über die Bitauflösung und den Prescaler einstellen.
> Aber meines Wissens kann ich vorgeben (beim ATMega32)ob ich ein 8, 9> oder 10 Bit PWM Signal haben will. Auf diese Weise ist meine Frequenz> ja schon fast festgelegt. Nun kann ich sie nur noch über den Prescaler> teilen.
Du kannst auch einen der WGM-Modi 8 bis 11, 14 oder 15 verwenden. Das
sind dann die Modi, in denen du genau einstellen kannst, wie weit er
zählen soll, bevor der Zählerwert auf 0 gesetzt (bei "fast PWM") oder
die Zählrichtung umgekehrt ("phase correct PWM") wird.
> Aber ist es vielleicht irgendwie möglich auch ungefähr 1,5 kHz> einzustellen.
Also willst du gar nicht "jede beliebige Frequenz" einstellen, sondern
eine ganz bestimmte. Warum muß es eigentlich gerade die Frequenz sein?
> Sprich einen Wert der nicht in dem Teilungsverhältnis liegt?
Ob der da liegt, hängt auch von der Taktfrequenz deines Mega32 ab.
Ich brauch nun mal im Moment noch diese Frequenz.
Mit beliebiger wollt ich mich auch einfach mal schlau machen, ob es
generell möglich ist. Weil wenn nicht muss ich das in Zukunft schon
früher brücksichtigen!
Meine Taktfrequenz liegt bei 16 MHz.
Wie muss ich das mit dem WGM Modi genau verstehen?
Könntest du mir dazu ein kurzes Programm Beispiel geben?
Die Frage ist, brauchst Du nur die Frequenz oder auch die PWM ?
Wenns nur die Frequenz ist, also Tastverhältnis 1:1, dann nimm einfach
den Toggle on Compare Mode.
Peter
Bei 16-bit-PWM ist der TOP-Wert 65535. Bei 10 bit ist er 1024, u.s.w.
Du kannst aber auch bestimmen, daß der TOP-Wert ein Register-Wert ist.
Dann kannst du jeden Wert von 0 bis 65535 einstellen.
Welchen WGM du nimmst, kommt dann drauf an, ob du "fast PWM", "phase
correct PWM" oder "phase and frequency correct PWM" brauchst. Was die
bedeuten, steht im Datenblatt. Außerdem mußt du entweder das
OCR1A-Register oder das ICR1-Register auswählen, d.h. du mußt entweder
einen der zwei PWM-Kanäle des Timers oder die input-capture-Funktion
opfern. Wenn du keine von beiden brauchst, ist es egal. Dann wählst du
den entsprechenden Modus aus und schreibst in das OCR1A- oder
ICR1-Register den Teiler, den du für deine Frequenz haben willst. Im
Modus 14 (fast PWM mit ICR1 als TOP) könntest du den Prescaler auf 1
einstellen und das ICR1-Register auf 10666. Dann wäre die PWM-Frequenz
ca. 1,5001 kHz. Wenn's nicht ganz so genau sein muß, kannst du auch
einen weniger krummen Wert (10000 oder 10240 oder sowas) verwenden. Dein
OCR-Wert für die Pulsweite muß dann natürlich auch an diesen Bereich
angepaßt werden.