mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8 RGB Leds stufenlos ansteuern


Autor: PulsWelle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der kleine Jimmy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mawieit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: PulsWelle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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=...

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

Autor: Steffen (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Werner (michelw)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oder einen Treiber nehmen der das kann.
Wie hoch soll denn der Strom sein?

Nimm den Siti DM164.
DAtenblatt im Anhang

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lars Hufnagel (hufnala)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Pulswelle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
ISR(SIG_OVERFLOW0) // Alle 16 Mikrosekunden
{
  if (sendclk < 288)  // Wenn noch Bits zu senden sind
  {
    if ((PORTA&(1<<CLOCK)) || sendclk == 0)  // Beim ersten Bit oder wenn Bit neu gesetzt werden soll
    {
      PORTA &= ~(1<<CLOCK);   // Setze Clock Low um neues Bit zu setzen
      if (color8[35-(sendclk/8)]&(1<<(7-(sendclk%8))))  // Neues Bit gemäß Array setzen
        PORTA |=  (1<<DATA);
      else
        PORTA &= ~(1<<DATA); 

      sendclk++;
    }
    else  // Wenn Bit übernommen werden soll
    {
      PORTA |= (1<<CLOCK);  // Setze Clock High um aktuelles Bit zu übernehmen
    }
  }
  else  // Wenn alle Bits gesendet wurden
  {
    sendclk++;
    if (sendclk == 289)
      PORTA |= (1<<CLOCK);  // Setze Clock High um letzes Bit zu übernehmen
    if (sendclk == 290)
      PORTA &= ~(1<<CLOCK);  // Setze Clock Low da alle Daten übetragen wurden
    if (sendclk == 291) 
      PORTB |= (1<<XLAT);    //Übernehme Daten in Anzeige
    if (sendclk == 292)
    {
      PORTB &= ~(1<<XLAT);
      sendclk=0;
      
      TIMSK &= ~(1<<TOIE0);  // Fertig
    }
  }
}

PW

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: PulsWelle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... :-(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.