Arduino analogWrite funktioniert nicht richtig -was mache ich falsch?
Hallo
Ich habe heute meinen ersten Arduino gekauft (Mega 2560) und wollte nun über analogWrite die Helligkeit einer LED steuern. Der Sketch im Loop dazu lautete wie folgt:
analogWrite(led, 250);
delay(500);
analogWrite(led, 200);
delay(500);
analogWrite(led, 150);
delay(500);
analogWrite(led, 100);
delay(500);
analogWrite(led, 50);
delay(500);
analogWrite(led, 0);
delay(500);
Nur funktioniert es nicht. Die LED leuchtet immer entweder voll oder gar nicht. Wenn ich aber z.B. nur folgendes mache:
analogWrite(led, 255);
delay(500);
analogWrite(led, 100);
delay(500);
funktioniert alles perfekt.
Ich wäre sehr dankbar, wenn jemand wüsste, an was das liegt.
3 Antworten
Also ich kann mir nicht erklären, warum das eine Programm funktionieren soll und das andere nicht, denn soweit ist erst einmal alles richtig. Folgendes gebe ich aber zu bedenken:
- Der Wert von led muss auf einen Pin verweisen, der auch PWM unterstützt.
- Du darfst die Timer, die PWM auf den jeweiligen Pins realisieren, nicht für andere Zwecke verwenden, z.B. um Geräusche über tone() auszugeben oder Servo-Motoren zu steuern.
- Die Helligkeit der LED verändert sich nicht linear. Je nach LED-Typ kann es sein, dass zwischen 150 und 250 kaum Helligkeitsunterschied bemerkbar ist, während es bspw. zwischen 50 und 100 dann sehr schnell dunkel wird. Vielleicht versuchst du mal andere Abstufungen. Du könntest testweise auch einmal diese Schleife probieren:
for (byte n=255; n>=0; n--) {
analogWrite(led, n);
delay(20);
}
Diese durchläuft innerhalb von ca. 10 Sekunden alle Helligkeitsstufen.
Analog-Write benutzt den DAC des Mikrocontrollers, heißt, er wandelt ein digitales Signal in eine Ausgangsspannung um.
LEDs werden aber nicht über die Spannung geregelt, sondern über ihren Strom oder besser über Pulsweitenmodulation.
Nimm also nicht den DAC Ausgang deines Mikrocontrollers, sondern einen PWM-Ausgang und steuere die Helligkeit der LED über die Pulsweite.
Was ist denn der zweite Sketch und der erste?
Ich seh gerade, dass die Arduino-Library wohl "AnalogWrite" zur Ausgabe von PWM-Signalen nutzt - finde ich etwas irreführend genannt aber nagut.
Beachte mal hier unten den Hinweis:
https://www.arduino.cc/reference/de/language/functions/analog-io/analogwrite/
Versuch die Implementierung mal ohne "Busy Waiting" mit Hilfe von "delay" sondern anders zu lösen, eventuell kommen sich die Timer in die Quere.
Wie kann man die Implementierung anders lösen als mit Delay? Sorry, bin noch totaler Anfänger und habe auf die Schnelle jetzt grad auch nichts dazu gefunden auf Google.
Also der erste Sketch, der nicht funktioniert hat, ist:
analogWrite(led, 250);
delay(500);
analogWrite(led, 200);
delay(500);
analogWrite(led, 150);
delay(500);
analogWrite(led, 100);
delay(500);
analogWrite(led, 50);
delay(500);
analogWrite(led, 0);
delay(500);
und der zweite Sketch, der funktioniert hat, ist:
analogWrite(led, 255);
delay(500);
analogWrite(led, 100);
delay(500);
An welchen Pin hast du die LED angeschlossen?
Ich habs mit verschiedenen Pins zwischen 2 und 13 versucht, z.B. mit Pin 6 habe ichs sicher probiert.
Also es funktionieren nur die Pins 3, 5, 6, 9, 10, 11. Also nur PWM Pins. Vielleicht kannst du mal deinen ganzen Code schicken. mit Setup und allen Variablen
Ich glaub ich hab das schon über PWM gemacht. Hätte sonst nicht der 2. Sketch, den ich gemacht habe, gar nicht erst funktioniert?