Was ist PWM?
PWM steht für Pulsweitenmodulation (englisch: Pulse Width Modulation). Es ist eine Technik, mit der ein digitaler Pin — der nur HIGH (an) oder LOW (aus) kennt — eine analoge Wirkung erzeugt, indem er sehr schnell ein- und ausgeschaltet wird.
Das Verhältnis zwischen Ein- und Auszeit wird als Duty Cycle (Tastverhältnis) bezeichnet und in Prozent angegeben. 50 % Duty Cycle bedeutet: halb an, halb aus — die LED leuchtet auf halber Helligkeit.
Duty Cycle verstehen
| Duty Cycle | Wirkung (LED) | Wirkung (Servo) |
|---|---|---|
| 0 % | Aus | Ganz links (0°) |
| 25 % | 25 % Helligkeit | 45° |
| 50 % | 50 % Helligkeit | 90° (Mitte) |
| 75 % | 75 % Helligkeit | 135° |
| 100 % | Volle Helligkeit | Ganz rechts (180°) |
PWM beim ESP32
Der ESP32 hat einen eingebauten LEDC (LED Control) PWM-Controller mit 16 Kanälen und einstellbarer Frequenz und Auflösung:
const int ledPin = 2;
const int pwmChannel = 0;
const int frequency = 5000; // 5 kHz
const int resolution = 8; // 8 Bit = Werte 0–255
void setup() {
ledcSetup(pwmChannel, frequency, resolution);
ledcAttachPin(ledPin, pwmChannel);
}
void loop() {
// LED langsam heller
for (int duty = 0; duty <= 255; duty++) {
ledcWrite(pwmChannel, duty);
delay(10);
}
// LED langsam dunkler
for (int duty = 255; duty >= 0; duty--) {
ledcWrite(pwmChannel, duty);
delay(10);
}
} Servo mit PWM steuern
Servos erwarten ein PWM-Signal mit 50 Hz und einem Puls zwischen 1 ms (0°) und 2 ms (180°):
#include <ESP32Servo.h>
Servo myServo;
void setup() {
myServo.attach(13); // Servo an Pin 13
}
void loop() {
myServo.write(0); // Ganz links
delay(1000);
myServo.write(90); // Mitte
delay(1000);
myServo.write(180); // Ganz rechts
delay(1000);
} Tipp
PWM-Frequenz wählen
Die richtige Frequenz hängt vom Anwendungsfall ab:
| Anwendung | Typische Frequenz |
|---|---|
| LED dimmen | 1 kHz – 10 kHz |
| Servo | 50 Hz |
| DC-Motor | 1 kHz – 20 kHz |
| Audiosignal | 44 kHz |