Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM Initialisierung


von Andreas K. (totem)


Lesenswert?

Hallo Forum und einen schönen Gruß ins bevorstehede Wochenende!

Mit meiner PWM eines ATMega2560 möchte ich ein Netzteil programmieren, 
dessen Ausgangsspannung einen Elektromotor antreibt. Soweit so gut, es 
funktioniert auch. Lediglich bei der Initialisierung des Programms wird 
der PWM-Wert anscheinend auf Maximum gesetzt, was zu maximaler 
Ausgangsspannung am Netzteil führt. Das dauert aufgrund der Trägheit des 
Netzteils 1-2 Sekunden und führt zu Dampf in den Leitungen :) Deswegen 
würde ich das gerne abschalten respektive den PWM-Wert mit 0 anfangen 
lassen, scheitere daran aber.
Hier ein Code-Schnipsel:
1
 
2
3
/* Hier Definition der PWM*/ 
4
  DDRB = (1 << PB5);        //Ausgangspin in PWM Modus setzen
5
  PORTB = (0 << PB5);       //Abschalten des PWM-Pins bis zur vollständigen Initialisierung
6
  
7
/*Setzen der nötigen Reister, vgl. Datenblatt 136-189*/
8
  TCCR1A = (1 << COM1A1) | (1 << WGM11);
9
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
10
  
11
/*Zählerwert, bis zu dem der PWM-Zähler zählt*/
12
  //OCR1A = 2001;
13
  ICR1 = 2000;          //1 MHz Clock-Time, kein Prescaler, 500 Hz = 2000 Schritte
14
  
15
/*Schwelle des Zählerwertes, bei dem der Ausgang geschalten wird*/
16
  OCR1A = 2000;            //Initialisierungswert

Laut Debugger passiert die maximale Ansteuerung, wenn die Zeile ICR1 = 
2000; ausgeführt wird. Versuche, OCR1A vor ICR1 zu setzen ändern nichts, 
auch verschiedene Werte für OCR0A (0x0000, 2000, 0xffff) bringen keinen 
Unterschied. Kann mir jemand sagen wo mein Fehler liegt?

Danke im Voraus

Andreas

von Karl H. (kbuchegg)


Lesenswert?

Setz halt deine Compare-Werte BEVOR du den Timer aktivierst.

(Ein Timer fängt zu laufen an, sobald er einen Vorteiler zugewiesen 
bekommt)
1
  
2
/*Zählerwert, bis zu dem der PWM-Zähler zählt*/
3
  //OCR1A = 2001;
4
  ICR1 = 2000;          //1 MHz Clock-Time, kein Prescaler, 500 Hz = 2000 Schritte
5
  
6
/*Schwelle des Zählerwertes, bei dem der Ausgang geschalten wird*/
7
  OCR1A = 2000;            //Initialisierungswert
8
9
10
/*Setzen der nötigen Reister, vgl. Datenblatt 136-189*/
11
  TCCR1A = (1 << COM1A1) | (1 << WGM11);
12
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);

Ist doch ganz einfach: erst fertig konfigurieren, dann einschalten.

von spess53 (Gast)


Lesenswert?

Hi

>Laut Debugger passiert die maximale Ansteuerung, wenn die Zeile ICR1 =

Simulator oder ICE?

Der Simulator kann keine PWM mit variablen Top simulieren.

MfG Spess

von Andreas K. (totem)


Lesenswert?

@Karl Heinz: Danke für den Denkanstoß. Dachte nicht, dass das so 
gravierende Unterschiede macht... Dein Tipp hat geholfen.

@Spess: ICE. Das war auch ein realer Effekt, den ich vom Display des 
Netzteils ablesen konnte.

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.