Einfaches LED-Fading

OP #4643084
Lesenswert?
• ▲
▼
Hallo Bastler,

unter https://www.mikrocontroller.net/articles/LED-Fading wird das 
physiologische Dimmen von LEDs behandelt.

Die Helligkeit wird per PWM gesteuert. Es geht darum, wie gesteuert 
wird, damit Personen ein gleichmässiges Dimmen wahrnehmen. Wir nehmen 
die Änderung von Helligkeit und anderen Sinneseindrücken nicht linear 
sondern proportional zum aktuellen Wert war 
(https://de.wikipedia.org/wiki/Weber-Fechner-Gesetz).

ΔR = k * R

R ist die Helligkeit die bei LEDs dem Strom entspricht.

Das kennen wir doch: Die Änderung der Spannung eines über einen 
Widerstand entladenen Kondensators ist proportional der Spannung am 
Kondensator. Die obige Schaltung wird beim Ausschalten, die Helligkeit 
der LED physiologisch korrekt steuern. Beim Einschalten hat sie leider 
den gegenteiligen Effekt. Aber es geht hier nur um das Prinzip.

Die digitale Lösung ist relativ einfach. Beim Hochdimmen beginnen wir 
mit einem Wert und addieren einen zum derzeitigen Wert proportionalen 
dazu.

R(n+1) = Rn + k * Rn

Mit K = 1 ist das simpel:
R(n+1) = 2 * Rn

Das kann auch mit einem Prozessor ohne Multiplikation einfach realisiert 
werden: shift nach links. Mit R1 = 1 können wir acht Stufen mit 8 Bit 
realisieren. (Die 256 sind keine 8 Bit: Bei Überlauf 255 nehmen).

Abdimmen ist damit

R(n+1) = Rn - k * Rn

Mit k=0.5 ist
R(n+1) = Rn / 2

Das ist einfach shift nach rechts.

Feinere Stufen ergeben sich mit k = 1 ± b. Dann ist

R(n+1) = Rn ± b * Rn

Wird b als 1/2**p gewählt, ist das einfach auf einem Mikrocontroller zu 
bewältigen. Mit 16-Bit-Zahlen (hier als Perl-Programm geschrieben) kann 
man 24 Werte z.B. für einen 10-Bit-PWM-Ausgang einfach erzeugen.

print "Abdimmen: Faktor = 0.75 = (1 - 1/4)\n";
my $value = 2**16-1; # Anfangswert = Full-House
for ( 1 .. 24 ) {
   my $pwm_value = $value >> 6; # 10Bit
   print "$pwm_value\n";
   $value = $value - ($value >> 2);
};

Im anhängenden Perl-Programm sind andere Beispiele.

Das Abdimmen ist ziemlich einfach. Beim Aufdimmen muss ein passender 
Anfangswert ermittelt werden.

Diese physiologischen Dimmer können leicht für Mikrocontroller 
programmiert werden. Es wird keine Multiplikation / Division und ebenso 
keine Tabelle benötigt.

Ich werde einen Dimmer mit einem PIC realisieren.
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.