Website-Suche

ESP32 PWM mit MicroPython unter Verwendung der Thonny IDE


PWM-Pins im ESP32

Die ESP32-Platine verfügt über 16 unabhängige Kanäle, die PWM-Signale mit unterschiedlichen Zeitperioden und Breiten erzeugen können. Fast alle GPIO-Pins, die als Ausgang fungieren können, können verwendet werden, um ein PWM-Signal zu erzeugen. Die GPIO-Pins 34, 35, 36 und 39 können nicht als PWM-Pins verwendet werden, da sie nur Eingänge sind.

Allerdings wird in der 36-Pins-Variante des ESP32-Boards von der Verwendung der sechs integrierten SPI-Pins als PWM-Signalgeber ebenfalls abgeraten.

Wie man ESP32 PWM-Pins verwendet

PWM ist eine Technik zur Steuerung des Ausgangs mithilfe eines variablen digitalen Pulsignals. PWM hilft bei der Steuerung der Motor-geschwindigkeit oder der Helligkeit von LEDs. Die Hauptkomponente zur Erzeugung von PWM-Signalen ist das interne Timer-Modul. Der Timer wird durch die interne Mikrocontroller-Taktquelle gesteuert.

Wenn die Zeit beginnt, wird ihr Wert mit zwei Komparatoren verglichen, und sobald er den definierten Arbeitszyklus erreicht, wird ein Signal an den PWM-Pin ausgelöst, das die Pin-Zustände auf LOW ändert. Als Nächstes zählt das Zeitsignal weiter, bis es den Perioden-Registerwert erreicht. Nun wird der Komparator erneut einen neuen Trigger erzeugen, und der Zustand der PWM-Pins wechselt von LOW zu HIGH.

Um ein PWM-Signal an GPIO-Pins zu erzeugen, müssen die folgenden vier Eigenschaften definiert werden:

  • PWM-Frequenz: Die Frequenz für PWM ist das Gegenteil des Zeitraums. Jeder Wert kann je nach Anwendung eingestellt werden.
  • PWM-Auflösung: Die Auflösung definiert die Anzahl der diskreten Ebenen des Tastverhältnisses, die wir steuern können.
  • Arbeitszyklus: Die Zeitspanne, in der ein PWM-Signal aktiv ist.
  • GPIO-Pin: Die Pin-Nummer des ESP32, an der das PWM-Signal gelesen werden soll. (GPIO 34, 35, 36, 39 können nicht verwendet werden)

Hier sind einige Punkte, die man beim Konfigurieren des ESP32 PWM-Signals beachten sollte:

  • Insgesamt gibt es 16 unabhängige PWM-Kanäle im ESP32, die in zwei Gruppen aufgeteilt sind, wobei jede Gruppe 8 Kanäle hat.
  • 8 PWM-Kanäle sind hochgeschwindigkeitsfähig, während die anderen 8 Kanäle niedrig sind.
  • Die PWM-Auflösung kann zwischen 1-Bit und 16-Bit eingestellt werden.
  • Die PWM-Frequenz ist abhängig von der Auflösung der PWM.
  • Der Tastgrad kann automatisch erhöht oder verringert werden, ohne dass ein Eingreifen des Prozessors erforderlich ist.

Steuerung der LED-Helligkeit mit PWM-Signal im ESP32

Jetzt werden wir die Helligkeit der LED mit einem PWM-Signal steuern. Schließen Sie die LED an den GPIO-Pin 18 des ESP32 an.

Die untenstehende Tabelle zeigt die Pinbelegung für LED mit ESP32.

ESP32 GPIO-PinLED
GPIO 18+ive
GND-ive

Code zur Steuerung der Helligkeit einer einzelnen LED

Um ein ESP32-Board mit MicroPython zu programmieren, öffnen Sie Thonny IDE und laden den unten angegebenen Code hoch. Denken Sie daran, das ESP32-Board mit der MicroPython-Firmware zu flashen, wenn Sie es zum ersten Mal verwenden.

from machine import Pin, PWM
from time import sleep

frequency = 5000
led1 = PWM(Pin(18), frequency)

while True:

  for duty_cycle in range(0, 1024):

    led1.duty(duty_cycle)     sleep(0.005)

Der Code begann mit dem Import der erforderlichen Klassen.

from machine import Pin, PWM

Das LED-Objekt ist für das PWM-Signal initialisiert.

led = PWM(Pin(18), frequency)

Ein PWM-Objekt benötigt zwei Argumente: eines ist die Frequenz und das andere ist der Tastgrad.

Frequenz: Der Frequenzwert reicht von 0 bis 78125. Hier haben wir eine Frequenz von 5 kHz verwendet, um die Helligkeit der LED zu steuern.

Arbeitszyklus: Sein Wert reicht von 0 bis 1023. Hier entspricht 1023 dem maximalen Wert, der einen 100% Arbeitszyklus und volle Helligkeit der LED definiert, und auf der anderen Seite entspricht 0 einem 0% Arbeitszyklus, was bedeutet, dass die LED vollständig gedimmt ist.

Mit der Funktion duty() übergeben wir den Tastgrad als Argument an diese Funktion.

led.duty(duty_cycle)

Innerhalb der while-Schleife wird eine for-Schleife initiiert, die den Tastgrad jedes Mal, wenn sie durchläuft, um 1 erhöht, mit einem Intervall von 5 ms.

for duty_cycle in range(0, 1024):

    led.duty(duty_cycle)     sleep(0.005)

Die range() Funktion kann wie folgt geschrieben werden:

range(start, stop, step)

Hier gibt start den Anfangswert des Tastverhältnisses an, der gleich 0 ist. stop erklärt den Wert, bei dem wir das Tastverhältnis stoppen möchten. Hier haben wir den Wert 1024 verwendet, da der maximale Wert, den es erreichen kann, 1023 ist und wir in diesem Wert nach jeder Schleife um 1 erhöhen.

Der letzte Schritt beschreibt den inkrementierenden Faktor und standardmäßig ist er 1.

Ausgabe
Auf der Hardware können wir die Helligkeit der LED in vollem Umfang sehen, das bedeutet, dass das Tastverhältnisssignal bei 1024 liegt.

Jetzt können wir sehen, dass die LED vollständig gedimmt ist, was bedeutet, dass der Tastgradwert bei 0 liegt.

Steuerung mehrerer Pins mit demselben PWM-Signal

Wir können mehrere Pins mit dem gleichen PWM-Signal steuern, das aus einem einzelnen PWM-Kanal erzeugt wird. Jetzt werden wir das einfache LED-Beispiel ändern, um die Helligkeit mehrerer LEDs zu steuern.

Schließen Sie drei LEDs an die GPIO-Pins 23, 18 und 15 an.

Die folgende Tabelle zeigt das Pin-Layout für drei LEDs.

ESP32 GPIO-PinLED
GPIO 23+ive LED 1
GPIO 18+ive LED 2
GPIO 15+ive LED 3
GNDLED gemeinsames GND

Code zur Steuerung der Helligkeit mehrerer LEDs

Öffnen Sie Thonny IDE und schreiben Sie den Code im Editorfenster. Verbinden Sie danach das ESP32-Board und laden Sie es hoch.

from machine import Pin, PWM
from time import sleep

frequency = 5000
led1 = PWM(Pin(18), frequency)
led2 = PWM(Pin(23), frequency)
led3 = PWM(Pin(15), frequency)

while True:

  for duty_cycle in range(0, 1024):

    led1.duty(duty_cycle)     led2.duty(duty_cycle)     led3.duty(duty_cycle)     sleep(0.005)

Der Code ist ähnlich wie im vorherigen Beispiel. Wir haben lediglich zwei neue LEDs an den GPIO-Pins 23 und 15 hinzugefügt.

Es wird derselbe Tastverhältnis- und Frequenzwert verwendet.

Ausgabe
Im Ausgabebereich können wir sehen, dass alle drei LEDs mit voller Helligkeit leuchten, was bedeutet, dass alle einen Tastgrad mit dem Wert 1024 erhalten.

Jetzt sind alle drei LEDs gedimmt, was bedeutet, dass sie alle den gleichen Tastgrad haben, der von demselben PWM-Kanal kommt, der einen Tastgradwert von 0 hat.

Wir haben die Helligkeit der LED erfolgreich mit dem PWM-Signal gesteuert.

Fazit

In diesem Leitfaden haben wir die PWM-Pins des ESP32 und deren Verwendung zur Steuerung von Geräten besprochen. Wir haben auch den Code zur Steuerung von einzelnen und mehreren LEDs mit Hilfe des PWM-Kanals behandelt. Mit diesem Leitfaden kann jede Art von Hardware mit Hilfe des PWM-Signals gesteuert werden.