Forum: Mikrocontroller und Digitale Elektronik ATMega32: Probleme beim PWM mit Timer1 (16-Bit, FastPWM, zwei Kanäle)


von Thomas I. (irgangla)


Lesenswert?

Hallo,
ich bin hier gerade an einem RGB-Led Projekt am basteln und hab 
folgendes Problem:
Timer1 (16-Bit Timer) soll zwei PWM-Kanäle versorgen und Timer2 den 
dritten. OC2 und OC1B funktionieren wunderbar nur OC1A macht Ärger. Bei 
einem Wert von 0 schalte ich den Kanal komplett ab, was auch 
funktioniert, und bei Werten größer 0 wird ein entsprechendes PWM-Signal 
erzeugt. Sobald ich OC1A verbinde kann ich am Pin eine Spannung von 3,6V 
messen und wenn das Tastverhältnis entsprechend hoch wird bis zu fast 
5V, aber nie weniger (hab kein Oszi da :( ). OC1B arbeitet genauso 
(identischer Code bis auf die Registernamen B<->A) und finktioniert 
einwandfrei. Sieht jemand den Fehler oder kennt das Problem?

Hier die Initialisierung der Timer:
1
void initPWM(){
2
  //start with random light mode
3
  random_counter = 0;
4
  random_light = 1;
5
  
6
  TIMSK &= ~(1<<TICIE1);
7
  TIMSK &= ~(1<<OCIE1A);
8
  TIMSK &= ~(1<<OCIE1B);
9
  TIMSK &= ~(1<<TOIE1);
10
  
11
  //timer1 as fast pwm
12
  //clear on match, set on bottom
13
  TCCR1A |= (1<<COM1A1);
14
  TCCR1A &= ~(1<<COM1A0);  
15
  TCCR1A |= (1<<COM1B1);
16
  TCCR1A &= ~(1<<COM1B0);
17
  //fast pwm, 8 bit
18
  TCCR1A |= (1<<WGM10);
19
  TCCR1A &= ~(1<<WGM11);
20
  TCCR1B |= (1<<WGM12);
21
  TCCR1B &= ~(1<<WGM13);
22
  //no prescaling => 31,25 kHz
23
  TCCR1B |= (1<<CS10);
24
  TCCR1B &= ~(1<<CS11);
25
  TCCR1B &= ~(1<<CS12);
26
  //init with 50%
27
  pwm_index_green = 15;
28
  OCR1AH = 0x00;
29
  OCR1AL = pwmtable_8D[pwm_index_green];
30
  pwm_index_blue = 15;
31
  OCR1BL = pwmtable_8D[pwm_index_blue];
32
  
33
  //timer2 as fast pwm
34
  TCCR2 |= (1<<WGM21) | (1<<WGM20);
35
  //clear on match, set on bottom
36
  TCCR2 |= (1<<COM21);
37
  TCCR2 &= ~(1<<COM20); 
38
  //no prescaling => 31,25 kHz
39
  TCCR2 |= (1<<CS10);
40
  TCCR2 &= ~(1<<CS11);
41
  TCCR2 &= ~(1<<CS12);
42
  //init with 50%
43
  pwm_index_red = 15;
44
  OCR2 = pwmtable_8D[pwm_index_red];
45
  //pins to output
46
  DDRD |= (1<<PD4) | (1<<PD5) | (1<<PD7);
47
    
48
  lightOn();
49
  
50
  //switch on box light
51
  boxlight = 0;
52
  switchBoxLight();
53
}

von Thomas I. (irgangla)


Lesenswert?

Hab grad zufällig gesehen dass der ATMega keine internen PullDowns hat. 
Externe PullDowns haben das Problem gelöst.

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.