RGB-LED-Fading: Divisionsprobleme
Hallo alle zusammen!
ich sitze hier momentan an einer RGB-LED Steuerung. Dabei ergibt sich folgendes Problem: Ich dimmer hier per Software-PWM LEDs mit 6bit Farbtiefe. Ich möchte nun zwischen zwei Farben faden. Dazu könnte ich einfach die Farben nacheinander je um 1 erhöhen oder erniedrigen und damit aufhören, wenn die gewünschte Farbe erreicht ist. Das hat aber den Nebeneffekt, dass nicht alle Farben zur gleichen Zeit ihren gewünschten Wert erreichen. Ich will, dass die LEDs über eine bestimmte Anzahl von Schritten ihre neue Helligkeit erreichen, sprich bei jeden Schritt genau um soviel erhöht werden, dass sie am Ende ihre gewünschte Farbe erreicht haben. Dazu gehe ich wie folgt vor:
Ich errechne die Differenz zwischen momentaner und gewünschter Helligkeit und teile diese durch die Anzahl der Schritte (nennen wir sie "n"). Dabei erhalte ich den zu erhöhenden oder zu verringernden Wert pro Schritt. Dann starte ich einen Interrupt und lasse diesen n-mal durchlaufen. Dabei addiere ich für jede LED diesen errechneten Wert. Rein rechnerisch müssten nach den n Schritten alle LEDs ihre gewünschte Helligkeit erreicht haben.
Das ist aber nicht der Fall, und je öfter ich dieses Fading wiederhole, desto mehr werden die Abweichungen sichtbar (ziemlich heftig sogar). Ich habe gelesen, dass die Division sehr ungenau ist. Welche Möglichkeit habe ich denn noch, die LEDs zu dimmen?
Vielen Dank,
Bääääär
Re: RGB-LED-Fading: Divisionsprobleme
Zitat:
Zitat von Bääääär
Hallo alle zusammen!
[...]
Ich errechne die Differenz zwischen momentaner und gewünschter Helligkeit und teile diese durch die Anzahl der Schritte (nennen wir sie "n"). Dabei erhalte ich den zu erhöhenden oder zu verringernden Wert pro Schritt. Dann starte ich einen Interrupt und lasse diesen n-mal durchlaufen. Dabei addiere ich für jede LED diesen errechneten Wert. Rein rechnerisch müssten nach den n Schritten alle LEDs ihre gewünschte Helligkeit erreicht haben.
Das ist aber nicht der Fall, und je öfter ich dieses Fading wiederhole, desto mehr werden die Abweichungen sichtbar (ziemlich heftig sogar). Ich habe gelesen, dass die Division sehr ungenau ist. Welche Möglichkeit habe ich denn noch, die LEDs zu dimmen?
Prinzipiell ist es egal, ob du Software- oder Hardware-PWM nimmst. Wenn die Ansteuerung nicht stimmt, ist es weder mit der einen noch mit der anderen Methode exakt...
Im Endeffekt läuft du Geraden mit unterschiedlicher Steigung entlang: die x-Achse entspricht der Zeit, die y-Achse entspricht der Helligkeit bzw. dem Duty der auszugebenden PWM. Vorgegeben sind Start- und Endhelligkeit(en) der einzelnen Kanäle, Start- und Endzeit(en) sind jeweils gleich.
Weil Division teuer und zudem ungenau ist, sollte man den Einsatz geschickterer Algorithmen erwägen.
Erwähnenswert ist hier der Bresenham-Algorithmus, wie er auch zum Zeichnen von Strecken benutzt wird und zB in vielen Grafik-Chips implementiert ist. Es ist seht effizient, kommt ohne Division aus und erreicht immer exakt seine Zielkoordinaten. Auch den AVR wird's freuen, da nur addiert, subtrahiert und verglichen wird:
http://de.wikipedia.org/wiki/Bresenham-Algorithmus
Ich verwende ihn zur Zeichnen von Linien in meiner Scope-CLock, aber für deine Zwecke ist er ebenfalls hervoragend geeignet.