Forum: Mikrocontroller und Digitale Elektronik 8 RGB Leds stufenlos ansteuern


von PulsWelle (Gast)


Lesenswert?

Hallo,

ich habe nun schon viel mit (Hochleistungs)LEDs und PWM rumprobiert. Mir 
schwebt eine stufenlose Steuerung einer LED von 0% - 100% Helligkeit 
(nicht Strom!) vor.

Ich habe schnell gemerkt, dass ich eine Exponentialfunktion brauche, um 
LEDs für den Menschen linear zu dimmen. Doch mit einer 
Exponentialfunktion habe bei 8 oder 10 BIt richtig böse Stufen im 
unteren Bereich wenn ich 256 Helligskeitsstufen haben möchte.

Was nun?

Ich möchte:
-8 RGB LEDs (also 24 PWM Kanäle) mit 256 Stufen steuern könnnen.
-Die Helligkeit soll sich für den Zuschauer linear verändern.
-Keine sichtbaren Stufen.
-PWM Freq. so dass ein Flackern sichtbar ist (~100Hz)

Ich denke dazu brauche ich eine 16 Bit PWM für die 24 Kanäle. Da kommt 
bei den Atmegas nur Hardware PWM in Frage, oder?

Welche Atmelprozessoren (oder andere ebenso leicht beschaff- und 
programmierbare Prozessoren kommen in Frage?)


MfG

Die PulsWelle

von Steffen (Gast)


Lesenswert?

könnte der STM32F103 ( CortexM3). Der hat 8 Timer. Jeder Timer hat 4 
Ausgänge die einzeln im Duty geändert werden können.

von Der kleine Jimmy (Gast)


Lesenswert?

Es gibt aber auch Xmegas mit 24 PWM Kanälen.
Nämlich die, deren Name mit A1 aufhört. Bei Digi-Key gibts manchmal 
welche. Im Moment aber nicht.

von mawieit (Gast)


Lesenswert?

http://focus.ti.com/docs/prod/folders/print/tlc5947.html

n led-treiber mit nur 12bit auflösung aber dafür alles andere integriert

gruß

von PulsWelle (Gast)


Lesenswert?

@Steffen,
das was du schreibst klingt sehr gut.
Hier steht aber nur was von 4 Timern:
http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=110341273999

@Jimmy
Der XMega ist ganz neu. Verfügbarkeit ist auch nicht so prall, ansonsten 
sicherlich eine gute Alternative...

von Steffen (Gast)


Lesenswert?

@PulsWelle:
ich hatte vergessen zu schreiben, das alle Timer ab den 100pinnern zur 
Verfügung stehen. Die kleineren habe halt weniger.

von Steffen (Gast)


Lesenswert?

@PulsWelle:
noch was vergessen. Die Timer TIM6 und TIM7 sind interne Timer. TIM1, 
TIM2, TIM3, TIM4, TIM5 und TIM8 kann man für ext. PWM verwenden. Das 
sollten dann genau 24 PWM's werden.

von Michael W. (michelw)


Angehängte Dateien:

Lesenswert?

Oder einen Treiber nehmen der das kann.
Wie hoch soll denn der Strom sein?

Nimm den Siti DM164.
DAtenblatt im Anhang

von Falk B. (falk)


Lesenswert?

@  PulsWelle (Gast)

>schwebt eine stufenlose Steuerung einer LED von 0% - 100% Helligkeit
>(nicht Strom!) vor.

Die beiden Parameter sind bei LEDs ziemlich linear gekoppelt.

>Ich habe schnell gemerkt, dass ich eine Exponentialfunktion brauche, um
>LEDs für den Menschen linear zu dimmen.

DAS ist ja auch was anderes ;-)

>-8 RGB LEDs (also 24 PWM Kanäle) mit 256 Stufen steuern könnnen.
>-Die Helligkeit soll sich für den Zuschauer linear verändern.
>-Keine sichtbaren Stufen.

Alles eine Frage der Geschwindigkeit. In Zeilupe braucht man 16 PWM, 
schon klar.

>-PWM Freq. so dass ein Flackern sichtbar ist (~100Hz)

Fehlt da ein k ? ;-)

>Ich denke dazu brauche ich eine 16 Bit PWM für die 24 Kanäle. Da kommt
>bei den Atmegas nur Hardware PWM in Frage, oder?

Ja.

>Welche Atmelprozessoren (oder andere ebenso leicht beschaff- und
>programmierbare Prozessoren kommen in Frage?)

Viele AVRs haben einen 16 Bit Timer mit zwei PWM Ausgängen (z.B. 
tiny2313), einige haben zwei Timer und damit 4. Nimm so ein Teil und 
häng eine RGB-LED dran. Die Daten fütterst du über einen Master-AVR per 
RS232 rein. Fertig. Keine Probleme mit Spezialbauteilen.

Man kann das auch in einen grösseren CPLD packen, allerdings sind 24 
Kanäle a 16 Bit schon heftig, da braucht man einen ZIEMLICH grossen 
CPLD. Besser ein kleines FPGA, das ist billiger.

MFG
Falk

von Lars H. (hufnala)


Lesenswert?

Hi,
sollen dass wirklich 24 Kanäle werden, oder sollen die 8LEDs synchron 
laufen? Falls letzteres kannste Problemlos X LEDs in Reihe schalten.

Schau mal unter LED-Styles.de, da gibt's nen Bausatz mit RGB Fader 
(Helligkeit gleich, die Stufen hängen davon davon ab wie schnell Du von 
0%-100% steuern willst. Komplett mit LP & Tiny für 8,50, FETs sind auch 
dabei.

Ist mit nem 2313 und ich habe das Teil selber, funktioniert gut, 
allerdings wie Du schon schreibst ist im unteren Bereich ein flackern zu 
sehen (aber nur a.d. Kontroll-LED). Da die Gesamthelligkeit immer 100% 
ist, überlagen die anderen Farben das Flackern recht gut.

Die Exponentialfunktion sollte sich doch z.B. auch durch ein shift 
Rechts erledigen lassen bei den Wartezeiten zwischen dem 
runterschalten?!


Ciao hufnala

P.S. da liegt auch der code für Bascom....

von Pulswelle (Gast)


Lesenswert?

@mawieit

Ich hab jetzt den von dir vorgeschlagenen TLC5947. Ich steuere den TLC 
mit einem ATMEga32 an.

Leider werden die LEDs bei jedem Helligkeitswechsel kurz dunkel. Steht 
auch so im Datenblatt:
"The data in the grayscale shift register are moved to the grayscale 
data latch with a low-to-high transition on this pin. When the XLAT 
rising edge is input, all constant current outputs are forced off until 
the next grayscale display period. The grayscale counter is not reset to 
zero wirth a rising edge of XLAT."

XLAT übernimmt die Seriell eingeschobenen Daten so dass sie angezeigt 
werden. Ich müsste also immer genau zum Ende einer PWM Periode XLAT 
setzen, damit kein Flackern entsteht. Nur wie soll ich das anstellen? 
Wie merke ich dass die PWM Periode des TLCs gerade um ist?


Oder ist der Chip so ****** dass kein Fading möglich ist? Dann wäre ich 
aber schwer enttäuscht....

Anbei der Quellcode der den Chip versorget:
1
ISR(SIG_OVERFLOW0) // Alle 16 Mikrosekunden
2
{
3
  if (sendclk < 288)  // Wenn noch Bits zu senden sind
4
  {
5
    if ((PORTA&(1<<CLOCK)) || sendclk == 0)  // Beim ersten Bit oder wenn Bit neu gesetzt werden soll
6
    {
7
      PORTA &= ~(1<<CLOCK);   // Setze Clock Low um neues Bit zu setzen
8
      if (color8[35-(sendclk/8)]&(1<<(7-(sendclk%8))))  // Neues Bit gemäß Array setzen
9
        PORTA |=  (1<<DATA);
10
      else
11
        PORTA &= ~(1<<DATA); 
12
13
      sendclk++;
14
    }
15
    else  // Wenn Bit übernommen werden soll
16
    {
17
      PORTA |= (1<<CLOCK);  // Setze Clock High um aktuelles Bit zu übernehmen
18
    }
19
  }
20
  else  // Wenn alle Bits gesendet wurden
21
  {
22
    sendclk++;
23
    if (sendclk == 289)
24
      PORTA |= (1<<CLOCK);  // Setze Clock High um letzes Bit zu übernehmen
25
    if (sendclk == 290)
26
      PORTA &= ~(1<<CLOCK);  // Setze Clock Low da alle Daten übetragen wurden
27
    if (sendclk == 291) 
28
      PORTB |= (1<<XLAT);    //Übernehme Daten in Anzeige
29
    if (sendclk == 292)
30
    {
31
      PORTB &= ~(1<<XLAT);
32
      sendclk=0;
33
      
34
      TIMSK &= ~(1<<TOIE0);  // Fertig
35
    }
36
  }
37
}

PW

von Peter D. (peda)


Lesenswert?

PulsWelle wrote:
> -Keine sichtbaren Stufen.

Das hängt stark von der Änderungsgeschwindigkeit ab, das Auge darf keine 
Zeit haben, sich auf jede Stufe neu zu adaptieren.
Bei sehr langsam und sehr dunkel brauchst Du wohl schon 16 Bit.
Bei einer normalen Umgebungshelligkeit braucht man auch nicht soviel 
Stufen.


Für Experimente kannst Du dieses Projekt benutzen:

Beitrag "programmierbare 16 Kanal PWM Lightshow"

Es hat eine 10Bit Auflösung mit Stufung 3.Wurzel von 2.
Viel CPU-Zeit geht allerdings für das serielle Laden der 
Leistungs-Schieberegister drauf. Ich habs deshalb gemacht, damit die 
Schaltung möglichst einfach ist.

Mit nem 40 Pinner kannst Du 24 Ausgänge parallel laden und auch noch 
feiner abstufen.

Durch die PMW-Tabelle im RAM gibt es keine Störungen beim Ändern des 
Wertes.
Und alle anderen Interrupts müssen ISR_NOBLOCK sein (Vorsicht, geht 
leider nicht mit der HW-UART!).


Peter

von PulsWelle (Gast)


Lesenswert?

Hallo Peter,

Danke für deine Ideen. Ich habe die Platine mit dem TLC5947 aber jetzt 
schon fertig und würde diesen gerne nutzen. Was mich dabei aber sehr 
ärgert, ist dass bei jeder Helligkeitsänderung die LEDs bis zum nächsten 
PWM Zyklus ausgeschaltet werden. Dadurch flackern die LEDs bei jeder 
Helligkeitsänderung... :-(

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.