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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.