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