PWM-Verständnis beim Arduino

Hallo.

Ich habe eine Verständnisfrage zum PWM-Ausgang. Vorweg: Ich benutze einen Arduino Mega und als Programmieroberfläche Labview. Die Kopplung ist über ein Custom-ROM erfolgt, da ich DHT22-Sensoren nutze.

Ich habe eine einfache LED zwischen GND und Ausgang 11. Die write-Funktion ist als Screenshot angehängt. Hier wird ja der Kanal (11) angegeben und die den Wert für die Frequenz, wenn ich das richtig verstehe. Dies ist ja von 0-255, man gibt aber einen Faktor von 0-1 an. Dieser wird dann prozentual auf die 255 umgerechnet.

Frage: gebe ich 0,01 an, sollte die LED ja langsam blinken. Das tut sie aber nicht, sie leuchtet konstant schwach aber es ist kein PWM-Blinken zu erkennen.

Beispiel wie es sein sollte hier:
https://www.labviewmakerhub.com/doku.php?id=learn:tutorials:libraries:linx:sparkfun_inventors_kit:led_brightness

Warum funktioniert das beim Arduino nicht bzw. wie funktioniert es hier?

PWM2.JPG

PWM.JPG

DutyCycle sagt nix über die Frequenz aus. Es sagt aus, wie groß der Anteil an "on" State ist.

1 = immer an
0 = immer aus
0,5 = hälfte an, hälfte aus

Wenn hier intern die Hardware PWM verwendet wird, dann ist die Frequenz fest. Du wirst dann kein Blinken sehen, weil die Frequenz zu hoch ist (ab 500Hz).

... und deine LED wird möglicherweise sterben oder den Arduino in den Tod reissen, weil Du den Vorwiderstand vergessen hast ...

TelosNox:
DutyCycle sagt nix über die Frequenz aus. Es sagt aus, wie groß der Anteil an "on" State ist.

1 = immer an
0 = immer aus
0,5 = hälfte an, hälfte aus

Wenn hier intern die Hardware PWM verwendet wird, dann ist die Frequenz fest. Du wirst dann kein Blinken sehen, weil die Frequenz zu hoch ist (ab 500Hz).

Das verstehe ich nicht, kannst du das nochmal erklären (sorry steh da voll auf dem Schlauch)? Warum ist es bei dem Video, das ich verlinkt habe, anders? Dort wird von 0 auf 1 erhöht und man sieht ein Anstieg des Blinkens.
Die PWM-Ausgäng des Arduino sind doch digital und simulieren analog über PWM d.h. sie können 0 oder 5 V annehmen.
Wenn die Frequenz hardware-seitig fest ist, wie kann dann bei nur 2 Stufen 0 und 5 V ein dimmen ohne Blinken der LED erfolgen, wie es bei mir in der Realität der Fall ist?

Vorwiderstand ist jetzt gesetzt :wink:

Die Frequenz ist im Prinzip der Abstand von einer positiven Flanke zur nächsten. Der Abstand ist immer gleich. Was sich ändert ist die Position negativen Flanke dazwischen, bzw. wie lange die High-Phase ist

https://cdn.instructables.com/F1X/4X0N/I6SNWPL8/F1X4X0NI6SNWPL8.MEDIUM.gif

kelso:
Warum ist es bei dem Video, das ich verlinkt habe, anders? Dort wird von 0 auf 1 erhöht und man sieht ein Anstieg des Blinkens.

Das Video lügt. :wink: Ich denke der Eindruck ist auf die Interferenz beider Frequenzen (PWM und die der Bildrate der Kamera) zurückzuführen.

Blinken das man sieht findet zwischen irgendwas und maximal 50Hz statt. Wenn man schneller wie 50Hz an und ausschaltet kann das Auge dem nicht mehr folgen, statt hell und dunkel bekommt man einen Zwischenwert, der sich aus der Pulszeit ergibt.

PWM hat grundsätzlich eigentlich 2 Werte die man braucht. Zum einen Die Frequenz mit der ein und ausgeschaltet wird und die Länge des Impulses zur Pause. Die Frequenz ist bei PWM vorgegeben, normalerweise nicht änderbar und vom Autor der Lib so gewählt, das man eben KEIN Blinken mit dem Auge sieht. So erzeugt das Auge einen Mittelwert und man meint heller oder dunkler zu erkennen. Im Gegensatz dazu wäre eine Stromreduzierung eine dauerhafte Dunkel oder Hellschaltung. Nur ist sowas meist mit schlechtem Wirkungsgrad behaftet, daher benutzt man PWM.

Vieleicht ist es das was du nicht verstehst. 0 bis 1 wird dann in ein Puls-Pauseverhältniss umgelegt. 0,01 = 1% On, 99% off. 0,99 entsprechend 99% on und 1% off.

Das Video lügt nicht. Man sieht im Video richtig schön den Rolling Shutter (das ist dieses hin und her flackern der LED). Das zeigt, dass die "Blinkerei" durch die Kamera entsteht und nicht durch tatsächliches Blinken.

Ich hab in meinem Projekt ne PWM selbst geschrieben. Frequenz auf 10Hz festgelegt, also 100ms pro Zyklus.
Das läuft dann ganz einfach:

Nehmen wir 30% Leistung.
Dann schaltet der Pin ein. Dann wird 30ms gewartet. Danach schaltet der Pin aus und es werden 70ms gewartet. Das wiederholt sich dann.

80% Leistung
Pin einschalten, 80ms warten, Pin ausschalten, 20ms warten.

Warten darf man an der Stelle natürlich nicht aktiv mit delay, sonst ist alles blockiert. Aber das Prinzip sollte denke ich verständlich sein.

Der Arduino kann das in Hardware, nur macht er das deutlich schneller.