ich beschäftige mich seit einiger Zeit intensiv mit der Möglichkeit drei 12V/5W Led-Spots mittels eines Arduino über ein PWM Signal zu dimmen. Ich hab echt viel gelernt in letzter Zeit und wollte mein Wissen zum einen teilen und andererseits mein eigenes Halbwissen etwas vervollständigen.
Mein Problem war, dass die LEDs angefangen haben zu flackern bzw. zu flimmern, sobald die LEDs gedimmt wurden. Lange hab ich mich mit Tiefpassfiltern beschäftigt und andere Möglichkeiten diese Störungen in den Griff zu bekommen.
Die Lösung war aber sehr viel einfacher: Es lag an der Wahl der Pins. Mir ist aufgefallen, dass das Flackern immer dann aufgehört hat, sobald ich den Spot an Pin 6 abgeklemmt habe. Die anderen beiden Spots hängen an Pin 3 und Pin 11. Ich dachte zuerst es liegt am Mosfet (IRLZ34N), aber ein Austausch hat keine Besserung gebracht. Dann dachte ich es liegt ev. am Arduino Nano. Ich hab den dann durch einen Arduino Micro ausgetauscht, aber das Problem wurde dadurch auch nicht gelöst. Die Lösung war ganz einfach, anstatt die Pins 3, 6 und 11 zu verwenden, verwende ich jetzt 3, 10 und 11. Das Flackern hat sowohl am Nano als auch am Micro aufgehört und alles funktioniert nun bestens.
Ich würde nun aber gerne wissen, warum das so ist? Warum stört der Pin 6 (Pin 5 übrigens auch) die komplette Schaltung so, dass es zu einem Flackern bei den LEDs kommt? Das würde mich sehr interessieren...
Das für den Arduino UNO gesagte gilt auch für den Arduino NANO und das für den Arduino Leonardo gesagte gilt auch für den Arduino MICRO.
http://www.arduino.cc/en/Reference/AnalogWrite:
The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz.Pins 3 and 11 on the Leonardo also run at 980 Hz
Der Unterschied beim UNO / NANO ist: Pin 5 und 6 haben ein PWM mit ca 980Hz, die anderen 4 PWM pins eine Frequenz von 490Hz.
Das Problem ist das Netzteil für die LED. Dieses wird wahrscheinlich nicht für PWM Betrieb ausgelegt sein (hat keinen PWM Eingang) darum hast Du nur Glück das mit einer bestimmten Frequenz funktioniert funktioniert.
Ich rate Dir aber von einem PWM-Betrieb a,b da dies außerhalb der Spezifikation des Netzteils ist.
uwe, wie meinst Du das? es wird doch hoffentlich in diesem fall nicht das netzteil per PWM versorgt, sondern die 12V vom netzteil mittels MOSFETS moduliert. oder kann es da auch probleme geben? weil dann könnte ich nur hoffen, daß meine lichtschaltung mit ShiftPWM und 40 LED-lampen überhaupt funktioniert.
Ich weiß nicht wie er die Netzteile / Konstantstromquellen / LED steuert.
Eingangsseitig der Konstantstromquelle und Ausgangsseitig kann es Probleme geben. Eingangsseitig weil dauernd die Versorgung wegbleibt, Ausgangsseitig weil die KSQ dauernd nachregeln muß und die Ausgangsspannung bei jedem Abklemmen hochfährt.
Beide Szenarien können Probleme und Schäden verursachen.
Am besten und sichersten sind KSQ mit PWM Eingang.
Verstehe, dann kam das Flimmern von den unterschiedlichen PWM-Frequenzen.
@Uwe: Tatsächlich hatte ich das Problem, dass der Arduino beim Dimmen plötzlich stehen geblieben ist oder rebootet hat. Das hab ich mit ein paar Stützkondensatoren (2x47nF + 1x4,7uF parallel an VIN und GND) aber einigermaßen gut in den Griff bekommen.
Die LEDs hängen direkt an nem 12V Netzteil (Voltkraft 42 Watt) und werden dann über die MOSFETs gesteuert. Der PWM Wert wird dann mittels eines Potis ermittelt. Aber wie gesagt, ich hab viele unterschiedliche Kondensatoren getestet, bis es einigermaßen gut lief.
Die Angaben beziehen sich leidiglich auf das Leuchtmittel. Das Leuchtmittel scheint intern bereits eine KSQ zu nutzen. Sollte somit mit dem Mosfet eigentlich gehen. Zeig mal deinen Schaltplan her. Ggf. dicke Kondensatoren parallel zum Netzteil.
Ich würde überlegen, an VIN einen gesonderten Spannungsregler (LM1117-5V / AMS1117-5V) einzusetzen. Der Spannungsregler ist nur für kleine Leistungen ausgelegt. Bei 12V müssen 7V in Wärme umgesetzt werden. Das aber nur empfehlenswert, spielt aber bei dem Problem eher keine Rolle.
Die Auswahl der Widerstände geht soweit in Ordnung (kannst R1 auch auf 330 Ohm erhöhen).
Die Kondensatoren geben hier nicht sonderlich viel Sinn. Auf dem Board sind für den AVR bereits welche verbaut.
Der Kondensator für das Netzteil dient zur Minimierung von Spannungsspitzen, die ggf. dein Netzteil kurzzeitig in die Knie zwingen. Da kannste das ganze Austesten. Würde dort aber schon einige 1000µF einsetzen.
Bei dem Preis der Leds gehe ich davon aus, dass dort eine KSQ verbaut ist. Einfache Leds in Reihe + Widerstand wäre doch etwas zu einfach. Warte am besten ab, was der Hersteller dir zur KSQ sagt. Es gibt KSQ, die mit 480/980Hz nichts sinnvolles anfangen können. Typischer sind hier PWMFrequenzen von 4kHz - 10kHz.
Intern werden unsere sämtlichen dimmbaren LEDs per Konstantspannung betrieben.
Die MR16 und G4 sind generell auch von extern per 12V Konstantspannungstrafo zu betrieben.
Wichtig ist Konstantspannung! Nicht zu verwechseln mit Konstantstrom.
12V Konstantspannungstrafo vs. 12V Tischnetzteil? Sollte eigentlich nicht das Problem sein oder?
Vermutlich wie die einfachen 12V DC Dimmer. Mit PWM, jedoch ist aufgrund fehlender Information, um welchen KSQ IC es sich handelt. Versuche mal, in dem du die PWM Frequenz im Arduino hochsetzt.
~8kHz sollte gehen.
TCCR0B = TCCR0B & B11111000 | B00000010;
Wie das in Arduino aussieht, muss wer anders schreiben, hatte das nie gemacht.
Also ich hab den Support nochmal angeschrieben und gefragt, ob es zu Problemen kommen kann, wenn man den Spot per 490Hz PWM Signal dimmt. Der Support antwortete, dass es dabei keine Probleme geben sollte, da dieser für eine PWM Dimmung ausgelegt ist.
Prinzipiell funktioniert das Dimmen ja auch. Lediglich der Arduino bleibt manchmal stehen, wenn man das Poti von 0 hochfährt. Verschiedene Elkos (1000uF, 2200uF, 3300uF und 4700uF) parallel zur Spannungsquelle lösen das Problem leider auch nicht.
Ich werde noch weitere Tests machen und die Lösung posten, wenn ich eine finde. Zumindest flackern die LEDs schon mal nicht mehr.
Vielleicht rücken die ja auch mit dem IC Typ raus. Höhersetzen würde ich auf jedenfall versuchen. Gerade wenn du in die sehr niedrigen analogWrite-Werte gehst.
@Stefan, seit wann braucht delay() Timer0? Die ist doch in der IDE nichts anderes als _delay_ms(...). Mit der einzigen Ausnahme, dass keine fixen Werte erforderlich sind.