Hallo, ich weiß dieser Themenbereich wurde schon oft hier dikutiert, aber für das von mir geschilderte Verhalten habe ich noch immer keine Lösung gefunden. Es handelt sich um eine LED Ansteuerung mit dem MSP430F149 per PWm vom TimerB mit als Hardware PWM. Also die Pins 4.0...4.7. Er läuft mit 8MHz. Der Testcode zeigt nur die Funktionalitäten für die PWM generierung. Timer A erzeugt Interrupts, bei denen die neuen Compare Werte ins CCRx Register gelegt werden. Timer B erzeugt die PWM. Soweit läuft alles gut, nur gibt es "Ausreißer" beim Helligkeitsverlauf. Verwednet wird eine Wertetabelle. Willkürlich scheinbar blitzen die LED auf. Das passiert auch, wenn ich zum Comparewert ändern, die Main benutze! oder im TimerA nur die Laufvariabel hochzähle und die Werte direkt in der timerB ISR setze. Immer das gleiche Verhalten. Nun bin ich nicht der große Programmierer und mir fällt nix mehr ein. Ich hoffe mir kann hier jemand mit einem Blick auf den Code helfen oder Hilfestellung geben. gerne gebe ich dann noch mehr Auskünfte dazu! Danke!! Gruß
Ist das ein Schreibfehler?
1 | void init_Timer_B(void) |
2 | {
|
3 | |
4 | TBCCR0 = 65535-1; // PWM Periode-1 |
5 | ...
|
In diesen Falle (CCR0 = 65534) würde ein CCRx = 65535 aus der Tabelle ja nie erreicht werden können...
Hallo, nein kein Schreibfehler. Stimmt, was würde aus deiner Sicht passieren? Danke fürs Feedback! gruß
Der Timer B hat ein Latch (Zwischenspeicher) für die TBCCRn Register. Diese aktiviert man in dem man die CLLD-Bits im jeweiligen TBCCTLn Register auf b01 setzt. Wenn der Latch nicht aktiviert ist, ist man nie ganz sicher ob man den nächsten PWM-Wert vor oder nach dem Einschaltvorgang setzt. Wenn der Zeitpunkt zu früh liegt und der PWM-Wert niedriger ist, verpasst der Timer den Schaltzeitpunkt und die LED ist dann länger als eine ganze Periode aus. Dasselbe kann andersherum passieren, die LED ist dann eine länger als eine Periode an, was sich als Blitzer der LED äußert. Wenn der Latch aktiviert ist, wird der neue Wert im TBCCRn-Register nicht verwendet bevor der Timer einmal über die 0 gelaufen ist. Damit ist sichergestellt, dass keine Periode verpasst werden kann.
wie würde man den diesen PWM Generator realisieren, wenn man für Timer A kleine Zeiten wählt. und zwar so kleine zeiten, dass ein Wechsel der CCR-werte MEHRMALS erfolgt, bevor die erste Periode durchlaufen wurde. normalerweise würden ja die Werte immer wieder überschrieben werden, sodass nur der Wert übernommen wird, der im Moment des Nulldurchganges gesetzt wurde
Hast du Langeweile oder ein aktuelles Problem? def leppard schrieb: > wie würde man den diesen PWM Generator realisieren Gar nicht! Der MSP kann PWM in HW. Im FUG findest du alle Infos zum OUTMODE.
Anscheinend hat es keiner verstanden. Ein Beispiel könnte hilfreich sein.
setze beim int von CCR0 die neue Pulsbreite und Frequenz. Wenn CLLD_1 gesetzt ist, dürfte für die nächste Periode diese eingestellt sein
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.