Forum: Mikrocontroller und Digitale Elektronik AVR: PWM zu langsam


von Mari (Gast)


Lesenswert?

Hallo!
Ich stehe gerade vor einem kleinen Problem und komme nicht weiter- 
irgendwo muss ein Denkfehler sein...

Ich möchte mit einem 16-Bit-Timer ein PWM-Signal erzeugen. Da mein 
Controller mit 16 Mhz läuft sollte der Zähler alle 4,1ms überlaufen 
(65.536/16.000.000).
Jetzt sehe ich aber am Oszilloskop, dass die PWM-Periode 8,2ms beträgt, 
also genau das Doppelte. Wo liegt der Fehler?
1
void pwm_init()
2
{
3
  // Timer4 PWM
4
    //Ausgangsports setzen
5
    DDRE |= (1<<PE4)|(1<<PE5);
6
    //Fast PWM, Modus 14, Prescaler 1, Kanal B und C
7
    TCCR3A = (1<<COM3B1)|(1<<COM3C1)|(1<<WGM32)|(1<<WGM31);
8
    TCCR3B = (1<<CS30)|(1<<WGM33);
9
10
    //Obergrenze des Zählers festlegen
11
    ICR3=0xFFFF;
12
13
    //PWM-Werte
14
    OCR3B = 16000;
15
    OCR3C = 32000;
16
}

von hilmar (Gast)


Lesenswert?

Hast du die Fusebits richtig gesetzt? Nicht daß er vielleicht mit dem 
internen 8MHz-Oszillator läuft...

von Mari (Gast)


Lesenswert?

Eigentlich sollten die Fuses richtig sein.
Die serielle Schnittstelle läuft auch problemlos- das sollte ja 
eigentlich nicht funktionieren wenn die Frequenz falsch wäre..

von Hannes W. (hannes_w)


Lesenswert?

Um welchen Controller handelt es sich?
Sicher, dass der Controller auf den 16MHz-Quarz gefused ist und nicht 
mehr mit dem 8MHz RC-Oszillator läuft?

von Mari (Gast)


Lesenswert?

Ein Mega2560. Fuses->siehe oben

von Karl H. (kbuchegg)


Lesenswert?

Wenn man wüsste welcher µC das ist, dann könnte man mal im Datenblatt 
nachsehen, ob das hier
1
    TCCR3A = (1<<COM3B1)|(1<<COM3C1)|(1<<WGM32)|(1<<WGM31);
2
    TCCR3B = (1<<CS30)|(1<<WGM33);
wirklich das ist, was der Kommentar verspricht.

Beim Mega128 jedenfalls ist es das nicht.
Da sind WGM30 und WGM31 im Register TCCR3A, WGM32(!) und WGM33 
allerdings im Register TCCR3B. Was allerdings nicht heißen muss, das es 
bei deinem µC auch so ist.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn man wüsste welcher µC das ist, dann könnte man mal im Datenblatt
> nachsehen, ob das hier
>
1
>     TCCR3A = (1<<COM3B1)|(1<<COM3C1)|(1<<WGM32)|(1<<WGM31);
2
>     TCCR3B = (1<<CS30)|(1<<WGM33);
3
>
> wirklich das ist, was der Kommentar verspricht.
>
> Beim Mega128 jedenfalls ist es das nicht.
> Da sind WGM30 und WGM31 im Register TCCR3A, WGM32(!) und WGM33
> allerdings im Register TCCR3B. Was allerdings nicht heißen muss, das es
> bei deinem µC auch so ist.


AH. ein M2560.
Bei dem ist es genau gleich.
-> Falsches Register erwischt.

von Mari (Gast)


Lesenswert?

Ups, da hast du natürlich Recht!
Vielen Dank, jetzt läuft es! :-)

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.