www.mikrocontroller.net

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


Autor: Robert B. (robertb)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.