Problem mit PWM Initialisierung

#2510105
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
#2510126
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren