Hallo, Ich habe versucht eine Fast-PWM auf einem ATmega16 bzw. 32
versucht.
Das Ziel ist erstmal den Pin PD7 mit 38 kHz und 50% Dutycyle wackeln zu
lassen.
Hier erst mal der verwendete Code:
1 | ...
|
2 | ISR(TIMER2_OVF_vect)
|
3 | {
|
4 |
|
5 | TCNT2 = 61; // Nachladen
|
6 | }
|
7 |
|
8 | ...
|
9 |
|
10 | PORTD = 0;
|
11 |
|
12 | DDRD |= (1 << 7);
|
13 | TCCR2 = (1 << WGM21) | (1 << WGM20) | (1 << COM21) | (0 << COM20) | (1 << CS20);
|
14 | TCNT2 = 61;
|
15 | OCR2 = 158;
|
16 | TIMSK |= (1 << TOIE2);
|
17 | sei();
|
18 | ...
|
19 |
|
20 |
|
21 | for(;;)
|
22 | {
|
23 | }
|
24 | ...
|
Über WGM21 und WGM20 wird Mode 3 (Fast PWM) aktiviert.
COM21 ist gesetzt:
Clear OC2 on compare match, set OC2 at BOTTOM,(non-inverting mode)
CS20 ist gesetzt:
clkT2S/(No prescaling)
Meine Quarzfrequenz ist 7372800Hz.
7372800 / 38000 = 194,...
255 - 194 = 61
Deshalb lade ich TCNT2 mit 61 und bei jedem Überlauf wird es erneut mit
diesem Wert geladen.
Ich messe aber ca. 34.5kHz statt 38kHz.
Wenn ich auf internen RC-Osc. mit 8MHz umschalte messe ich etwa 36.5kHz.
(Zumindest sehe ich daran, dass der externe Quarz auch verwendet wird.
Die Frequenz ist auch ok.)
Weiß jemand wo das Problem liegt.
Danke