16 Bit Timer1 mit 3 Channels möglich?

#5358745
Lesenswert?

Hallo liebe Gemeine,

ihr habt mir schon viel weitergeholfen wieder in das Thema µC 
reinzukommen...

Mein aktuelles Problem bezieht sich auf Timer. Ich habe einen 
ATMega644A.

Timer1 ist initialisiert auf Fast PWM und 16-Bit, damit versorge ich PD4 
(OC1B) und PD5 (OC1A).
Mein Problem ist daß ich unbedingt einen dritten 16-Bit Channel benötige 
(für RGB), dann zwar noch einen vierten, aber da reichen dann 8-Bit.

Gibt es da irgendeinen Trick oder Möglichkeit?

Hier mal der init-Code und die Ausgabefunktion:
1
void timer1_init ()//Für PWM 0-1024
2
{
3
  TCCR1A = ( (1<<WGM12) | (1<<WGM11) | (1<<WGM10) | (1<<COM1B1) | (1<<COM1A1) ); // 10bit-Counter, nicht invert. fast PWM
4
  TCCR1B = (1<<CS10); // Pre-Scaler = 1, (3,8 kHz PWM)
5
}
6

7

8
void fkt_bga_pwm_out (uint16_t power )
9
{
10

11
  
12
    //PWM aktivieren
13
    DDRD |= _BV(PD4);
14
    
15
    //Port deaktivieren um ein vollständiges Ausschalten zu realisieren
16
    if(power==0)
17
    {
18
      DDRD &= ~_BV(PD4);
19
    }
20
    
21
    
22
    //PWM auf volle Helligkeit
23
    OCR1B = (power);  
24
    
25
  
26
  
27
}
28

29
void fkt_LEDrot_pwm_out (uint16_t power)
30
{
31

32
  
33
  //PWM aktivieren
34
  DDRD |= _BV(PD5);
35
  
36
  //Port deaktivieren um ein vollständiges Ausschalten zu realisieren
37
  if(power==0)
38
  {
39
    DDRD &= ~_BV(PD5);
40
  }
41
  
42
  
43
  //PWM auf volle Helligkeit
44
  OCR1A = (power); //auf 1024 Stufen
45
  
46
  
47
  
48
}
#5358810
Lesenswert?

René K. schrieb:
> Mein aktuelles Problem bezieht sich auf Timer. Ich habe einen
> ATMega644A.
>
> Timer1 ist initialisiert auf Fast PWM und 16-Bit, damit versorge ich PD4
> (OC1B) und PD5 (OC1A).
> Mein Problem ist daß ich unbedingt einen dritten 16-Bit Channel benötige
> (für RGB), dann zwar noch einen vierten, aber da reichen dann 8-Bit.

Du meinst also PWM Kanäle. Hättest du mal besser so in die 
Betreffzeile schreiben sollen.

> Gibt es da irgendeinen Trick oder Möglichkeit?

Der ATMega644 hat nur einen 16-Bit Timer. Und der hat nur zwei 
Compare-Einheiten, kann also nur zwei PWM Signale erzeugen.

Am einfachsten wäre sicher, einen anderen µC zu verwenden, der mehr 
PWM-Kanäle kann.

Sonst halt Software-PWM. Für LED braucht man nicht unbedingt 16 Bit, da 
reicht auch weniger. Wenn wirklich 16 Bit Auflösung gebraucht werden, 
dann am besten als BAM (Bit Angle Modulation). Wurde beides hier im 
Forum schon x-mal durchexerziert.

Oder einen externen LED-Treiber, der die PWM selber macht und per z.B. 
SPI gesteuert wird. Oder einen zweiten, dritten etc. µC als PWM-Treiber 
programmieren.

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