Forum: Mikrocontroller und Digitale Elektronik COM0A1, COM1A1, COM2A1 etc - wird per Pin sofort aktualisiert oder erst beim nächsten Zyklus?


von Robert B. (robertb)


Lesenswert?

Hallo!

Ich benutze den Phase Correct Mode des Timer2 eines ATmega168 zum 
erzeugen einer Sinuskurve.

Die obere Halbwelle erzeuge ich durch einen beliebigen Portpin auf low 
und der Timer2 PWM mit COM2A1 COM2A0 = [1 0] (Set OC2A on Compare Match 
when up-counting. Clear OC2A on Compare Match when down-counting.).

Die untere Halbwelle erzeuge ich nach dem Nulldurchgang indem ich den 
Portpin auf high setze und mit COM2A1 COM2A0 = [1 1] (Clear OC2A on 
Compare Match when up-counting. Set OC2A on Compare Match when 
down-counting.).

Das ganze fukntioniert prinzipiell auch gut. Ich erhalte mit der PWM 
einen Sinus der zwischen +5V und -5V pendelt. Allerdings setze ich die 
Sinus-Werte mit einem anderen Timer (der die Frequenz des Sinus steuert) 
asynchron zum PWM-Timer. Das führt dazu dass ich den COM2A0 umschalte 
während noch eine PWM-Periode läuft.

Folgender Ablauf:

OCR2A = 50;  // letzter PWM-Wert der oberen Halbwelle "+50 / +1V"
PIN = low;
COM2A0 = 0;
.
.
.
OCR2A = 0;  // Nulldurchgang
PIN = low;  // hier jetzt umzuschalten wäre dumm, der PWM-Timer läuft 
noch
COM2A0 = 0; // mit dem OCR2A-Wert 50, was einen Spike produzieren würde
.
.
//hier ist der Zustand irgendwann dann konstant 0V
.
OCR2A = 50;  // erster PWM-Wert der unteren Halbwelle "-50 / -1V"
PIN = high; // jetzt umzuschalten wäre gut, aber nur wenn der OC2A-Pin
COM2A0 = 1; // auch sofort auf high wechselt und nicht bis zur nächsten
            // Periode low bleibt -- DIES IST DAS PROBLEM!
.
// was passiert hier? -5V oder 0V wie gewünscht?
.
// hier irgendwann -1V
.

Problem ist wenn COM2A0 den Pin erst beim nächsten Compare-Match des 
PWM-Timers beeinflusst habe ich für den Rest der aktuellen PWM-Periode 
volle "-5V" stehen, obwohl es "0V" sein müssen um dann auf "-1V" zu 
wechseln. Das ist ziemlich daneben!

Grüße
Robert

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
Noch kein Account? Hier anmelden.