Forum: Mikrocontroller und Digitale Elektronik Flackern beim Dimmer


von Alex R. (geneo)


Angehängte Dateien:

Lesenswert?

Hi, ich hab da ein (kleines?) Problem: Ich habe jetzt einen PWM-Dimmer 
programmiert. Klappt auch soweit ganz gut, bis auf eine Ausnahme: Der 
Dimmer flackert beim faden. Ich habe auch die Werte überprüft, aber 
irgendwie find ich keinen Fehler. Zumal das Flackern auch nur vereinzelt 
und sehr unregelmäßig kommt, als ob da Spannungsschwankungen sind.
Zum Code:
Ich lass die 1. und 6. LED ausfaden. Bei ca. jedem bis jedem zweiten 
Durchgang kommt es unterschiedlich oft ( ein bis ca. 10 mal ) zu einem 
sehr kurzen Aufleuchten.
Hoffentlich kann mir einer von euch sagen, woran es liegt...
Gruß,
Alex

von Fred (Gast)


Lesenswert?

Hi,

ich schätze mal, dass das daher kommt, dass Du den Sollwert für die PWM 
auf einen Wert setzt, der kleiner als der Istwert ist. Beispiel:

alter PWM Wert = 100
neuer PWM Wert = 50

Wenn Du jetzt im Bereich von 0 bis 49 umschaltest, dann wird der Wert 50 
erkannt und sofort der neue Wert übernommen.
Wenn Du aber schaltest, wenn der Wert zwischen 50 und 100 liegt, dann 
läuft erstmal der Timer über und nochmal bis zur 50, bis dieser Wert als 
Compare Match erkannt wird. Damit ist Deine PWM für eine Periode auf 
100% und verursacht ein kurzes Aufleuchten.
Abhilfe schaffen best. PWM Modi, Stichwort "glitch" bzw. "glitch free"
Gruß

Fred

von Alex R. (geneo)


Lesenswert?

Vielen Dank. Das mit den Phasen ohne Ausschalten wegen der Extrarunde 
war auch ein ursprünglicher Gedanke von mir, allerdings habe ich ihn zu 
früh verworfen, da ich mein Programm so strukturiert habe, dass dieser 
Fall verhindert wird. Stichwort Doublebuffering. Tatsächlich hattest du 
Recht, da ich eine Zeile zu weit vorn hatte:
"while ( intern_buffer != buffer ) ;"
Das Aktualisieren der Dimmkonfiguration wurde blockiert, bevor die 
Konfiguration im ersten UND zweiten Buffer aktualisiert wurde. Daraus 
entstand sporadisch folgende verheerende Situation:
Es wird gewartet, bis die Timerroutine den aktuellen Buffer benutzt, 
dann wird der inaktive aktualisiert und der Buffer auf den inaktiven 
geswitcht. Danach wird der zuvor aktive Buffer aktualisiert.
Bei dem Schritt im vorigen Satz passiert nun die von dir beschriebene 
Situation: Da der nun inaktive Buffer geändert wird, obwohl noch _unter 
Umständen_ die Timer-Routine darauf zugreift, können Extrarunden 
entstehen.

Die erwähnte Warteroutine musste also nur direkt nach dem Bufferswitch.

Zur Zeit überlege ich, aus dieser Endlosschleife etwas besseres zu 
machen, da sie doch so ziemlich die Fade-Geschwindigkeit reduziert.

Liebe Grüße,
Alex

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.