Forum: Mikrocontroller und Digitale Elektronik ATMeag2560 16-Bit PWM funktioniert nicht wie es soll.


von Marcel (Gast)


Lesenswert?

Hallo,

ich versuche gerade eine 16-Bit PWM auf einem ATMega2560 zum laufen zu 
bekommen, was allerdings nicht richtig funktioniert.
1
  DDRB |= 0xFF;
2
  DDRE |= 0xFF;
3
  TCCR3A = (1<<WGM31) | (1<<WGM30) | (1<<COM3A1) | (1<<COM3B1) | (1<<COM3C1); // PWM, phase correct, 16 bit.
4
  TCCR3B = (1<<WGM33) | (1<<CS31); // Prescaler 8;
5
  OCR3AH = 0x3F; // 50%
6
  OCR3AL = 0xFF;
7
  OCR3BH = 0x3A; // ?
8
  OCR3BL = 0x98;
9
  OCR3CH = 0xBF; // 75%
10
  OCR3CL = 0xFD;

Im AVRISP mkII ist unter Fuses SUT_CKSEL: EXTOSC_8MHZ_XX_16KCK_65MS 
eingetragen, daraus schließe ich dass der uC dann mit 8MHz rennt ?
Der uC läuft mit 5V.

Jetzt habe ich das Programm auf den uC übertragen und erhalte Folgende 
Werte:

OC3B : 4.533 V
OC3C : 0 V
OC3A : 4.950 V

OC3A ist jetzt schon bei 5V , daraus schließe ich dass der Timer nie 
meine Vorgabe im Register OCR3A erreicht, nur wieso ? Es ist doch ein 
16-Bit Timer.

Was ich auch ein wenig komisch finde ist, wenn ich einen Prescaler von 
64 einstelle ist das sehr langsam, habe nur ein Multimeter mit dem ich 
das überprüfen kann, aber die Spannung am Multimeter verändert sich 
sichtlich zu 0 und dann wieder auf 5 V !

Ich hoffe hier kennt sich jemand damit aus und kann mir weiter helfen.

Gruß

von spess53 (Gast)


Lesenswert?

Hi

>  TCCR3A = (1<<WGM31) | (1<<WGM30) | (1<<COM3A1) | (1<<COM3B1) | (1<<COM3C1)
>  TCCR3B = (1<<WGM33) | (1<<CS31); // Prescaler 8;

Das ist zwar PWM, Phase Correct. Aber mit OCR3A als Top. D.h. OCR3a 
bestimmt die Zählweite des Timers und ist kein PWM-Kanal. Der Wert in 
OCR3A sind also deine 100%. Um mit OC3B und OC3C eine PWM zu erhalten 
müssen die Werte in den OC-Registern < OCR3A sein.

MfG Spess

von Marcel (Gast)


Lesenswert?

ich kann im Datenblatt leider keine anderen OC-Register außer die OCR 
Register gefunden... Ich möchte einfach nur eine PWM genereiren, die ich 
zwischen 0% und 100% verändern kann.

von spess53 (Gast)


Lesenswert?

Hi

>ich kann im Datenblatt leider keine anderen OC-Register außer die OCR
>Register gefunden...

Timer3 hat auch nur die drei OC-Register. Nur hat OCR3A im PWM-Mode11 
eine andere Funktion als du annimmst.

>Im AVRISP mkII ist unter Fuses SUT_CKSEL: EXTOSC_8MHZ_XX_16KCK_65MS
>eingetragen, daraus schließe ich dass der uC dann mit 8MHz rennt ?

Nein. Dein Controller läuft mit der Frequenz des angeschlossenen 
Quarzes.

>Was ich auch ein wenig komisch finde ist, wenn ich einen Prescaler von
>64 einstelle ist das sehr langsam,...

Mit deinen Einstellungen ist die PWM-Frequenz Controllertakt/1048576.

MfG Spess

von c-hater (Gast)


Lesenswert?

Marcel schrieb:

> ich kann im Datenblatt leider keine anderen OC-Register außer die OCR
> Register gefunden...

Es gibt auch keine anderen.

> Ich möchte einfach nur eine PWM genereiren, die ich
> zwischen 0% und 100% verändern kann.

Dan lies' endlich mal das Datenblatt. Und zwar solange, bis du wirklich 
verstanden hast, was da beschreiben wird! Dabei kann dir niemand 
wirklich helfen, das kannst nur du alleine tun.

Das Problem ist, daß es die Timer ziemlich variabel einsetzbar sind. 
Reduziert auf die Nutzung in PWM-Modi gibt es aber prinzipiell nur drei 
verschiedene Fälle.

1) Feste Zyklusfrequenz, gewählt durch Timermode (nur durch Prescaler 
anpaßbar)

In diesem Fall stehen (sofern zwei vorhanden) beide PWM-Kanäle zur 
Verfügung und können via OCRxA (und OCRxB) gesteuert werden.

2) Zyklusfrequenz kontrolliert via ICRx

Auch in diesem Fall stehen (sofern vorhanden) beide PWM-Kanäle zur 
Verfügung und können via OCRxA (und OCRxB) gesteuert werden.

3) Zyklusfrequenz kontrolliert via OCRxA

In diesem Fall steht natürlich nur der PWM-Kanal zur Verfügung, der via 
OCRxB gesteuert wird, denn OCRxA kontrolliert ja bereits die 
Zyklusfrequenz.
Das ist genau dein Fall, wenn du auch den Kanal A nutzen willst, hast du 
schlicht den falschen Quelltext raubkopiert!

Also lies' doch endlich mal dieses verschissene Datenblatt, damit du 
wenigstens andeutungsweise in der Lage bist, zu erkennen, welchen Code 
du per Copy&Paste übernehmen mußt...

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.