Was ist PWM? Ratgeber zu analogWrite, Tastgrad und Frequenz am Arduino
Was ist PWM (Pulsweitenmodulation) und wie funktioniert sie? Tastgrad und Frequenz, PWM-Pins am Arduino, LED-Helligkeit und Motordrehzahl mit analogWrite, Unterschied zum Servo, ESP32 LEDC und Raspberry Pi Pico PWM.
Die Digitalpins des Arduino kennen nur zwei Zustände: 0 V oder 5 V. Wie dimmst du dann eine LED auf halbe Helligkeit oder lässt einen Motor langsam drehen? Die Antwort heißt PWM (Pulsweitenmodulation). Der Pin wird sehr schnell ein- und ausgeschaltet, und über den Anteil der Einschaltzeit stellst du die mittlere Leistung an der Last ein. LED-Dimmer, Motordrehzahlregelung, Servoansteuerung, Tonerzeugung und sogar Handy-Ladegeräte nutzen diese Technik.

Wie funktioniert PWM?
Ein PWM-Signal ist ein Rechtecksignal: eine Weile HIGH, dann LOW, und das wiederholt sich ständig. Die Dauer eines Ein-Aus-Zyklus heißt Periode, der Anteil der Periode, in dem das Signal HIGH ist, Tastgrad (Duty Cycle). Bei 25 % Tastgrad ist das Signal ein Viertel der Zeit an, ein 5-V-Pin wirkt dann im Mittel wie 1,25 V. Die LED blinkt etwa 490-mal pro Sekunde; das Auge kommt nicht hinterher und sieht nur die mittlere Helligkeit. Ein Motor glättet die Pulse dank seiner Trägheit und dreht mit der mittleren Geschwindigkeit.
| Tastgrad | analogWrite-Wert | Mittlere Spannung (5 V) | LED |
|---|---|---|---|
| 0 % | 0 | 0 V | Aus |
| 25 % | 64 | 1,25 V | Schwach |
| 50 % | 127 | 2,5 V | Halb hell |
| 75 % | 191 | 3,75 V | Hell |
| 100 % | 255 | 5 V | Volle Helligkeit |
Unser Auge reagiert nicht linear auf Licht: Änderungen bei wenig Licht bemerkt es sehr gut, bei viel Licht deutlich weniger. Deshalb wirkt eine LED bei 50 % Tastgrad viel heller als halb hell. Für ein natürlich wirkendes Dimmen nutzt man die unten gezeigte Gammakorrektur.
Frequenz: Wie schnell ist PWM?
Die Frequenz gibt an, wie oft pro Sekunde das Signal ein- und ausschaltet. Beim Arduino Uno arbeiten die Pins 5 und 6 mit etwa 980 Hz, die Pins 3, 9, 10 und 11 mit etwa 490 Hz. Für LEDs reicht das völlig. Bei Motoren liegen 490 Hz aber im hörbaren Bereich, und der Motor kann leise pfeifen; am ESP32 und Pico kannst du die Frequenz auf 20 kHz anheben und ihn so leise machen. Eine unnötig hohe Frequenz lässt Transistoren und MOSFETs allerdings warm werden.
| Board | PWM-Pins | Standardfrequenz | Auflösung |
|---|---|---|---|
| Arduino Uno / Nano | 3, 5, 6, 9, 10, 11 | 490 Hz (5 und 6: 980 Hz) | 8 Bit (0–255) |
| Arduino Mega | 2–13, 44–46 | 490 Hz (4 und 13: 980 Hz) | 8 Bit (0–255) |
| ESP32 | Fast alle Ausgangspins | Einstellbar (analogWrite: 1 kHz) | 1–16 Bit |
| Raspberry Pi Pico | Alle GPIO-Pins | Einstellbar | 16 Bit (0–65535) |
LED-Helligkeit mit analogWrite
Am Arduino erzeugst du PWM mit analogWrite(pin, wert), der Wert liegt zwischen 0 und 255. Trotz des irreführenden Namens erzeugt der Befehl keine echte Analogspannung, sondern PWM. Er funktioniert nur an Pins mit ~-Zeichen. Der folgende Code blendet eine LED langsam ein und aus und erzeugt so einen "atmenden" Effekt:
1const int LED_PIN = 9; // ~ işaretli PWM pini / PWM pin marked with ~
2
3void setup() {
4 pinMode(LED_PIN, OUTPUT);
5}
6
7void loop() {
8 for (int v = 0; v <= 255; v++) { // yavaşça yan / fade in
9 analogWrite(LED_PIN, v);
10 delay(8);
11 }
12 for (int v = 255; v >= 0; v--) { // yavaşça sön / fade out
13 analogWrite(LED_PIN, v);
14 delay(8);
15 }
16}Helligkeit mit einem Potentiometer regeln
Schließt du ein Potentiometer an A0 an, stellst du die Helligkeit der LED von Hand ein. analogRead() liefert 0–1023; geteilt durch 4 ergibt das den Bereich 0–255, den analogWrite erwartet. Den Anschluss eines Potentiometers erklärt Was ist ein Potentiometer?
1void loop() {
2 int pot = analogRead(A0); // 0–1023
3 analogWrite(9, pot / 4); // 0–255
4}Motordrehzahl mit PWM
Schon ein kleiner Gleichstrommotor zieht Hunderte Milliampere, ein Arduino-Pin liefert aber nur etwa 20 mA sicher. Der Motor wird deshalb über einen Transistor, MOSFET oder einen Motortreiber wie den L298N betrieben, und das PWM-Signal geht an den Drehzahleingang des Treibers. Beim L298N ist das der Pin ENA (und ENB für den zweiten Motor); für PWM musst du den Jumper darauf entfernen. Die Pins IN1 und IN2 legen die Drehrichtung fest.

1const int ENA = 9; // hız (PWM) / speed (PWM)
2const int IN1 = 8; // yön / direction
3const int IN2 = 7;
4
5void setup() {
6 pinMode(ENA, OUTPUT);
7 pinMode(IN1, OUTPUT);
8 pinMode(IN2, OUTPUT);
9 digitalWrite(IN1, HIGH); // ileri / forward
10 digitalWrite(IN2, LOW);
11}
12
13void loop() {
14 analogWrite(ENA, 255); delay(2000); // tam hız / full speed
15 analogWrite(ENA, 150); delay(2000); // orta hız / medium speed
16 analogWrite(ENA, 0); delay(2000); // dur / stop
17}Sind Servomotoren und PWM dasselbe?
Auch Servos werden mit Pulsen gesteuert, aber nach einem anderen Prinzip: Die Position wird nicht durch den Tastgrad, sondern durch die Pulsbreite bestimmt. Ein Servo erwartet 50 Pulse pro Sekunde (50 Hz); ein Puls von 1 Millisekunde bedeutet etwa 0°, 1,5 ms 90° und 2 ms 180°. analogWrite kann dieses Timing nicht erzeugen, deshalb nutzt man für Servos die Bibliothek Servo. Einzelheiten stehen in Was ist ein Servomotor?
Echte Analogspannung aus PWM: der RC-Filter
Manchmal brauchst du wirklich eine konstante Spannung, etwa als Referenz für einen Operationsverstärker oder für einen Audioausgang. Dann schickst du das PWM-Signal durch einen Tiefpass aus Widerstand und Kondensator. Mit 10 kΩ und 10 µF beträgt die Zeitkonstante 0,1 Sekunden; der Ausgang ist recht glatt, reagiert aber langsam auf Änderungen. Verschiedene Werte probierst du mit dem Rechner RC-Zeitkonstante aus. Der klassische ESP32 hat außerdem an GPIO 25 und 26 zwei DACs mit echtem Analogausgang.
PWM am ESP32: LEDC
Am ESP32 erzeugt eine Hardware namens LEDC das PWM-Signal, und Frequenz sowie Auflösung legst du selbst fest. Im Arduino-Core 3.x nutzt du ledcAttach(pin, frequenz, aufloesung) und ledcWrite(pin, wert); ältere 2.x-Versionen hatten die kanalbasierten Befehle ledcSetup und ledcAttachPin. Das Beispiel unten blendet eine LED mit 5 kHz und 8 Bit:
1const int LED_PIN = 2;
2
3void setup() {
4 ledcAttach(LED_PIN, 5000, 8); // 5 kHz, 8 bit (0–255) — ESP32 Arduino core 3.x
5}
6
7void loop() {
8 for (int d = 0; d <= 255; d++) { ledcWrite(LED_PIN, d); delay(5); }
9 for (int d = 255; d >= 0; d--) { ledcWrite(LED_PIN, d); delay(5); }
10}PWM am Raspberry Pi Pico (MicroPython)
Am Pico kann jeder GPIO-Pin PWM ausgeben. In MicroPython nutzt du die Klasse PWM: Die Frequenz setzt du mit freq(), den Tastgrad mit duty_u16(), das Werte von 0 bis 65535 annimmt:
1from machine import Pin, PWM
2import time
3
4led = PWM(Pin(15))
5led.freq(1000) # 1 kHz
6
7while True:
8 for d in range(0, 65536, 512): # yavaşça yan / fade in
9 led.duty_u16(d)
10 time.sleep_ms(5)
11 for d in range(65535, -1, -512): # yavaşça sön / fade out
12 led.duty_u16(d)
13 time.sleep_ms(5)Projektideen mit PWM
- Atmende LED: eine Statusleuchte, die wie Geräte im Standby langsam auf- und abblendet.
- Dimmbare Schreibtischlampe: eine LED-Lampe, deren Helligkeit du mit einem Potentiometer einstellst.
- Temperaturgesteuerter Lüfter: den Lüfter schneller drehen lassen, je wärmer es laut DHT11 wird.
- Farben mischen: mit drei PWM-Kanälen Millionen Farben auf einer RGB-LED erzeugen.
- Roboterauto: Kurven glätten, indem du die Drehzahl zweier Motoren getrennt einstellst.
- Sonnenaufgangslampe: das Licht vor dem Wecker über 15 Minuten langsam aufhellen.
Typische Fehler und ihre Lösungen
- analogWrite an einem Pin ohne PWM: Beim Uno sind Pins ohne ~ nur an oder aus; 128 und mehr gilt als an, alles darunter als aus.
- Pins 9 und 10 mit der Servo-Bibliothek: Beim Uno nutzt die Servo-Bibliothek Timer1 und schaltet PWM an diesen beiden Pins ab; leg LED oder Motor auf einen anderen PWM-Pin.
- Pins 3 und 11 mit tone(): tone() nutzt Timer2 und stört PWM an diesen Pins.
- Motor direkt am Pin: Immer einen Transistor, MOSFET oder Motortreiber verwenden.
- Überlauf bei der Gammaberechnung: v * v überschreitet die int-Grenze; ergänze den (long)-Cast.
- PWM für echt analog halten: Das Multimeter zeigt den Mittelwert, das Signal springt aber weiter zwischen 0 und 5 V; für empfindliche Schaltungen RC-Filter oder DAC verwenden.
PWM ist eines der nützlichsten Konzepte, die du am Arduino lernst: LEDs, Motoren, Lüfter und Lautsprecher werden alle mit diesem einfachen Trick gesteuert. Für die Grundlagen lies Was ist eine LED?; in der BlueGrays-App findest du Projekte zu LED-Dimmen mit PWM, Helligkeit per Potentiometer und RGB-Farbübergängen Schritt für Schritt mit Code.
Häufige Fragen
Was ist PWM in Kürze?
PWM stellt die mittlere Leistung an einer Last ein, indem ein Pin sehr schnell ein- und ausgeschaltet und der Anteil der Einschaltzeit (Tastgrad) verändert wird. So kann ein Digitalpin, der nur 0 oder 5 V kennt, eine LED dimmen oder einen Motor verlangsamen.
Welche Pins des Arduino Uno unterstützen PWM?
Beim Uno und Nano unterstützen die Pins 3, 5, 6, 9, 10 und 11 PWM; sie sind auf der Platine mit ~ markiert. Beim Mega können die Pins 2–13 und 44–46 PWM ausgeben.
Liefert analogWrite einen echten Analogausgang?
Nein. analogWrite erzeugt PWM; der Pin springt schnell zwischen 0 und 5 V. Damit stellst du die mittlere Spannung ein, für eine wirklich konstante Spannung brauchst du aber einen RC-Filter oder einen DAC wie beim ESP32.
Wie berechnet man den Tastgrad?
Der Tastgrad ist die HIGH-Zeit geteilt durch die gesamte Periode: (HIGH-Zeit / Periode) × 100. Am Arduino teilst du den analogWrite-Wert durch 255 und multiplizierst mit 100; 64 entspricht zum Beispiel etwa 25 %.
Wie ändere ich die PWM-Frequenz am Arduino?
analogWrite ändert die Frequenz nicht. Beim Uno lässt sie sich über die Timer-Register einstellen (zum Beispiel TCCR1B für die Pins 9 und 10), was aber millis und Bibliotheken beeinflussen kann. Am ESP32 legst du die Frequenz direkt mit ledcAttach fest, am Pico mit freq().
Kann PWM einer LED schaden?
Nein. Die LED leuchtet während jedes Pulses mit vollem Strom, der aber ohnehin durch den Vorwiderstand begrenzt ist; der mittlere Strom sinkt im Verhältnis des Tastgrads. Mit dem richtigen Widerstand verkürzt PWM die Lebensdauer der LED nicht.
Projekte, die du danach bauen kannst
Alle Projekte ansehen
ESP32 LED-Überblendung mit PWM
Ändern Sie die Helligkeit der LED stufenlos von 0 bis max, von max bis 0. Wir steuern PWM mit analogWrite() wie in Arduino - die gleiche Syntax mit ESP32 Arduino Core 3.0+ funktioniert reibungslos. Pin-Definition + pinMode + analogWrite ist genug.

Raspberry Pi Pico PWM LED Fade (Atem-Effekt, GP14)
Die LED blinkt nicht mehr nur — sie atmet! 🌬️ Mit der **PWM** (Pulsweitenmodulation) des Raspberry Pi Pico steigt die Helligkeit langsam an und fällt wieder ab. Lerne die machine.PWM-Klasse, duty_u16() (16-Bit-Helligkeit 0–65535), PWM-Frequenz, range()-Schleifen und analogähnliche Ausgabe. Grundlage für RGB-Farbmischung, Motorsteuerung, Servos und Buzzer.

ESP32: LED-Helligkeit mit Potentiometer (Analog → PWM)
In diesem Projekt steuern wir die Helligkeit einer LED analog über ein Potentiometer. Der ADC-Pin des ESP32 liest die vom Potentiometer kommende Spannung von 0-3,3 V aus, woraufhin dieser Wert in ein PWM-Signal (Pulsweitenmodulation) umgewandelt und an die LED gesendet wird. So leuchtet die LED beim Drehen des Potentiometers stufenweise auf und erlischt wieder. Mit Arduino Core 3.0+ kann `analogWrite()` direkt verwendet werden; bei ESP32-S2/S3 ist die ADC-Auflösung auf 12 Bit festgelegt.

Sanfte Farbübergänge mit RGB-Led
Projekt, das einen sanften Regenbogeneffekt durch allmähliches Umschalten der Farben der RGB-LEDs mit analogWrite erzeugt. Lehrt die Logik der Farbmischung und der Übergangsanimation mit PWM.

ESP32 RGB-LED-Steuerung
Unbegrenzte Farberzeugung mit einer einzigen RGB-LED anstelle von 3 separaten LEDs. Wie in Arduino machen wir Regenbogenübergänge, indem wir R/G/B-Werte mit analogWrite() setzen. Die Farbtheorie (z. B. Rot+Grün=Gelb) wird praktisch umgesetzt.

Raspberry Pi Pico RGB-LED Farbwechsel (3-Kanal-PWM, GP11-13)
Eine LED, Millionen Farben! 🌈 Eine RGB-LED enthält 3 LEDs: Rot, Grün und Blau. Mit je einem PWM-Kanal des Pico mischst du Farben: Rot + Grün = Gelb, Grün + Blau = Cyan, alle drei = Weiß. Die LED wechselt durch 8 Farben. Lerne mehrere PWM-Kanäle, Funktionen (def), RGB-Farbmischung, 8-Bit → 16-Bit-Umrechnung (x257) und gemeinsame Kathode vs. Anode.

ESP32-Servomotor (Steuerung über Potentiometer)
In diesem Projekt steuern wir einen SG90-Servomotor mit einem Potentiometer. Wir stellen den Servowinkel ein, indem wir den vom Potentiometer gelesenen Analogwert auf den Bereich von 0 bis 180 Grad abbilden. Dank der ESP32Servo-Bibliothek kann jeder GPIO-Pin des ESP32 ein PWM-Signal erzeugen. Dies ist eine grundlegende Steuerungsmethode für Roboterarme, Kamera-Gimbals und automatische Türmechanismen.

ESP32-Farbmischerlampe (3 Potentiometer + RGB-LED + OLED)
Eine intelligente Farbmischer-Lampe mit ESP32, die durch Drehen von drei Potentiometern die gewünschte Farbe mischt! Wenn Sie die Potentiometer für Rot, Grün und Blau drehen, ändert die RGB-LED mit gemeinsamer Kathode sofort ihre Farbe. Auf dem SSD1306-OLED-Display werden für jede Farbe Werte im Bereich von 0 bis 255, visuelle Füllbalken und der HEX-Webfarbcode (z. B. #FF8040) in Echtzeit angezeigt. Ein professionelles Mini-Farbstudio – vermittelt in einem einzigen Projekt Kenntnisse über die RG
Weitere Artikel
Lerne, wie ein digitaler Pin eine LED dimmt und einen Motor verlangsamt, was Tastgrad und Frequenz bedeuten, wie du analogWrite richtig nutzt und wie PWM am ESP32 und Pico funktioniert.

