LED PWM Dimmer flackern/flimmern nur an bestimmten Pins

Liebe Arduino Freunde,

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...

Danke und Gruß
Phil

Die Pins 5 und 6 hängen an Timer0, welcher auch für millis() usw. zuständig ist.

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.

Grüße Uwe

hi,

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.

gruß stefan

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.

Grüße Uwe

hi,

achso, uwe, Du sprichst von KSQs. die gibt's ja bei mir nicht...

gruß stefan

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.

Aber, wenn ich Dich richtig verstehe, sollte ich für den PWM Betrieb lieber sowas hier bauen?
http://www.mikrocontroller.net/articles/Konstantstromquelle#Konstantstromquelle_mit_Komparatoren

Gruß Phil

@philberlin

Welche Led-Spots hast Du? Haben sie eine integrierte Konstantstromquelle?
Falls ja, kannst Du keine 2 Konstantstromquellen in Serie schalten.

Grüße Uwe

Oha, wie erkenne ich das? Ich verwende die folgenden:

G-Glow MR16

Die wird als dimmbar beschrieben. Frag mal den Verkäufer wie man sie dimmen kann bzw ein Datenblatt.
Grüße Uwe

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.

Ok, ich hab den Verkäufer kontaktiert. Bin gespannt ob der Spot eine KSQ beinhaltet.

Hier ist mein Schaltplan. C1 und C2 sind Kerkos, der C3 ist ein Tantal.

Wie müsste ich denn den Kondensator am DC dimensionieren? Würde es in jedem Fall mal ausprobieren.

Vielen Dank für eure Hilfestellung!

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.

Der Support hat sich gemeldet:

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?

Netter Verkäufer, sagt nur das was wir schon wissen.
Das WIE DIMMEN hat er vergessen?
Grüße Uwe

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. :slight_smile:

Du kannst trotzdem mal spaßhalber die PWM Frequenz hochdrehen:
http://playground.arduino.cc/Main/TimerPWMCheatsheet

Das sollte man aber auch nicht an Timer0 machen, da daran millis() und delay() hängen. Also besser Timer1 oder Timer2 ändern.

Ob es was bringt weiß ich nicht. Vielleicht stimmt die Aussage auch dass es keine Rolle spielt, obwohl die Begründung nicht sehr überzeugend ist.

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.

Nein, das ist Arduino-eigener Code der auf micros() beruht. Schau dir mal wiring.c an

void delay(unsigned long ms)
{
	uint16_t start = (uint16_t)micros();

	while (ms > 0) {
		yield();
		if (((uint16_t)micros() - start) >= 1000) {
			ms--;
			start += 1000;
		}
	}
}