LED linear in der Helligkeit steuern

Hallo,

ich benutze einen ESP-201 und folgende Funktion in meinem Sketch, die in der Setuproutine aufgerufen wird.

void Licht_A_fade_in() {
  float T; 
  // Calculate the T variable
  T = (pwmIntervals * log10(2)) / (log10(254));
  // fade in from min to max:
  for (int interval = 0; interval <= pwmIntervals; interval++) {
    // Calculate the required PWM value for this interval step
    brightness = pow (2, (interval / T)) - 1;
    // Set the LED output to the calculated brightness
    Serial.println(brightness);
    analogWrite(LICHTAPIN, brightness);
    delay(30);
    Serial.println(brightness);
  }
}

damit soll eine LED-Lampe, linear in ihrer Helligkeit von 0-100% "hochfahren".
der Wert von "pwmIntervals" ist 100. Es funktioniert auch soweit, doch leider habe ich beim ansteuern der LED-Lampe 2-3 mal ein kurzes flackern, es ist auch davon abhängig welchen pwmAusgang ich benutze. Das beste Ergebniss erreiche ich bei GPIO4 (nur ein kurzes flackern), bei GPIO5 sind es zwei drei mehr. Woher kommt der Unterschied?
Ich benutze die obige Berechnung von "brightness" auch um die Lampe gezielt z.B. auf 50% zu stellen, was auch rein optisch so funktioniert (50% = halbe Helligkeit).
Bestimmt mache ich einen Fehler, komme leider aber nicht weiter.

Was passiert denn, wenn du in einer Schleife per inkrementieren die Helligkeit hochfährst?

ich weiß nicht ob ich dich richtig verstanden habe, aber ich habe das jetzt mal so ausprobiert. Das flackern ist jetzt noch viel stärker und öfter.

void Licht_A_fade_in() {
 for (int brightness = 0; brightness <= 100; brightness++) {
   
   Serial.println(brightness);
   analogWrite(LICHTAPIN, brightness);
   analogWrite(LICHTCPIN, brightness);
   delay(30);
  // Serial.println(brightness);
 }
}

die meiste Zeit sieht das "fading" echt sauber aus, reproduzierbar beginnt sie an bestimmten Wertigkeiten beim hochzählen kurz zu flackern.

Kannst du an den Ausgang per einfachem Transistortreiber mal direkt eine LED legen und schauen, ob die auch flackert? So kann man erst mal eingrenzen, ob es ein Hard- oder Softwareproblem ist. Ich hatte auch schon mal bei einer schnell zusammengekloppten Schaltung, das ein Dimmer an 2 Stellen Helligkeitssprünge hatte.

gute Idee!
Ich habe jetzt eine einfache (lowCurrent) LED mit Vorwiderstand direkt an den Ausgang geklemmt, jedoch zeigt sie dasselbe verhalten. Auch ist das flackern unterschiedlich aber reproduzierbar, je nachdem welchen Ausgang ich benutze.
Kann das an unterschiedlichen Timern im ESP liegen? Wie blockierend ist den "delay", wird der Ausgang in der Zeit überhaupt angesteuert? Aber dann müsste es nach jedem inkrementieren flackern, oder nicht?

mh, da muss ich mir am Montag wohl ein Oszi mitnehmen und das PWM mal anschauen, vielleicht werde ich dann schlauer. Ist er evtl zu langsam?
Ich denke dass mit dem "delay" kann ich ausschließen, da die Funktion ja nur im "setup" aufgerufen wird.
Programmieren ist bei mir halt immer eher so ein "try and error" :roll_eyes: , bei der hardware bin ich mir schon sicherer..

Ich bin mir nicht sicher, ob die verwendete Formel wirklich paßt. Bei PWM wird die LED immer im gleichen Arbeitspunkt betrieben, nicht mit dem durchschnittlichen Strom entsprechend dem Tastverhältnis. Damit müßte die gefühlte Helligkeit direkt dem Tastverhältnis entsprechen.

Das Flackern hat natürlich andere Ursachen.

ich kann dir nicht sagen warum aber "die gefühlte Helligkeit zum Tastverhältnis" ist bei LEDs absolut nicht gegeben und passt mit obiger Formel viel besser (bestimmt gibt es besseres).
Ohne hast du am Anfang recht viel Helligkeitsanstieg und gegen Ende fast gar nichts mehr.

2-3 kurze Aussetzer habe ich leider auch beim einfachen inkrementieren. Vielleicht liegt es ja auch an meinen Boardeinstellungen die ich in der IDE benutze? Der Upload funktioniert ganz normal und ich kann auch alles ansprechen..

Hallo,

nutze mal eine vorberechnete Tabelle (array) für die nicht logarithmische Helligkeitssteuerung. Vielleicht gibts bei der Berechnung manchmal Aussetzer. ?

hi,

leg' Dir lieber ein array an. das klingt erstmal wie speicherverschwendung, aber die library für die fließkommaberechnungen braucht wesentlich mehr. unelegant, aber wesentlich effizienter....

und falls Du wirklich schönes fading brauchst, kommst Du um sowas wie PCA9685 nicht herum. fertige platine um 2 euro für 16 kanäle mit 12bit-pwm.

gruß stefan

ich denke ich weiß jetzt woran es liegt :cold_sweat: die von mir benutze Formel ist schön und gut um wie z.B. bei mir, empfangene 0-100% Werte in eine nicht logarithmische Helligkeitssteuerung umzuformen, d.h ich kann mit den Werten meine Lampen direkt anfahren. Zum faden ist das aber mißt, weil mit der Formel Werte übersprungen werden und wird beim "faden" im Prinzip auch garnicht benötigt.
Mit einer einfachen LED habei ch bei einfahcen hochzählen keine Probleme, der Rest ist wohl dem Treiber meiner Lampe geschuldet.

Danke für den Tipp mit dem PCA9685, das werde ich jedenfalls ausprobieren.

Hallo,

dann wird deine Formel falsch sein. Lineare Helligkeitssteuerung und sauberes Fading gehört nämlich zusammen. Von "nicht nötig" kann demzufolge wirklich keine Rede sein. Ob man vorberechnet oder nicht, die Formel dazu ist die gleiche.

Da kommen zwei nichtlinieare Kennlinien zusammen, einmal die für die LED, und dann noch die Empfindlichkeit des Auges - deshalb habe ich ja schon "gefühlte" Helligkeit geschrieben. Nur hatte ich dabei noch übersehen, daß das Auge auch eine krumme Kennlinie hat.

Deshalb dürfte der Ansatz über eine Tabelle wohl am einfachsten sein,

LED-Fading mit Tabelle:
https://www.mikrocontroller.net/articles/LED-Fading

Doc_Arduino:
Hallo,

dann wird deine Formel falsch sein. Lineare Helligkeitssteuerung und sauberes Fading gehört nämlich zusammen.
...

Stimmt, diese Erkenntnis habe ich jetzt auch gewonnen, da habe ich eine Weile gebraucht um den Zusammenhang genau zu verstehen :).

Dabei wollte doch nur das die Deckenbeleuchtung in meiner Lüche sauber hochdimmt, jetzt gibt das was wieder was größeres, zumindest für mich :o

Danke für den link

hi,

ich verstehe das problem nicht ganz. wenn Du einfach nur hochdimmen willst, ist es doch egal, ob das anfangs schneller geht und dann langsamer. wenn es etwa eine sekunde dauern soll, würde ich einfach nur in 2 sekunden von 0 bis 255 hochdimmen. nach einer sekunde bist Du bei 50% und hast fast schon volle helligkeit. in der zweiten sekunde ändert sich dann kaum was.

anders sähe es aus, wenn Du das licht wirklich dimmen wolltest. dann will man ja von einer stufe zur nächsten eine annähernd gleiche änderung. dafür sind dann solche berechnungen und die sich daraus ergebenden tabellen nichts wert, weil bei den niedrigen werten oft die gleiche zahl kommt. z.B. eine tabelle aus dem link oben:

0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23, 27, 32, 
38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255

gruß stefan

Kurzer Einwurf meinerseits: Wenn man eine Gamma-Korrekturtabelle auf eine 8 Bit PWM legt, verringert sich natürlich die nutzbare Farbtiefe auf 7 oder noch weniger Bit.

Bei langsamen Fades führt das u.U. zu sichtbaren Sprüngen zwischen benachbarten Helligkeitswerten.

Da hilft - soweit mir bisher bekannt - nur ein Trick: Temporal Dithering. Funktioniert wie "normales" Dithering, aber eben zeitlich, nicht räumlich. Bedeutet, man fährt die LED mit möglichst vielen fps und erzeugt dann die Illusion von einem feiner gestuften Farb- (bzw. Helligkeits) Raum, indem man die 8 Bit Werte nochmals zeitlich moduliert.

Beim Dithering wird die Hardware PWM der LEDs durch eine Software PWM moduliert, um die gefühlte (gesehene) Auflösung im unteren Bereich zu erhöhen und das logarithmische Helligkeitempfinden des menschlichen Auges auszugleichen.

Damit bekommt man auch den groben Sprung zwischen Helligkeit 0 und 1 (von 255) weg - und das mit nur 8 Bit Hardware Farbtiefe.

Simples Beispiel: Wenn man schnell genug (mind. 100 Hz) zwischen Helligkeit 0 und Helligkeit 1 (von 255) umschaltet, erzeugt man den subjektiven Eindruck von Helligkeit 0,5.
Das kann man natürlich weiter nuancieren, indem man nicht nur 2 sondern mehrere Zwischenstufen via PWM oder BAM erzeugt.
Begrenzt ist das Ganze nur von der maximalen Ausgangsfrequenz des I/O Ports. Geditherte 16 Bit sind mit einem Standard-Arduino flackerfrei machbar.

Gruß, Helmuth

Man könnte die Helligkeit auch in konstanten Schritten (+1) hochfahren, und die Abstände zwischen den Schritten so anpassen, daß sich der gewünschte Helligkeitsverlauf einstellt.

Hallo,

dann wäre unnötig kompliziert und am Ende hat man in seiner Wertetabelle weiterhin einen nicht linearen Verlauf drin. Es führt kein Weg daran vorbei sich eine Tabelle anzulegen sodass die Änderung linearisiert erfolgt. Wenn es im unteren Bereich zu sprunghaft ist, dann hilft nur eine höhere Auflösung. Ob nun pseudo mäßig erzeugt oder hardwaremäßig ist egal. Mit dem Gammafaktor sollte man auch etwas experimentieren. Nicht alle LEDs reagieren gleich im unteren Bereich. Das heißt man kann durchaus den Nullpunkt rausschieben und hat damit für den Rest "mehr" Auflösung. Also wenn bei der Berechnung zu Beginn sich 0 und 1 oft wiederholen, fängt man eben mit der letzten 1 an mit seiner korrigierten Kurve. Man muß es etwas probieren wie es einem gefällt.

Wenn man eine Gamma-Korrekturtabelle auf eine 8 Bit PWM legt, verringert sich natürlich die nutzbare Farbtiefe auf 7 oder noch weniger Bit.

Wobei auf der Arduino Hardware auch mehr als 8 Bit PWM möglich ist wenn man es per Hand macht.