banner
Nachrichtenzentrum
Hervorragenden Service

ESP32 in MicroPython: PWM und der Arbeitszyklus

Oct 02, 2023

Die auf dem ESP32 verfügbare PWM-Hardware ist etwas komplizierter, als Sie vielleicht erwarten, und einige Dinge könnten mit dem RMT besser erreicht werden. Dieser Auszug stammt ausProgrammierung des ESP32 in MicroPython,Teil der I Programmer Library und zeigt Ihnen, wie Sie die PWM-Hardware verwenden.

Kaufen Sie bei Amazon.

Vorwort

Der ESP32 verfügt über zwei PWM-Hardwareimplementierungen. Einer ist für die Motorsteuerung vorgesehen und verfügt über zusätzliche Funktionen wie eine Totzone und automatische Bremsung. Dies wird von MicroPython nicht unterstützt und wenn Sie es nutzen möchten, müssen Sie zu C wechseln. Die zweite Version, LEDC, wurde speziell für die Ansteuerung von LEDs mit Funktionen wie automatischem Dimmen und exotischeren Funktionen entwickelt. Obwohl MicroPython die grundlegenden LEDC-Operationen unterstützt, bietet es keinen Zugriff auf alle zusätzlichen Funktionen.

Jedem GPIO-Pin kann ein PWM-Generator zugewiesen werden. Die Anzahl der PWM-Generatoren eines ESP32 hängt von seinem genauen Modell ab. Sie kommen in zwei Gruppen vor – schnell und langsam. Der schnelle Typ verfügt über automatische Dimmfunktionen und ist in der Lage, Frequenz und Arbeitszyklus stufenlos zu ändern. Dem langsamen Typ fehlen diese Funktionen und es liegt an der Software, seine Frequenz und seinen Arbeitszyklus zu ändern. Jede Gruppe verfügt außerdem über eine festgelegte Anzahl von Timern, die bestimmen, wie viele verschiedene Frequenzen und eine bestimmte Anzahl von Kanälen erzeugt werden können.

Das gebräuchlichste Entwicklungsboard, das einen EP32 verwendet, verfügt über zwei Gruppen, eine schnelle und eine langsame, PWM mit acht Kanälen in jeder Gruppe. Der ESP32-S2 verfügt nur über eine schnelle Gruppe, ist aber ansonsten identisch. Der RISC-basierte ESP32-C3 ist derselbe wie der ESP32-S2, verfügt jedoch nur über sechs Kanäle. Alle ESP32-Geräte verfügen in jeder Gruppe über vier Timer, sodass Sie vier verschiedene Frequenzen einstellen können.

Die Unterscheidung zwischen den beiden Gruppen ist aus Sicht von MicroPython irrelevant, da es die zusätzlichen Funktionen der schnellen Gruppe nicht nutzt. Aus Sicht von MicroPython bedeutet dies, dass ein ESP32 über 16 PWM-Kanäle verfügt, die mit acht verschiedenen Frequenzen arbeiten können. Alle Kanäle können mit unterschiedlichen Arbeitszyklen arbeiten.

Sie müssen nicht wissen, wie die PWM-Hardware funktioniert, aber es hilft, einige der Einschränkungen zu verstehen.

Um ein PWM-Objekt zu erstellen, müssen Sie seinem Konstruktor ein Pin-Objekt übergeben. Zum Beispiel:

Erstellt ein mit GPIO4 verknüpftes PWM-Objekt. Sie können die Frequenz einstellen mit:

wodurch die Frequenz in Hz eingestellt wird. Die PWM-Hardware ist zu diesem Zeitpunkt nicht aktiviert. Um ein Signal zu erzeugen, müssen Sie den Arbeitszyklus einstellen. Dies geschieht mit:

Dabei ist die Einschaltdauer ein Wert im Bereich von 0 bis 65.535, entsprechend 0 bis 100 %.

Es gibt auch:

Dadurch wird die Zeit in Nanosekunden festgelegt, in der die Leitung hoch ist. Dies ist für den allgemeinen Gebrauch nicht so nützlich und wenn Sie eine Zeit angeben, die größer als der festgelegte Zeitraum ist, wird eine Ausnahme generiert.

Alternativ können Sie den Konstruktor verwenden, um alle Eigenschaften des PWM festzulegen:

Zum Zeitpunkt des Verfassens dieses Artikels gibt es einen Fehler in MicroPython 1.19, der dazu führt, dass der Arbeitszyklus falsch eingestellt wird, wenn die Frequenz mit freq() eingestellt wird. Eine Lösung besteht darin, immer den Konstruktor zu verwenden, um eine Anfangsfrequenz festzulegen.

Die MicroPython-Implementierung von PWM weist Kanälen auf intelligente Weise Timer zu. Wenn Sie ein PWM-Objekt erstellen, das mit einer bestimmten Frequenz arbeitet, prüft es zunächst, ob in derselben Gruppe ein Timer vorhanden ist, der mit dieser Frequenz arbeitet. Wenn ja, wird es dem PWM-Objekt zugewiesen. Wenn kein Timer vorhanden ist, der mit dieser Frequenz arbeitet, wird ein freier Timer zugewiesen und auf die neue Frequenz eingestellt. Wenn keine freien Timer mehr vorhanden sind und keiner mit der erforderlichen Frequenz läuft, wird eine Ausnahme ausgelöst. Das bedeutet, dass Sie bedenkenlos Frequenzen zuweisen können, bis Sie alle Timer aufgebraucht haben, und dann müssen Sie bereits genutzte Frequenzen einstellen. Das bedeutet, dass Sie bei einem ESP32 bis zu acht verschiedene Frequenzen für die 16 verschiedenen Kanäle einstellen können.

Sie können ganz einfach Ihre eigenen Arbeitszyklusmethoden erstellen, die in Prozentsätzen oder auf andere Weise funktionieren, wie Sie den Arbeitszyklus angeben möchten. Sie können beispielsweise eine neue Klasse erstellen, deren Arbeitszyklus als Prozentsatz festgelegt ist:

In diesem Fall wird der Prozentsatz multipliziert mit 10 angegeben. Um beispielsweise einen Arbeitszyklus von 50 % festzulegen, würden Sie Folgendes verwenden:

Sobald Sie das Tastverhältnis eingestellt haben, beginnt der PWM-Generator, das angegebene PWM-Signal am Pin auszugeben. Beachten Sie, dass dies auch nach Abschluss Ihres Programms funktioniert. Um das PWM-Signal zu stoppen, verwenden Sie:

Sie können die Frequenz oder das Tastverhältnis jederzeit ändern. Zum Beispiel:

Erzeugt ein PWM-Signal auf GPIO4 und GPIO16 mit der gleichen Frequenz von 250 Hz und 500 Hz und Arbeitszyklen von 50 % bzw. 25 %. Das Ergebnis können Sie in dieser Logikanalysator-Anzeige sehen:

Aus dieser Kurve können Sie ersehen, dass die Impulse auf jeder Leitung genau zur gleichen Zeit ihren Arbeitszyklus beginnen.

Programmierung des ESP32 in MicroPython,Programmierungder ESP32VorwortDer ESP32 – Bevor wir beginnenErste SchritteErste Schritte mit dem GPIOEinfache AusgabeEtwas ElektronikEinfache EingabeErweiterte Eingabe – InterruptsAuszug aus der Pulsweitenmodulation:***NEU!***NEU!Steuern von Motoren und ServosErste Schritte mit dem SPI-BusVerwendung analoger SensorenVerwendung des I2C-Bus-ExtraktsOne-Wire-ProtokolleDer serielle PortVerwenden von WiFi Extract:SteckdosenAsyncio und ServerDirekt zum Hardware-Auszug: Zum Zeitpunkt des Verfassens dieses Artikels gibt es einen Fehler in MicroPython 1.19, der dazu führt, dass der Arbeitszyklus falsch eingestellt wird, wenn die Frequenz mit freq() eingestellt wird. Eine Lösung besteht darin, immer den Konstruktor zu verwenden, um eine Anfangsfrequenz festzulegen.