Zum Inhalt springen

PWM Signale erzeugen

Um die Helligkeit von LEDs oder die Geschwindigkeit von Motoren stufenlos anzupassen, kann eine Pulsweitenmodulation (PWM) verwendet werden. Mit dieser Methode lässt sich ein digitales Signal so erzeugen, dass es wie ein analoges wirkt. Dies geschieht durch ein schnelles Umschalten des Ausgangsports zwischen den Zuständen LOW und HIGH. Dabei sind die Frequenz des Umschaltvorgangs und das Tastverhältnis (Duty Cycle) wichtige Faktoren.

How PWM works

Um PWM Signale mit Micropython zu nutzen müssen wir die Klasse Pin und PWM importieren.

from machine import Pin, PWM

Als erstes legen wir ein Pin Objekt (led_pin) an und erzeugen anschließend ein Objekt der Klasse PWM. Der Konstruktor erwartet mindestens ein Argument vom Typ Pin, z.B. unser led_pin. PWM kann an allen ausgangsfähigen Pins aktiviert werden.

main.py
from machine import Pin, PWM
led_pin = Pin(25)
pwm = PWM(led_pin)

Um die Frequenz und das Tastverhältnis festzulegen gibt es die zwei Methoden freq(x) und duty(x) Im Beispiel wird eine Frequenz von 5000 Herz eingestellt, was für das Dimmen einer LED ausreichend ist. Am ESP32 kann die Frequenz von 1Hz bis 40MHz eingestellt werden, aber wenn die Frequenz steigt, sinkt die Auflösung des Tastverhältnisses.

main.py
from machine import Pin, PWM
led_pin = Pin(25)
pwm = PWM(led_pin)
pwm.freq(5000)
pwm.duty(512)

Die PWM hat eine Auflösung von 10 Bit. Damit sind = 1024 Werte möglich. Wir können also Werte zwischen 0 und 1023 als Argument übergeben.

  • 0 entspricht einer Impulsdauer von 0%, also LED aus.
  • 1023 entspricht einer Impulsdauer von 100%, also LED an.

Der Wert 512 entspricht also einer Impulsdauer von 50%, also LED auf halbe Helligkeit.

Wir wollen nun unsere LED langsam ein und wieder ausschalten.

main.py
from machine import Pin, PWM
from time import sleep_ms
led_pin = Pin(27, Pin.OUT)
pwm = PWM(led_pin, freq=5000)
TIME_DELAY = 5
while True:
for duty_cycle in range(0,1024):
pwm.duty(duty_cycle)
sleep_ms(TIME_DELAY)

Unser Program nutzt eine for Schleife um den Dutycyle von 0% auf 100% zu erhöhen. Damit dies nicht zu schnell geschieht und wir den Prozess gut erkennen können fügen wir ein kurzes Delay in jedem Schleifendurchlauf ein. Probieren Sie gerne andere Zeitwerte aus und sehen Sie die Veränderung.

Bonus: LED über Potentiometer steuern

Hier finden Sie noch ein Beispiel, wie Sie die Helligkeit der LED über ein Potentiometer steuern können. Dies kombiniert die Nutzung von PWM mit der Messung eines analogen Signals.

Start Lab in Wokwi

Sie haben ein PWM Signal mit einer Auflösung von 10 Bit.

  1. Welchen Maximalen Wert können Sie für den DutyCycle einstellen?
  1. Welchen Wert muss der Parameter duty für ein Tastverhältnis von 30 % annehmen?
  1. Welche Frequenz entspricht einer Periodendauer von 20 ms?
  1. Welches Tastverhältnis (gerundet) ergibt sich bei pwm.duty(213)?