Eine Verständnisfrage zum integrierten PWM-Counter bei den AVR-Prozessoren Der Counter inkrementiert und dekrementiert den Zählerwert bis zum eingestellten Max solange der Counter aktiv ist. Beim erreichen des Wertes im Compare Register wechselt der zugehörige Port automatisch von H nach L oder umgekehrt. Entstehen dadurch Unterbrechnungen / Verzögerungen im Hauptprogramm oder kann man diesen Counter als autark betrachten. Muss der Zähler unterbrochen werden um den Wert im Compare-Register zu verändern oder kann das während des laufenden Zählers erfolgen?
Ein Hardware PWM Generator läuft völlig autark mit der eingestellten Periode und dem Dutycycle, solange, bis er von dem Programm gestoppt wird. Es entsteht keine Prozessorlast
>Muss der Zähler unterbrochen werden um den Wert im Compare-Register >zu
verändern oder kann das während des laufenden Zählers erfolgen?
Nein. Allerdings kann es zu interessanten Effekten kommen, wenn der
neue Vergleichswert schon überschritten wurde.
"interessante Effekte" können z.b. das abrauchen von endstufen sein :o)
Laut Datenblatt wird der OCR-Wert aber doch gelatcht und dann synchronisiert übernommen, oder? Zitat: "Note that in the PWM mode, the 10 least significant OCR1A bits, when written, are transferred to a temporary location. They are latched when Timer/Counter1 reaches TOP. This prevents the occurrence of odd-length PWM pulses (glitches) in the event of an unsynchronized OCR1A write."
> Laut Datenblatt wird der OCR-Wert aber doch gelatcht
Schon, aber das beseitigt nicht alle Probleme.
Wenn du den OCR Wert kleiner machst und der aktuelle Counter Stand
aber schon größer als der neue OCR Wert ist, dann zählt der
Counter munter bis zum Overflow weiter.
< munter bis zum Overflow weiter. > und von da dann wider zurück? Was färe dann falsch? Der Impuls sollte in diesem Fall ja länger werden, und so wird er etwas länger als der vorhergehende und nicht ganz so lang wie der nächste? oder verstehe ich was falsch?
Das kommt auf den PWM-Modus an: Beim CTC- und OC-Modus würde der Timer komplett durchlaufen und erst nach einem Überlauf auf den neuen Wert reagieren. Beim Phase-Correct-Mode vermutlich auch. Die damit zusammenhängenden Probleme sind aber auch im Datenblatt beschrieben (PWM-Modi...).
In den PWM-Betriebsarten sollte so was eigentlich gar nicht passieren können (es sei denn, ich habe im Datenblatt etwas falsch verstanden oder übersehen). Das Compare-Register und der TOP-Wert (unabhängig davon, wo der steht) wird beim Erreichen von TOP aktualisiert, d.h. in dem Moment, in dem entweder (Betriebsart Fast PWM) das Zählregister auf Null zurückgesetzt wird oder (Betriebsart Phase Correct PWM) der Zähler seine Zählrichtung umkehrt. Probleme kann es eigentlich nur dann geben, wenn man im CTC-Modus arbeitet.
> Was färe dann falsch? Der Impuls sollte in diesem Fall ja länger > werden, und so wird er etwas länger als der vorhergehende und nicht > ganz so lang wie der nächste? Ich sag mal so: Wenn ich eine 16 bit PWM laufen habe und ich verringere den Wert von 800 auf 400 und als Folge davon generiert mir die Hardware einen Puls der Länge 65936, dann könnte ich mir schon vorstellen, dass das je nach Anwendung der PWM zu Problemen führen kann. Das ist immerhin eine Überschreitung um das 164-fache.
??? Ich habe das so verstanden, das es 2 Register gibt die beschrieben werden müssen. Das eine als oberer Grenzwert bis zu dem der Zähler zählt um dann wieder umzukehren und zu 0 zurückzuzählen Das zweite ist das Compare register an dem der Port von L nach H oder umgekehrt schaltet? Um die Impulslänge zu verändern werde ich doch in der Regel nur den Wert des Compare-Registers ändern, also den Zeitpunkt der Umschaltung, nicht Würde ich den Wert den oberen Grenzwertes ändern, wäre ja neben der Impulsbreite auch die Frequenz verändert und das ist doch nicht Sinn der Sache oder?
@Rahul: Net ganz. Habe grad noch mal genauer nachgelesen: Wenn man einen PWM-Modus benutzt, der das Capture-Register ICRx als TOP-Value nutzt, kann es schief gehen, weil das nicht gepuffert wird! Das ist aber anscheinend die einzige Ausnahme...
>Das eine als oberer Grenzwert bis zu dem der Zähler zählt um dann >wieder umzukehren und zu 0 zurückzuzählen >Das zweite ist das Compare register an dem der Port von L nach H oder >umgekehrt schaltet? Das nennt Atmel "Phase-Correct-Mode". Die o.g. Probleme gibt es beim CTC-Mode oder wie Johnny schon meinte, wenn man das ungepufferte ICP-Register als TOP benutzt. Allerdings ändert man die Grenzwerte ja eher selten, wenn man mit einer konstanten PWM-Frequenz arbeitet, die ja durch TOP und BOTTOM festgelegt wird.
@flyingwolf: Richtig, es gibt in einigen PWM-Modi (nämlich in denen, die keinen festen TOP-Wert haben) zwei Werte, die man setzen muss. Allerdings wird man in den meisten Anwendungsfällen (mal abgesehen von Audio-Anwendungen) die PWM-Frequenz (und damit den TOP-Wert) konstant lassen. Dann braucht man sich nur noch um das Tastverhältnis zu kümmern, das mit dem entsprechenden Compare-Register eingestellt wird. Und wie oben schon angedeutet, kann das weiter oben beschriebene Problem mit dem Überlauf dann auftreten, wenn der TOP-Wert im (ungepufferten) ICR-Register steht. Wenn man einen PWM-Modus mit festem TOP-Wert (also 8-, 9- oder 10-Bit-PWM) oder einen mit OCRxy als TOP nutzt, dann kann das Problem prinzipiell nicht auftreten.
>mal abgesehen von Audio-Anwendungen
Wo finde ich was zu dem Thema?
Hab hier in letzter Zeit mehrere Threads gesehen, wo Leute (anscheinend) irgendwelche Audiosignale per PWM generieren wollen. Dabei könnte ich mir zumindest vorstellen, dass es u.U. Sinn macht, während der laufenden Anwendung Änderungen an der Frequenz vorzunehmen... (nur so ne Vermutung)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.