Forum: Mikrocontroller und Digitale Elektronik Atmega8: Timer2 PWM


von XY (Gast)


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
}

von Markus -. (mrmccrash)


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 :=-._

von avr (Gast)


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

von XY (Gast)


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.

von XY (Gast)


Lesenswert?

Sorry, das soll im Kommentar ein Prescaler von 32 sein

von avr (Gast)


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

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