W tym artykule rozkładam na części PWM w Arduino: od tego, co naprawdę oznacza wypełnienie impulsów, przez dobór pinów, po prosty przykład z diodą LED i potencjometrem. To praktyczny przewodnik po arduino pwm, który pokazuje też, kiedy ta metoda wystarcza, a kiedy lepiej sięgnąć po tranzystor, driver silnika albo prawdziwe wyjście analogowe. Po lekturze łatwiej ocenisz, czy dane rozwiązanie pasuje do Twojego układu, czy tylko dobrze wygląda na schemacie.
Najważniejsze informacje o PWM w Arduino w skrócie
- PWM to sygnał impulsowy, który udaje analog przez zmianę wypełnienia, a nie stałego napięcia.
- Na klasycznych płytkach Arduino `analogWrite()` działa zwykle w zakresie 0-255, gdzie 0 oznacza wyłączenie, a 255 pełne włączenie.
- Na Uno, Nano i Mini najczęściej używa się pinów 3, 5, 6, 9, 10 i 11.
- LED-y można sterować bezpośrednio, ale silników i większych obciążeń nie podłącza się prosto do pinu.
- Jeśli potrzebujesz prawdziwego napięcia analogowego, szukaj płytki z DAC albo użyj filtru RC.
- Najczęstszy błąd początkujących to mierzenie PWM zwykłym multimetrem i oczekiwanie stabilnych 5 V.

Jak działa PWM i dlaczego nie jest to prawdziwe napięcie analogowe
PWM, czyli Pulse Width Modulation, działa jak szybko przełączany sygnał prostokątny. Arduino nie „wytwarza” tu klasycznego napięcia analogowego, tylko bardzo szybko zmienia stan pinu między HIGH i LOW, a efekt końcowy zależy od tego, jak długo sygnał pozostaje w stanie wysokim w jednym okresie. Tę proporcję nazywamy wypełnieniem.
Jeśli wypełnienie wynosi 100%, pin jest praktycznie stale włączony. Przy 50% sygnał jest włączony przez połowę czasu, a wyłączony przez drugą połowę. Dla układu, który widzi to jako energię, taki sygnał może wyglądać jak „pośredni” poziom mocy. W praktyce właśnie dlatego LED świeci słabiej, a silnik kręci się wolniej.
Najprościej zapamiętać to tak: częstotliwość mówi, jak szybko pulsuje sygnał, a wypełnienie mówi, ile czasu jest aktywny. Na klasycznych płytkach Arduino wartość `analogWrite(255)` daje pełne wypełnienie, a `analogWrite(127)` zbliża się do 50%. W dokumentacji Arduino opisuje się to właśnie jako sposób uzyskania efektu analogowego przy użyciu cyfrowego wyjścia.
| Wartość `analogWrite()` | Przybliżone wypełnienie | Efekt na wyjściu |
|---|---|---|
| 0 | 0% | Pin wyłączony |
| 127 / 128 | Około 50% | Połowa mocy lub jasności |
| 255 | 100% | Pin stale włączony |
To podstawowe rozróżnienie przydaje się od razu przy wyborze pinów, bo nie każdy pin na płytce obsługuje taki tryb tak samo dobrze.
Które piny wybrać i jak czytać oznaczenia na płytce
W praktyce najważniejsze jest to, że PWM nie działa na każdym wyprowadzeniu. W oficjalnej dokumentacji Arduino piny PWM są zwykle oznaczane symbolem ~ przy numerze pinu. To wygodne, bo nie trzeba zgadywać, które wyjście da się użyć do płynnej regulacji jasności albo prędkości.
| Płytka | Typowe piny PWM | Uwagi praktyczne |
|---|---|---|
| Uno R3, Nano, Mini | 3, 5, 6, 9, 10, 11 | Najpopularniejszy zestaw dla początkujących |
| Uno R4 Minima / WiFi | 3, 5, 6, 9, 10, 11 | Podobny układ do klasycznego Uno |
| Mega | 2-13, 44-46 | Więcej kanałów, ale łatwiej o konflikt z innymi funkcjami |
| Leonardo, Micro | 3, 5, 6, 9, 10, 11, 13 | Przydatne, gdy projekt rozrasta się o kolejne wyjścia |
To, że pin obsługuje PWM, nie znaczy jeszcze, że zawsze będzie najlepszym wyborem. Na nowszych płytkach część dodatkowych wyjść bywa współdzielona z timerami i innymi funkcjami, więc przy bardziej złożonym projekcie trzeba uważać na konflikty. Ja zwykle zaczynam od pinów rekomendowanych przez producenta, a dopiero później szukam obejść, jeśli układ wymaga więcej kanałów.
Jeśli korzystasz z pinoutu na płytce, sprawdzaj nie tylko numer, ale właśnie oznaczenie `~`. To oszczędza czas i eliminuje wiele pozornie tajemniczych błędów, które w rzeczywistości wynikają z użycia zwykłego cyfrowego pinu.
Pierwszy praktyczny układ z diodą i potencjometrem
Najprostszy test PWM robię z diodą LED, rezystorem 220-330 Ω i potencjometrem 10 kΩ. Taki zestaw pozwala od razu zobaczyć, jak zmienia się jasność w zależności od wypełnienia. To dobry start, bo od razu oddziela teorię od realnego efektu na stole warsztatowym.
const int ledPin = 9;
const int potPin = A0;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
int reading = analogRead(potPin); // 0-1023
int pwmValue = reading / 4; // 0-255
analogWrite(ledPin, pwmValue);
}W tym kodzie `analogRead()` pobiera wartość z potencjometru w zakresie 0-1023, a potem dzielę ją przez 4, żeby pasowała do zakresu `analogWrite()`. Gdy przekręcasz potencjometr, LED płynnie rozjaśnia się i przygasa. To proste, ale bardzo pouczające, bo od razu widać, że PWM nie zmienia napięcia „skokowo” w odczuciu człowieka, tylko reguluje średni efekt energetyczny.
Jeżeli LED miga zamiast płynnie świecić, zwykle oznacza to zły pin, błędne podłączenie albo zbyt małą częstotliwość dla danego zastosowania. W takim przypadku najpierw sprawdzam okablowanie, dopiero potem kod. Z doświadczenia to oszczędza więcej czasu niż wielokrotne przepisywanie szkicu.
Ten sam schemat mentalny przydaje się później przy silnikach i taśmach LED, ale tam trzeba już przejść do mocniejszego sterowania.
Gdzie PWM daje najlepszy efekt w projektach
Najwięcej sensu PWM ma tam, gdzie chcesz regulować moc, a nie tylko stan włączony i wyłączony. Właśnie dlatego dobrze sprawdza się w kilku typowych scenariuszach:
- Ściemnianie diod LED - to najczystsze zastosowanie, bo oko widzi zmianę jasności jako płynną, nawet jeśli sygnał w środku jest impulsowy.
- Sterowanie silnikiem DC - PWM pozwala regulować prędkość, ale silnik powinien być podłączony przez tranzystor MOSFET albo sterownik H-bridge, nie bezpośrednio z pinu.
- Kontrola grzałki lub elementu grzejnego - w układach o dużej bezwładności cieplnej impulsowe sterowanie bywa bardzo skuteczne.
- Generowanie „pseudo-analogowego” napięcia - po filtrze RC można uzyskać wygładzony sygnał, choć to nie jest pełnoprawny DAC.
W przypadku silników i mocniejszych obciążeń ważny jest jeszcze jeden szczegół: PWM nie zastępuje zasilania o odpowiedniej wydajności prądowej. Arduino steruje tylko sygnałem, a nie całym obciążeniem. To rozróżnienie jest kluczowe, bo wiele problemów z przegrzewaniem, restartami i niestabilnością bierze się właśnie z próby „pociągnięcia” zbyt dużego prądu bezpośrednio z pinu.
Jeśli projekt dotyczy audio albo precyzyjnych napięć referencyjnych, zwykły PWM często przestaje wystarczać. Wtedy trzeba rozważyć płytkę z prawdziwym wyjściem analogowym albo zewnętrzny przetwornik.
Najczęstsze błędy, które psują efekt
Najczęściej widzę nie problem z samym PWM, tylko z oczekiwaniami wobec niego. Oto błędy, które wracają najczęściej:
- Mierzenie PWM zwykłym multimetrem - miernik pokaże wartość uśrednioną, więc nie zobaczysz prawdziwego przebiegu impulsów.
- Oczekiwanie pełnych 5 V przy `analogWrite(255)` - na wyjściu nadal masz sygnał impulsowy, a nie stałe napięcie analogowe.
- Podłączanie silnika bez tranzystora lub drivera - pin Arduino nie jest zasilaczem i nie powinien zasilać obciążenia bezpośrednio.
- Brak wspólnej masy - jeśli sterownik ma osobne zasilanie, masa musi być wspólna, inaczej układ zaczyna zachowywać się losowo.
- Użycie niewłaściwego pinu - zwykły pin cyfrowy nie wygeneruje PWM przez `analogWrite()`.
- Mylenie PWM z sygnałem serwa - serwa działają na innym modelu impulsów niż ściemnianie LED czy sterowanie silnikiem DC.
Najbardziej zdradliwy jest pierwszy punkt. Wiele osób widzi 2,8 V albo 4,7 V na mierniku i uznaje, że coś jest zepsute. Tymczasem miernik pokazuje uśrednioną wartość z przebiegu, który zmienia się bardzo szybko. To nie błąd układu, tylko błąd narzędzia pomiarowego do danego zadania.
Jeśli chcesz sprawdzić PWM naprawdę, użyj oscyloskopu albo analizatora logicznego. Wtedy od razu zobaczysz szerokość impulsu, częstotliwość i to, czy kod rzeczywiście ustawia takie wypełnienie, jak planowałeś.
Jak dobrać rozdzielczość, częstotliwość i właściwy typ wyjścia
Domyślnie Arduino pracuje z rozdzielczością 8 bitów, czyli `analogWrite()` przyjmuje wartości od 0 do 255. Na niektórych płytkach możesz użyć `analogWriteResolution()`, żeby zwiększyć precyzję sterowania. W zależności od architektury płytki zakres może być wyższy, a dokumentacja Arduino opisuje też sytuacje, w których nadmiarowe bity są po prostu obcinane albo uzupełniane zerami.
| Metoda | Co daje | Kiedy ją wybrać | Ograniczenie |
|---|---|---|---|
| `digitalWrite()` | Stan 0 lub 1 | Włączanie przekaźnika, proste testy, sygnalizacja | Brak regulacji pośredniej |
| `analogWrite()` z PWM | Regulację średniej mocy przez impulsy | LED, silnik DC, grzałka, wygładzanie prostych sygnałów | To nie jest prawdziwe napięcie analogowe |
| DAC lub wyjście analogowe | Rzeczywiste napięcie analogowe | Audio, referencje napięciowe, bardziej precyzyjne układy | Dostępne tylko na wybranych płytkach |
Jeśli potrzebujesz zmienić częstotliwość PWM, samo `analogWriteResolution()` nie wystarczy. Wtedy wchodzisz na poziom timerów albo korzystasz z bibliotek, które nimi zarządzają. To daje więcej kontroli, ale też zwiększa ryzyko konfliktów z innymi funkcjami płytki. Ja polecam taki krok dopiero wtedy, gdy zwykłe `analogWrite()` faktycznie nie spełnia wymagań projektu.
W praktyce najrozsądniejsza ścieżka wygląda tak: najpierw sprawdzasz, czy zwykły PWM rozwiązuje problem, potem ewentualnie przechodzisz do drivera, a dopiero później do zabawy z timerami lub DAC. Dzięki temu nie komplikujesz układu wcześniej, niż to konieczne.
Co warto zapamiętać przed podłączeniem większego obciążenia
Najlepsze projekty z PWM nie zaczynają się od skomplikowanej elektroniki, tylko od prostego testu na LED i jasnego zrozumienia, co dzieje się na pinie. Gdy to już działa, łatwiej przenieść tę samą logikę na silnik, grzałkę czy taśmę LED. Wtedy PWM przestaje być abstrakcyjną definicją, a staje się narzędziem do świadomego sterowania energią.
- Zacznij od małego obciążenia i sprawdź, czy pin jest poprawnie obsługiwany.
- Przy większych prądach użyj tranzystora MOSFET, drivera lub układu H-bridge.
- Jeśli projekt ma pracować stabilnie, dopilnuj wspólnej masy i osobnego zasilania dla obciążenia.
- Gdy potrzebujesz napięcia analogowego, nie udawaj, że PWM rozwiąże wszystko samodzielnie.
Właśnie tak patrzę na PWM w praktyce: jako na bardzo użyteczny kompromis między prostotą sterowania a płynną regulacją mocy. Dobrze użyty daje ogrom możliwości, ale tylko wtedy, gdy uwzględnisz ograniczenia pinu, obciążenia i samej płytki.