COM0A1, COM1A1, COM2A1 etc - wird per Pin sofort aktualisiert oder erst beim nächsten Zyklus?

OP #1602797
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.