Micha Arl schrieb:
> Das Datenblatt hab ich mittlerweile x-mal gelesen
...aber offensichtlich nicht verstanden.
Genauer: dir fehlt es vollständig am Verständnis der Funktionsweise der
"fortgeschrittenen" PWM-Modi, du kannst dich nicht von den primitiven
Denkmustern des Fast-PWM lösen.
Sozusagen als Folgeschaden dieses grundsätzlichen Unverständnisses bist
du auch nicht in der Lage, eine geeignete Testumgebung aufzusetzen. Das
zeigt sich ganz eklatant in der Wahl der Interruptquelle für deine
"Synchronpulse", anhand derer du die Phasenkorrektheit prüfen willst...
...
Also: Sowohl der PhaseCorrect- als auch der Phase&FrequencyCorrect-Modus
sind "dual slope" Modi. Das ist der springende Punkt! Und d.h.:
innerhalb eines PWM-Zyklus wird einmal von BOTTOM bis TOP gezählt und
dann wieder herunter von TOP bis BOTTOM.
Dieser Sachverhalt impliziert, daß es für jeden beliebigen Wert in den
OCR-Registern (mit Ausnahme von BOTTOM und TOP) zwei Matches während
eines PWM-Zyklus geben muss und darüber hinaus, daß deren
Phasenwinkel zueinander unmöglich konstant sein kann. Tatsächlich ist
die Existenz der zwei Sonderfälle OCR=BOTTOM und OCR=TOP der Tatsache
geschuldet, daß der Phasenwinkel der beiden Matches dann 0 bzw. 2*Pi
beträgt, weshalb sie im PWM-Zyklus schlicht auf den gleichen Moment von
dessen Periode fallen.
Wenn man das soweit erstmal kapiert hat, wird sofort klar, daß die
"Phasenkorrektheit" oder "Frequenzkorrektheit" in den Namen der PWM-Modi
sich unmöglich auf die Lage des/der Compare-Matches beziehen kann.
Sie beziehen sich natürlich vielmehr auf die Zeitpunkte, in denen der
Zähler BOTTOM oder TOP erreicht (PhaseCorrect-Modus) oder sogar nur auf
den Zeitpunkt, wenn der Zähler BOTTOM erreicht
(Phase&FrequencyCorrect-Modus).
Deine einzige Möglichkeit für einen sinnvollen Test des
Phase&FrequencyCorrect-Modus ist also einen Interrupt zur Erzeugung des
Synchronsignals zu benutzen, der in dem Moment ausgelöst wird, wenn der
Zähler den BOTTOM-Wert erreicht. Nun ist (sicher nicht ganz zufällig :o)
die Sache so, daß ausgerechnet in diesen fortgeschrittenen PWM-Modi der
Overflow-Interrupt des Timers just in diesem Moment ausgelöst wird...
Der Sinn dieser Sache ist aber eigentlich nicht, dir ein schickes
Oszi-Bild liefern zu können (obwohl das auch geht... :o), sondern du
sollst deine verfickten OCR- und ICR-Register in dieser ISR mit einem
neuen Wert versehen!
Nix anderes steckt nämlich hinter diesem hochtrabendenden Gelalle von
Phasen- und Frequenzkorrektheit. Der Moment der Übernahme der Änderungen
der Registerwerte in den Zählbetrieb.
Und nun glaub ja nicht, daß Änderungen in der ISR unverzüglich dorthin
übernommen werden. Nein, tatsächlich ist es so, daß im Moment der
Auslösung des Interrupts (etliche Takte vor Eintritt in die ISR) die
zuletzt davor gesetzen Werte gerade erst für den aktuellen PWM-Zyklus
wirksam wurden.
Die ISR stellt also nur die früheste zuverlässige Möglichkeit dar, denn
nächsten PWM-Zyklus (u.U. noch weit in der Zukunft!) nach eigenen
Wünschen zu modifizieren. Der gerade laufende ist in diesem Moment
bereits unwiederbringlich abgehakt.
Wichtig ist dieser Sachverhalt insbesondere für Regler. Das ist nämlich
eine "schicke" Extra-Totzeit von einem vollen PWM-Zyklus, also bei
Phase&FrequencyCorrect sogar variabel. Das kann bei bestimmten
Anwendungen schon mal extrem störend sein. Vor allem, wenn man beim
Reglerdesign blöderweise nicht berücksichtigt, daß sie existiert...