www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8: Timer2 PWM


Autor: XY (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche jetzt schon die ganze Zeit mit dem Timer2 eine Fast PWM zu 
erzeugen mit 2kHz und 250µs High-Time.
Der Debugger zeigt mir immer an, dass der Timer2 im CTC Modus läuft.
Sieht einer von euch meine(n) Fehler?
int main(void)
{
  //Timer2
  DDRB|=(1<<PB3);        //PB3(OC2 als Ausgang)
  
  TCCR2&=~(1<<FOC2);        //0, da Timer als PWM genutzt
  TCCR2|= (1<<WGM21)|(1<<WGM20);  //Timer als Fast-PWM eingestellt
  TCCR2|= (1<<COM21)|(1<<COM20);  //Inverting Mode
  TCCR2|= (1<<CS22);         //Prescaler 64
  TCCR2&=~(1<<CS21);
  TCCR2&=~(1<<CS20);
  TCNT2 = 130;          
  OCR2  =  65;          

  while(1);

  return 0;
}

Autor: Markus ---- (mrmccrash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du dir sicher, dass alle Status-bits in das Register TCCR2 
geschrieben werden müssen?

Und warum verwendest du mehrere verschiedene Zuweisungsfunktionen 
nacheinander auf das gleiche Register?

Schreibe doch mal alle Flags für ein Register in eine Zeile, für jedes 
Register eine eigene.

_.-=: MFG :=-._

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo XY,

hast du mal in das Datenblatt gesehen?

Mit Timer2 geht eine Fast PWM, aber die hat dann 8 Bit und
zählt von 0 - 255. Deine 2 kHz und Vorteiler 64  würden
dann einen 32,768 MHz Quarz benötigen.
Bei CTC geht nur ein Rechteck mit 50-50 Duty wenn man
das toggle verwendet.

Was willst du, und welche Frequenz hat dein Mega?

avr

Autor: XY (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich glaub, jetzt habe ich es
int main(void)
{
  //Timer2
  DDRB|=(1<<PB3);      //PB3(OC2 als Ausgang)
  
  TCCR2&=~(0<<FOC2);      //0, da Timer als PWM genutzt
  TCCR2|= (1<<WGM21)|(1<<WGM20);//Timer als Fast-PWM eingestellt
  TCCR2|= (1<<COM21)|(1<<COM20);  //Inverting Mode
  TCCR2|= (1<<CS20)|(1<<CS21);   //Prescaler 64
  TCCR2&=~(1<<CS22);
  TCNT2 = 6;          
  OCR2  = 131;

  while(1);

  return 0;
}

Ich verwende ein 16MHz Quarz. Mir geht es Hauptsächlich darum, die PWM 
ans laufen zu kriegen, um später ein Piezo damit anzusteuern und im 
nächsten Schritt die PWM mittels ADC zu verändern. Das 
Puls-Pausenverhältnis liegt jetzt bei 50:50.
Was mich jetzt noch wundert ist, warum das AVR-Studio mir anzeigt, dass 
der Timer2 im CTC-Modus läuft. Das TCCR2-Register habe ich wegen der 
Übersichtlichkeit mehr mal beschrieben, laut dem Debugger sind die Bits 
auch richtig gesetzt.

Autor: XY (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, das soll im Kommentar ein Prescaler von 32 sein

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für PWM darf COM20 nicht gesetzt werden.
Das Vorsetzen des Timers TCNT2 ist sinnlos.

Wenn es um Sound mit dem Piezo geht ist CTC mit Pintoggle
besser. Dann kann man über den Tobwert in OCR2 die
Frequenz variieren.

avr

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.