RGB-LEDs dimmen

Hallo Leute,
ich hätte da mal eine kleine Frage zu einem Projekt von mir.
Es handelt sich um eine Lichtquelle für meinen Sternenhimmel. Die originale hat nur 2 weiße LEDs, die mit einem Farbrad coloriert werden was mich tierisch nervt.
Mein System hat jetzt 2 RGB-LEDs, die ich mittels Fernbedienung unabhängig voneinander einstellen kann (Fest eingestellte Farben, farbwechsel mit einstellbarer dauer etc).
Die LEDs werden mit einem IRLZ34N angesteuert, einen passenden Vorwiderstand und Widerstand zwischen Arduino-Pins und IRLZ hab ich natürlich auch drin.

Soweit funktioniert die ganze Sache super, nur eine Sache stört:
Die LEDs sind irre hell, und ich würde sie gern dimmen.
Eine Funktion dafür hab ich im Code, die einfach den Wert, der auf die PWM-Pins geschrieben wird erstmal durch 100 teilt und wieder mit einem dimmer-wert multipliziert, und zwar mit demselben wert für jede Farbe der LED, um die gemischte Endfarbe beizubehalten. Dieser wert ist per fernbedienung zwischen 10 und 100 in 10er-schritten einstellbar.
Funktioniert auch, allerdings wird dann der automatische Farbübergang recht ruckelig.
Eigentlich logisch, da die PWM ja eine Auflösung von 256 hat, und wenn ich einen dimmer-wert von 10 einstelle bleiben am ende nur noch 25 schritte übrig, das reicht nicht für einen sauberen farbübergang, und ich möchte eigentlich auch noch weiter runterdimmen können :wink:

Also, was tun sprach Zeus?
Wäre es eine Möglichkeit einen extra IRLZ vor die anderen zu schalten und diesen extra anzusteuern um die sache zu dimmen?
Oder bekomme ich da Probleme mit der PWM? Könnte man das PWM-Signal in ein 'echtes' Analog-Signal umwandeln um das zu vermeiden?
Die Auflösung des Arduino-PWM lässt sich ja meines Wissens nicht erhöhen, dafür bräuchte ich dann wohl den DUE oder?

Ich bin wür jeden Tipp dankbar!

Was für RGB Leds sind das?

PWM Signal in ein echtes AnalogSignal hilft da überhaupt nicht genauso wie den DUe als DAC zu nutzen.
Was du brauchst, je nach RGB Led wäre ein richtiger LED Treiber.

Es gibt Treiber ICs dafür. z.B.:

http://www.exp-tech.de/shields-module/led-controller/adafruit-12-channel-16-bit-pwm-led-driver-spi-interface-tlc59711

LEDs dimmen macht schon Sorgen...
Geht man mit dem Strom runter, spielen sie mit der Farbe....
Also kleinere LEDs rein, oder mehr PWM Auflösung...
Oder eben mit dem Farbspiel leben.

Nutze den ganzen Wertebereich des PWM-Ausgangs in Einerschritten aus.
Wenn dei LED zu hell sind ändere den Vorwiderstand damit weniger Strom durch die LED fließt.
Grüße Uwe

Zeitsklave:
Die Auflösung des Arduino-PWM lässt sich ja meines Wissens nicht erhöhen

Doch, das geht!
Timer1 library
Damit kannst du die Auflösung auf z.B.1024 Bit erhöhen und kannst ohne sichtbare Übergänge von Null an faden.

guntherb:

Die Auflösung des Arduino-PWM lässt sich ja meines Wissens nicht erhöhen

Doch, das geht!
Timer1 library
Damit kannst du die Auflösung auf z.B.1024 Bit erhöhen und kannst ohne sichtbare Übergänge von Null an faden.

Das Problem ist ja nicht, dass 255 Schritte zu wenig wären, sondern dass effektiv zu wenige davon genutzt werden können. Und dass die Stufung 0 - 1 - 2 - 3 sehr viel heftiger wirkt als z.B. 250 - 251 - 252 - 253
Die Lösung zum ersten ist Uwes verbesserter LED - Vorwiderstand.
Für das zweite Problem muss man den Timer-Interrupt mit eigenem Code kombinieren.

michael_x:
Das Problem ist ja nicht, dass 255 Schritte zu wenig wären, sondern dass effektiv zu wenige davon genutzt werden können. Und dass die Stufung 0 - 1 - 2 - 3 sehr viel heftiger wirkt als z.B. 250 - 251 - 252 - 253

Richtig, man kann LEDs nicht linear regeln, weil das Auge nicht linear ist. Das kann man in erster Näherung mit einer Quadratischen Funktion ausgleichen.
Dazu kommt aber, dass bei einer PWM auflösung von 8bit, also 256 Schritten, die Schritte 0,1,2 schon stark sichtbare Helligkeitssprünge haben, wenn 255 = volle Helligkeit ist.
Bei einer PWM Auflösung von 10bit (1024 Schritte) haben die Schritte 0,1,2 nur noch einen sehr kleinen Helligkeitssprung, so dass die Änderung der Helligkeit (fast) also stetig wahrgenommen wird.

Ich hatte das Problem, dass ich eine Beleuchtung von Dunkel langsam auf Hell fahren wollte und hatte eben auch das Problem mit den Helligkeitssprüngen am Anfang. Mit der 10bit PWM ist das nicht mehr sichtbar, bzw akzeptabel klein.

Eigentlich ist der Arduino doch auch schnell genug das PWM nicht über die Hardware sondern selbst zu erledigen. Solange dann nicht andere rechenintensive Prozesse auf dem MC laufen sollen, hat man alle Freiheiten was das Timing angeht.

Es gibt genügend Beispiele die damit ganze LED-Matrixen (Cubes) steuern ohne den Hardware-PWM zu nutzen.

Die Helligkeitsanpassung kann man dann auch mit einer Lookuptable realisieren und somit für jeden Helligkeitswert, sogar für alle 3 Farben separat, saubere Werte setzen.

Software PWM zu nutzen wenn doch der FastPWM Timer noch frei ist? Das macht keinen Sinn. Das mit der "Helligkeitsanpassung" ist soweit schon richtig. Dazu ist im Netz genügend zu finden -> LED-Fading – Mikrocontroller.net

Vielen Dank schonmal für die vielen Antworten :slight_smile:

Also größerer Vorwiderstand finde ich jetzt nicht so prickelnd, weil dann ja meine LEDs dauerhaft gedimmt sind, aber bei Bedarf möchte ich ja auch mal die volle Power ^^
Man muss natürlich auch noch sehen wie die Helligkeit dann später im Sternenhimmel wirkt, und ggf Anpassungen vornehmen. Das lässt sih jetzt schlecht einschätzen wie sich das dann verteilt.

Die Sache mit dem Nicht-Linearen empfinde ich jetzt nicht so als Problem, man merkt halt dass das Dimmen im hellen bereich deutlich langsamer abläuft als im Dunklen. Aber das stört mich eigentlich nicht besonders. Was mich dabei eher stört dass die voreingestellten Farben alle recht blass und undeutlich sind, ich hab die RGB-Werte einfach von Farben am PC übernommen. Aber das lässt sich ja problemlos durch einstellen meiner Wertetabellen korrigieren. Hatte nur noch nicht die Muse dafür :wink:

Das dimmen an sich verläuft sauber und ohne erkennbare Farbänderung, nur eben ruckelig im dunklen Bereich.

Die Sache mit Timer1 klingt sehr vielversprechend.
Ich bin allerdings ein gebranntes Kind: Die erste Version meiner Steuerung hatte ich auf Arduino Nano am laufen. Und da hatte ich das Problem dass der Timer, den die Lib für den IR-Empfänger verwendet, auf einem der 6 PWM-Kanäle liegt, die ich ja alle verwende bei 2 Stück RGB-LEDs.
Ich hatte dann kurzerhand einen zweiten Nano genommen und Fernbedienung und LED-Steuerung getrennt. Das ganze mit einem primitiven bus verbunden und fertig. Nicht schön, hat aber funktioniert.
Mittels Software-PWM oder Multiplexing oder was auch immer hätte vermutlich ein Nano für alles ausgereicht, war mir aber zu aufwändig :wink:
Inzwischen läuft die Sache auf dem Mega, der das alles gleichzeitig problemlos handeln kann.

Ich werde dann beizeiten mal versuchen die Timer1-Lib zum laufen zu bringen...
Sollte das klappen wäre mein Problem erledigt :slight_smile:
Vielen Dank schonmal, ich melde mich dann wieder!

Ein Mega für 2 RGBs? Du hast immer noch nicht gesagt, um welche RGBs es sich hierbei handelt.
Ggf könnte ein WS2811 IC Abhilfe schaffen.

Der Mega macht das super, ja :wink:

Es sind 3x3W LEDs, Hersteller kann ich dir leider nicht sagen, war ein billig Angebot bei ebay und ist schon eine zeit her...

Was genau würde mir der WS2811 nutzen?
Wenn ich das im Datenblatt richtig sehe, schicke ich ihm ein kombiniertes Signal für alle 3 Farben das er mir dann nur wieder zerteilt und an die 3 Farben weitergibt. Ich sehe nur zusätzlichen programmieraufwand!
Zumal er offenbar auch nur mit 8bit läuft, also wieder nur 256 Stufen.
Oder täusche ich mich?

Das du für die ganze Sache keinen unnötigen 2560 brauchst. Die ganze Applikation kann problemlos auf einen kleinen Attiny laufen.

WS2811 geht bei den Leds nicht. Gibt auch noch eine Nachbau/Weiterentwicklung mit 10Bit oder 12Bit, weiß gerade nicht mehr genau wie die hießen Lxxxx.

Alternativ selber eine Schaltung entwickeln. zB hc595 mit Software PWM ansteuern und daran die LED Treiber.

Und wenn ich aber gerne einen Mega verwenden will? :wink:
Ich verwende 6 PWM-kanäle, lese einen IR-empfänger aus, speichere daten auf dem EEPROM und mache ausgaben per serial. Incl aller libs hat mein sketch momentan gut 20kb.
Einen Mega habe ich eben grade da, und den brauche ich nur per usb an den pc zu stecken und die sache lässt sich total einfach programmieren (naja wenn die leds an sind brauch ich noch ein netzteil ^^)

was ist so schlimm daran wenn ich da einen mega verwende, auch wenn der etwas überdimensioniert ist?

OK, wenn es den IC auch mit 10bit und 9W belastbarkeit gibt wäre das eine überlegung. Wenn nicht, sehe ich keinen Vorteil zu meiner Mega/IRLZ-kombination...

Was genau würde mir hier ein 8bit schieberegister nutzen?

Edit: Versteh mich bitte nicht falsch, ich will dich auf keinen fall angreifen und bin für jede Hilfe sehr dankbar!!
Ich sehe nur nicht ein, bzw verstehe nicht warum ich es mir komplizierter als nötig machen soll!

Nein, den 10Bitter gibt es auch nur für 20mA. Wieso 8 Bit Schieberegister sagt nur aus, dass du 8 Ausgänge hast. Die PWM erfolgt bei dem HC595 über Software PWM.

Alternativ mal http://www.elcojacobs.com/using-shiftpwm-to-control-350ma-high-power-leds-with-arduino/ anschauen

Entschuldige, wie steuerst Du das POWER-LED denn an?
Grüße Uwe

uwefed:
Entschuldige, wie steuerst Du das POWER-LED denn an?
Grüße Uwe

na ganz einfach ... 6 pwm-ausgänge vom arduino und und 6 IRLZ34N, für jede farbe einen. sieht dann etwa so aus wie auf dem bild, nur ohne die BC549, und mit anderen werten für die vorwiderstände.

der link sieht sehr hübsch aus :slight_smile:
aber wenn timer1 funktioniert bleib ich bei meiner lösung, nur hab ich bisher weder zeit noch muse gefunden um das einzubinden...

leds.jpg

Den Aufbau finde ich jetzt nicht so super.

Besser wäre es, an Gate (wo derzeit 10k) dran steht, einen 330Ohm Widerstand einzusetzen. Zwischen dem Widerstand und dem Gate sollte noch ein 10k oder größer nach GND gezogen werden. Den Widerstand für die Leds würde ich oberhalb zwischen Drain und der Kathode setzen.

Was genau würde die Änderung bewirken?

Nach genauerer betrachtung der timer1 lib muss ich feststellen dass die ja nur 2 pins mit pwm bedienen kann :wink: nutzt mir in dem fall leider nichts, das würd mir allerdings was nutzen wenn ich was in der richtung hc595 verwenden würde...

ich werd die sache wohl mal im sternenhimmel verbauen wie sie ist, und dann sehen wie es wirkt. vielleichts passt das schon so, und wenn nicht kann ich immernoch was basteln :smiley: