16 Bit Timer1 mit 3 Channels möglich?

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

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.