Forum: Mikrocontroller und Digitale Elektronik 16 Bit Timer1 mit 3 Channels möglich?


von René K. (tesla24)


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
}

von Axel S. (a-za-z0-9)


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.

von S. Landolt (Gast)


Lesenswert?

> einen anderen µC zu verwenden
Der Wechsel auf den ATmega1284 wäre wohl am einfachsten.

von Harry L. (mysth)


Lesenswert?


: Bearbeitet durch User
von Curby23523 N. (Gast)


Lesenswert?

Harry L. schrieb:
> I²C 16Ch. LED-PWM 12bit: PCA9685
>
> Ebay-Artikel Nr. 253285067342

"Makershop"...

von René K. (tesla24)


Lesenswert?

Der ATmega 1284 hat ja das gleiche Datenblatt und damit auch das gleiche 
Pin out und das wäre schon perfekt.

Hat der dann noch ein OCR1C Register für Timer1 ?

von S. Landolt (Gast)


Lesenswert?

Er hat einen Timer3.

von René K. (tesla24)


Lesenswert?

Super, danke für den Tip.
Also der ATMega1284 hat 2 16-Bit Timer mit je 2 Registern.
Damit sind dann 4 PWM-Channels mit 16-Bit möglich.

von Wolfgang (Gast)


Lesenswert?

Curby23523 N. schrieb:
> Harry L. schrieb:
>> I²C 16Ch. LED-PWM 12bit: PCA9685
>> Ebay-Artikel Nr. 253285067342
>
> "Makershop"...

Du meinst den Preis, verglichen mit einem Lieferanten aus Shenzhen?
Preisaufschlag >160% für kurze Lieferzeit eben ...

https://www.ebay.de/itm/201402794566

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.