Sygnał PWM (Pulse Width Modulation) to jedna z kluczowych technik w elektronice i robotyce, umożliwiająca precyzyjne sterowanie prędkością silników DC, serwomechanizmów oraz regulatorów ESC. W Arduino PWM moduluje szerokość impulsów, co skutecznie symuluje zmienne napięcie bez istotnych strat mocy – idealnie do projektów mobilnych i mechatronicznych.
Współczynnik wypełnienia bezpośrednio przekłada się na średnie napięcie widziane przez obciążenie, a tym samym na prędkość i moment silnika.
Czym jest sygnał PWM i jak działa?
PWM polega na cyklicznym przełączaniu napięcia zasilania w bardzo krótkich odstępach czasu. Każdy cykl składa się z okresu stanu wysokiego (HIGH, np. 5 V) oraz stanu niskiego (LOW, 0 V). Kluczowy parametr to współczynnik wypełnienia (duty cycle), czyli procent czasu, w którym sygnał pozostaje w stanie wysokim w obrębie jednego cyklu.
Przykład: wartość PWM = 128 w Arduino (skala 0–255) oznacza ~50% wypełnienia, co daje średnie napięcie około połowy napięcia zasilania. W praktyce, przy sterowaniu przez mostek H (np. L298N) średnie napięcie na silniku będzie niższe z powodu spadku napięcia na tranzystorach mostka.
Arduino generuje PWM na wybranych pinach oznaczonych symbolem ~. Częstotliwość zależy od pinu i timera, co ilustruje poniższe zestawienie dla Arduino Uno:
| Model | Piny PWM | Typowe częstotliwości |
|---|---|---|
| Arduino Uno/Nano | 3, 9, 10, 11 | ok. 490 Hz |
| Arduino Uno/Nano | 5, 6 | ok. 980 Hz |
Zalety PWM w sterowaniu
Najważniejsze korzyści wynikające z użycia PWM to:
- niskie straty ciepła w porównaniu z regulatorami rezystorowymi,
- precyzyjna kontrola prędkości i momentu obrotowego,
- prosta implementacja w Arduino za pomocą funkcji
analogWrite(pin, wartosc).
Sterowanie silnikami DC za pomocą PWM i mostka H L298N
Silniki DC wymagają mostka H, aby zmieniać kierunek obrotów i regulować prędkość. Popularny moduł L298N obsługuje dwa silniki (kanały A i B), wykorzystując IN1–IN4 do kierunku oraz ENA/ENB dla sterowania PWM. Zasilanie modułu sięga do 35 V (prąd zależny od obciążenia i chłodzenia).
Pamiętaj: aby sterować prędkością programowo, usuń zworki z pinów ENA/ENB i podaj na nie sygnał PWM z Arduino.
Schemat podłączenia L298N do Arduino
Podłącz elementy zgodnie z poniższymi krokami:
- połącz ENA z pinem PWM Arduino (np. D9) – sterowanie prędkością silnika A,
- połącz IN1 i IN2 z pinami cyfrowymi (np. D8 i D7) – sterowanie kierunkiem silnika A,
- podłącz silnik do wyjść OUT1 i OUT2 modułu L298N,
- zdejmij zworki z ENA/ENB, aby aktywować programową regulację PWM.
Przykładowy kod Arduino do sterowania prędkością i kierunkiem
Oto prosty przykład kontroli kierunku, prędkości i hamowania silnika DC przez L298N:
int enA = 9; // Pin PWM dla silnika A
int in1 = 8;
int in2 = 7;
void setup() {
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
}
void forward(int pwm) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, pwm);
}
void backward(int pwm) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA, pwm);
}
void brake() {
// szybkie hamowanie: oba wejścia w ten sam stan
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
analogWrite(enA, 0);
}
void coast() {
// swobodny wybieg: oba wejścia LOW
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(enA, 0);
}
void loop() {
forward(255); // 100% duty cycle
delay(2000);
analogWrite(enA, 128); // 50% duty cycle
delay(2000);
brake();
delay(1000);
backward(200);
delay(2000);
coast();
delay(1000);
}
Kierunek: IN1 = HIGH i IN2 = LOW → przód; odwrotnie → tył; jednakowy stan na obu wejściach → hamowanie.
Sterowanie serwomechanizmami i ESC za pomocą PWM
Serwomechanizmy (np. SG90) wykorzystują sygnał PWM o częstotliwości 50 Hz, gdzie impulsy 1–2 ms odpowiadają zakresowi ~0–180°. Biblioteka Servo.h automatyzuje generowanie poprawnych impulsów.
Zalecenie zasilania: większe serwa i ESC zasilaj z osobnego, wydajnego źródła, a masę połącz wspólnie z Arduino.
Podłączenie
Sygnał sterujący serwa podłącz do pinu cyfrowego Arduino (np. D9). Zasilanie serwa (Vcc i GND) doprowadź z osobnego źródła, jeśli prąd serwa przekracza możliwości stabilizatora płytki.
Przykładowy kod dla serwa
Poniżej przykład ustawiania pozycji 0°, 90° i 180°:
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9); // Pin D9
}
void loop() {
myservo.write(0); // Pozycja 0°
delay(1000);
myservo.write(90); // Pozycja 90°
delay(1000);
myservo.write(180); // Pozycja 180°
delay(1000);
}
Dla ESC (Electronic Speed Controller) w silnikach BLDC również używa się biblioteki Servo.h do sygnału 1000–2000 µs. 1500 µs to zwykle punkt neutralny (zatrzymany silnik), wyższe wartości przyspieszają, niższe zwalniają. Przed pierwszym użyciem wiele ESC wymaga procedury „arming” lub kalibracji zakresu.
Kod dla ESC (dwukierunkowy)
Prosty przykład sterowania gazem dla ESC z zakresem dwukierunkowym:
#include <Servo.h>
Servo esc;
int throttle = 1500; // Neutralna pozycja
void setup() {
esc.attach(9);
esc.writeMicroseconds(1500); // arming/neutral
delay(1000);
}
void loop() {
throttle = 1600; // Przyspiesz
esc.writeMicroseconds(throttle);
delay(1000);
throttle = 1400; // Zwolnij
esc.writeMicroseconds(throttle);
delay(1000);
}
Zakres i zachowanie ESC mogą się różnić – zawsze sprawdź dokumentację i skalibruj regulator.
Zaawansowane zastosowania PWM w robotyce
Poniżej kilka praktycznych scenariuszy, w których PWM daje najwięcej korzyści:
- Silniki krokowe i BLDC – PWM na pinach Enable sterowników (np. A4988) kontroluje prędkość;
- Dwukierunkowe sterowanie – kombinacja PWM z mostkiem H umożliwia precyzyjne ruchy lewo–prawo i hamowanie;
- Integracja z sensorami – enkodery i PID zapewniają sprzężenie zwrotne i stabilizację prędkości;
- Wielokanałowe sterowanie – różne wartości PWM na dwóch silnikach DC umożliwiają skręt robota mobilnego.
Typowe problemy i rozwiązania
Jeśli napotkasz kłopoty, sprawdź poniższe wskazówki:
- hałas silnika – zwiększ częstotliwość PWM (np. biblioteki lub konfiguracja timerów);
- przegrzewanie L298N – zastosuj radiator, popraw przepływ powietrza i ogranicz prąd;
- niespójna prędkość – kalibruj współczynnik wypełnienia i stosuj sprzężenie zwrotne.
Przykładowe projekty robotyczne
Oto trzy proste pomysły, w których PWM sprawdza się znakomicie:
- Podwozie robota – dwa silniki DC na L298N, sterowanie joystickiem i regulacja prędkości przez PWM;
- Ramię robotyczne – kilka serw sterowanych przez Servo.h do precyzyjnych ruchów i chwytania;
- Dron lub ROV – ESC z sygnałem PWM do napędu BLDC i płynnego sterowania ciągiem.