Hallo Forum, ich zerbreche mir gerade den Kopf über einen Algorithmus zum Dimmen einer LED anhand 2 Parametern, an/aus und Geschwindigkeit. Gegeben ist eine 16Bit Hardware-PWM mit angenommen positiver Logik, 1=an. Die empfundene Helligkeit ist ja logarithmisch abhängig vom PWM-Wert. Wenn man jetzt eine LED langsam an-dimmen möchte, fängt man erstmal an zyklisch die Werte zu erhöhen, als Beispiel: 1,1,2,3,5,8,12, ... (logarithmisch mit Faktor x). Die Geschwindigkeit des Dimmens legt man dann über die Zykluszeit fest. Soweit so gut, aber jetzt zum praktische Problem: Die Differenzen oder Stufen zwischen zwei Werten werden zum Ende hin immer größer. Beim schnellen Dimmen kein Problem, aber besonderes wenn man langsam dimmt, fallen die Helligkeitsstufen dann besonderes auf. Die Hardware könnte es ja besser, es gibt ja genügend PWM-Stufen dazwischen. Als Lösung kann man einfach den Faktor ändern und die Zykluszeit verkürzen, z.B. 1,1,1,1,1,2,2,2,3,3,4,5,6,8... . Aber dann ist schnelles Dimmen nicht möglich, weil es einfach zu viele Stufen zwischen an und aus gibt. Die theoretische Lösung wäre Timer verlangsamen, wenn > 1ms zwischen den Stufen, Stufen überspringen wenn < 1ms. Da das ganze aber diskret läuft (also z.b. von 1 ms bis 2 ms gibt es keine Zwischenstufen) geht die logarithmische Funktion verloren. Das habe ich ausprobiert und es sieht mies aus.
Ich suche also einen Algorithmus, der in 32 Bit Integer folgendes ausspuckt: nächste PWM-Stufen , Timer = Algo(aktueller PWM-Wert, Up/Down, Geschwindigkeit) Unter den Bedingungen:
- Timer > 1ms in 1ms Schritten
- PWM-Wert 0..1024 bis zu 0..4095
- Geschwindigkeit min 1 Sek bis 10min für einen kompletten Zyklus von an bis aus oder aus bis an.
- freier Speicher mir Flash ca. 2..4 kB (große Tabellen fallen aus) Irgendwelche Ideen?