Raspberry Pi Pico: Experimente mit PWM

PWM steht für Pulsweitenmodulation bzw. Pulse Width Modulation. Modulationsverfahren werden eingesetzt, um Informationen und Daten so in elektrische Signale umzuwandeln, dass sie für die Übertragung geeignet sind.

Mit einem PWM-Signal können eine Reihe von interessanten Experimenten durchgeführt werden, um die Konzepte der Regelungstechnik besser zu verstehen.

Das Erzeugen eines PWM-Signals wird von MicroPython für jeden GPIO-Pin unterstützt. Ein PWM-Signal ist mit wenigen Zeilen Programmcode programmiert.

PWM in MicroPython initialisieren

Bevor der Raspberry Pi Pico ein PWM-Signal ausgibt, muss der GPIO-Pin und die PWM-Funktionseinheit initialisiert werden.

from machine import Pin, PWM
pwm = PWM(Pin(25))

Das reicht aber noch nicht. Es werden zusätzlich zwei Parameter benötigt, um das PWM-Signal erzeugen zu können.

  1. Frequenz in Hertz (Hz)
  2. Tastgrad (Duty Cycle)

1. Parameter: Frequenz in Hertz (Hz)

pwm.freq(8)

Ein PWM-Signal ist ein digitales Signal, dass kontinuierlich zwischen einem High- und Low-Pegel hin- und herwechselt. Die Geschwindigkeit bzw. Zeit, in der die beiden Pegel wechseln ist die Frequenz mit der Einheit Hertz (Hz).
Die Frequenz sagt aus, wie oft etwas in einer Sekunde passiert. Bei einer Frequenz von 1 Hz würde in einer Sekunde der High-Pegel mit anschließendem Low-Pegel einmal erfolgen. Bei einer Frequenz von 2 Hz, entsprechend zwei mal. Und bei 1.000 Hz entsprechend 1.000 mal.

Hinweis: Der Raspberry Pi Pico unterstützt eine Frequenz von 7 bis 125.000.000 Hz. In MicroPython ist die niedrigste Frequenz 8 Hz.

2. Parameter: Tastgrad (Duty Cycle)

pwm.duty_u16(1000)

Der Duty Cycle ist ein Maß für den Anteil der Zeit, während der ein PWM-Signal ein High-Pegel hat, im Verhältnis zur Gesamtzeit eines PWM-Zykluses. Der Duty Cycle wird in Prozent angegeben und kann zwischen 0% und 100% liegen. Je höher der Duty Cycle, desto länger liegt High-Pegel an. Ein Duty Cycle von 100% entspricht einem Dauer-High, während ein Duty Cycle von 0% einem ständigen Low-Signal entspricht.

Hinweis: In MicroPython wird der Duty Cycle nicht in Prozent angegeben, sondern in einer Dezimalzahl von 0 bis 65.535, was einer Dualzahl mit 16 Bit (Länge/Stellen) entspricht. Man ist in der Regel gezwungen die Prozent-Angabe oder einen anderen Wert in eine Dezimalzahl umzurechnen.

  • 0%: 0
  • 10%: 6.554
  • 20%: 13.108
  • 30%: 19.662
  • 40%: 26.216
  • 50%: 32.268
  • 60%: 39.324
  • 70%: 45.878
  • 80%: 52.432
  • 90%: 58.986
  • 100%: 65.535

Experiment: Blinkende LED

Im folgenden Programmcode wird am GPIO der Onboard-LED ein PWM-Signal auf eine Frequenz von 8 Hz eingestellt. Der Duty Cycle beginnt dann bei einem niedrigen Wert und wird alle 3 Sekunden erhöht. Du kannst dabei beobachten, wie sich die LED bei unterschiedlichen Duty-Cycle-Werten verhält. Selbstverständlich kannst Du auch mit eigenen Duty-Cycle-Werten experimentieren.

# Bibliotheken laden
from machine import Pin, PWM
from time import sleep

# GPIO25 mit PWM initialisieren
pwm = PWM(Pin(25))

# Frequenz (Hz) einstellen
pwm.freq(8)

# Duty Cycle einstellen: 0 - 65535
pwm.duty_u16(1000)
sleep(3)
pwm.duty_u16(10000)
sleep(3)
pwm.duty_u16(32000)
sleep(3)
pwm.duty_u16(45000)
sleep(3)
pwm.duty_u16(65000)
sleep(3)

# PWM-Signal abschalten
pwm.deinit()

# Onboard-LED ausschalten
pwm = Pin(25, Pin.OUT, value=0)

Ja, mit einem PWM-Signal kann man eine LED auch zum Blinken bringen. Allerdings lässt sich die Frequenz nicht tief genug einstellen, damit die LED langsamer blinkt. Hierfür sollte man eine Lösung wählen, bei der man das Blink-Signal flexibler einstellen kann.
Dieses Experiment soll verdeutlichen, dass ein PWM-Signal nicht in jedem Fall die beste Lösung ist.

Experiment: Helligkeit einer LED einstellen

Im folgenden Programmcode wird am GPIO der Onboard-LED ein PWM-Signal auf eine Frequenz von 1.000 Hz eingestellt. Der Duty Cycle beginnt dann bei einem niedrigen Wert und wird alle 3 Sekunden erhöht. Du kannst dabei beobachten, wie sich die LED bei unterschiedlichen Duty-Cycle-Werten verhält. Selbstverständlich kannst Du auch mit eigenen Duty-Cycle-Werten experimentieren.
Das Einstellen der Helligkeit einer LED funktioniert schon wesentlich besser.

# Bibliotheken laden
from machine import Pin, PWM
from time import sleep

# GPIO25 mit PWM initialisieren
pwm = PWM(Pin(25))

# Frequenz (Hz) einstellen: 8 - 125000000
pwm.freq(1000)

# Duty Cycle einstellen: 0 - 65535
pwm.duty_u16(10000)
sleep(3)
pwm.duty_u16(20000)
sleep(3)
pwm.duty_u16(30000)
sleep(3)
pwm.duty_u16(40000)
sleep(3)
pwm.duty_u16(50000)
sleep(3)

# PWM-Signal abschalten
pwm.deinit()

# Onboard-LED ausschalten
pwm = Pin(25, Pin.OUT, value=0)

PWM-Signal abschalten

Grundsätzlich ist es so, dass wenn ein PWM-Signal erst einmal initialisiert ist, dann läuft es, bis es abgeschaltet wird.

pwm.deinit()

Das reicht aber meistens nicht aus. Denn das Ergebnis der Deinitialisierung führt in der Regel dazu, dass der GPIO-Pin dann einen High-Pegel führt, was unter Umständen unerwünscht ist.
Es kann erforderlich sein, den betreffenden GPIO-Pin explizit einen Low-Pegel zu geben.

pwm = Pin(25, Pin.OUT, value=0)

Unter Umständen will man das PWM-Signal nicht wirklich abschalten, sondern nur das High-Signal. Dann verwendet man am Besten einen Duty Cycle von „0“. Das heißt, das PWM-Signal entspricht einem Dauer-Low.

pwm.duty_u16(0)

Weitere Experimente

Folgende Experimente können dazu beitragen, das Verständnis für die Funktionsweise von PWM-Signalen und deren Anwendungen in der Regelungstechnik zu verbessern.

  • LED-Helligkeitssteuerung
  • Lautstärkeregelung für einen Summer
  • Positionskontrolle von Servo-Motoren
  • Geschwindigkeitsregelung von DC-Motoren
  • Geschwindigkeitsregelung eines Lüfters

LED-Helligkeitssteuerung

Verwende ein PWM-Signal, um die Helligkeit einer LED zu steuern. Ändere den Duty Cycle des PWM-Signals, um die Helligkeit der LED zu verändern.

Lautstärkeregelung für einen Summer

Verwende ein PWM-Signal, um die Lautstärke eines Summer zu regeln. Ändere den Duty Cycle des PWM-Signals, um die Lautstärke des Summer zu verändern.

Positionskontrolle von Servo-Motoren

Verwende ein PWM-Signal, um die Position eines Servomotors zu kontrollieren. Ändere den Duty Cycle des PWM-Signals, um die Position des Servomotors zu verändern.

Geschwindigkeitsregelung von DC-Motoren

Verwenden Sie ein PWM-Signal, um die Geschwindigkeit eines DC-Motors zu regeln. Ändere den Duty Cycle des PWM-Signals, um die Geschwindigkeit des DC-Motors zu verändern.

Geschwindigkeitsregelung eines Lüfters

Verwende ein PWM-Signal, um die Geschwindigkeit eines Lüfters zu regeln. Ändere den Duty Cycle des PWM-Signals, um die Geschwindigkeit des Lüfters zu verändern.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren