Atmega8: Timer2 PWM

Gast #1303830
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?
1
int main(void)
2
{
3
  //Timer2
4
  DDRB|=(1<<PB3);        //PB3(OC2 als Ausgang)
5
  
6
  TCCR2&=~(1<<FOC2);        //0, da Timer als PWM genutzt
7
  TCCR2|= (1<<WGM21)|(1<<WGM20);  //Timer als Fast-PWM eingestellt
8
  TCCR2|= (1<<COM21)|(1<<COM20);  //Inverting Mode
9
  TCCR2|= (1<<CS22);         //Prescaler 64
10
  TCCR2&=~(1<<CS21);
11
  TCCR2&=~(1<<CS20);
12
  TCNT2 = 130;          
13
  OCR2  =  65;          
14

15
  while(1);
16

17
  return 0;
18
}
#1303839
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 :=-._
Gast #1303873
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
Gast #1303944
Lesenswert?

So, ich glaub, jetzt habe ich es
1
int main(void)
2
{
3
  //Timer2
4
  DDRB|=(1<<PB3);      //PB3(OC2 als Ausgang)
5
  
6
  TCCR2&=~(0<<FOC2);      //0, da Timer als PWM genutzt
7
  TCCR2|= (1<<WGM21)|(1<<WGM20);//Timer als Fast-PWM eingestellt
8
  TCCR2|= (1<<COM21)|(1<<COM20);  //Inverting Mode
9
  TCCR2|= (1<<CS20)|(1<<CS21);   //Prescaler 64
10
  TCCR2&=~(1<<CS22);
11
  TCNT2 = 6;          
12
  OCR2  = 131;
13

14
  while(1);
15

16
  return 0;
17
}

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.
Gast #1303987
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren