ATMega32: Probleme beim PWM mit Timer1 (16-Bit, FastPWM, zwei Kanäle)

OP #2124798
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
}

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