Forum: Mikrocontroller und Digitale Elektronik PWM mit ATMEGA128 funktioniert nicht


von Ronny Schulz (Gast)


Lesenswert?

Ich will eine PWM-Steuerung mit dem ATMEGA128 aufbauen. Aber das
funktioniert schon im Debugger nicht. Programmieren will ich das mit
WinAVR. Hier der Codeschnipsel:

cli();
OCR3A = 20;
OCR3B = 20;
OCR3C = 20;
TCNT3 = 0;
TCCR3A |= 1<<COM3A1 | 1<<COM3A0 | 1<<COM3B1 | 1<<COM3B0 | 1<<COM3C1 |
1<<COM3C0 | 1<<WGM30;
TCCR3B |= 1<<WGM32 | 1<<CS31;
sei();

Folgende Konfiguration:

Timer 3 soll mit einem Prescaler von 8 (im Debugger ist es relativ egal
welche Frequenz) alle 3 PWM-Ausgänge mit FastPWM 8-Bit ansteuern.  Laut
Konfiguration soll der Ausgang bei "compare match" High sein und bei
"TOP" auf Low sein. Der zweite Teil funktioniert nicht. Also der
Ausgang wird zwar High, wenn TCNT3 20 erreicht. Aber wird nie wieder
Low. Wo kann der Fehler liegen?

von Ronny Schulz (Gast)


Lesenswert?

Also das PWM soll natürlich so laufen, dass der Controller damit nachher
nicht mehr belastet wird und das sollte doch gehen. Ich muss doch nicht
immer einen IRQ auslösen lassen, wenn TCNT3 0xFF erreicht. Denn, wenn
ich es im Datenblatt richtig verstanden habe, sollte er bei meiner
Konfiguration:

TCNT3 = 20 (0x14) -> Ausgang OC3A = HIGH, OC3B = HIGH, OC3C = HIGH

und bei:

TCNT3 = 255 (0xFF) -> Ausgang OC3A = LOW, OC3B = LOW, OC3C = LOW

sein. Oder ist das ein Denkfehler?

von Gerd Laschinski (Gast)


Lesenswert?

Hallo Ronny,

zählt denn TCNT3 von 0 bis 255 und dann wieder von 0 bis 255 usw.?
Die TCCR3A und TCCR3B sind meiner Meinung nach richtig gesetzt. Und in
dieser Konfiguration hat es bei mir schon funktioniert. Aber ich habe
es direkt im Meag128 ausprobiert.

Gruß
Gerd

von Ronny Schulz (Gast)


Lesenswert?

Hallo Gerd,

ja genau so ist es. Der TCNT3 zählt von 0 - 255 und dann wieder von
vorn. Hast Du vielleicht den Beispielcode mal da? Ich habe das mit
AVRStudio 4.11 debugged und kompiliert mit WinAVR. Es sollte eigentlich
schon im Debugger laufen.

In der Hardware wollte ich später testen. Dazu muss ich mit dem Oszi
ran und müsste da noch einiges an Programm ändern, weil die Frequenz
zum einen viel zu hoch ist für mein Oszi und zum anderen noch andere
Steine im Weg liegen.

von Gerd Laschinski (Gast)


Lesenswert?

Hallo Ronny,

habe momentan keinen Beispielcode zur Hand. Wie sehen denn Deine
Ausgänge bei TCNT3 = 0, 19, 20, 21 und 255 aus?

Gruß
Gerd

von Ronny Schulz (Gast)


Lesenswert?

Das geht nicht so genau, da ich ja nicht Takt für Takt ausprobieren
kann. Es sei denn ich würde den Prescaler ändern:

0 -> Low
21 -> High
255 -> High

Danach nie wieder Low.....

von Gerd Laschinski (Gast)


Lesenswert?

Probier es doch mal im Mega128, vielleicht stimmt etwas mit dem Debugger
nicht. Du brauchst auch kein schnelles Oszilloskop. Ein einfaches
Multimeter an den Ausgang dranhängen genügt. Falls der Ausgang High
bleibt, dann mißt Du 5 Volt, sonst den gemittelten PWM-Wert.

Gruß
Gerd

von Ronny Schulz (Gast)


Lesenswert?

Klingt logisch. Manchmal stellt man sich doch zu dumm an. grins Ich
werde es nachher mal ausprobieren. :)

von Ronny Schulz (Gast)


Lesenswert?

Also der Debugger scheint wieder einmal zu spinnen. Die Schaltung an
sich funktioniert. Ging nachher sogar mit Oszilloskop zu messen.

Danke für die Hilfe!

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.