Flackern beim Dimmer

OP #638983
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
Angehängte Dateien:
Gast #639217
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
OP #640003
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

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.