Что такое ШИМ и как им управляют скоростью мотора и сервоприводом?
В коде Arduino для мотора и серво используют ШИМ (PWM). Что это за сигнал и как он задаёт то скорость мотора, то угол сервопривода? Не понимаю, как один сигнал делает разное.
2 ответа
ШИМ (PWM, широтно-импульсная модуляция) — это способ управлять «средней мощностью», очень быстро включая и выключая сигнал. Важна скважность (duty cycle) — какую долю времени сигнал включён.
Если сигнал включён 50% времени и выключен 50% — на выходе как бы «половина» мощности; 80% включено — почти полная. Переключения такие частые, что мотор/глаз видят усреднённое значение, а не мигание.
Управление скоростью DC-мотора: напрямую крутить регулировкой напряжения неудобно. Вместо этого подают ШИМ через драйвер (например L298N): скважность 30% → мотор крутится медленно, 90% → быстро. То есть скважность = «газ».
Управление сервоприводом — тут ШИМ значит другое! Серво слушает не «среднюю мощность», а длину одного импульса, который повторяется каждые ~20 мс:
- импульс ~1.0 мс → угол 0°;
- ~1.5 мс → 90° (центр);
- ~2.0 мс → 180°.
То есть для серво важна ширина импульса как команда угла, а не доля включённого времени.
Почему один сигнал делает разное: ШИМ — это просто прямоугольные импульсы, а смысл им придаёт получатель. Мотор-драйвер трактует скважность как мощность; серво трактует длину импульса как угол. В Arduino это видно по коду: analogWrite() для скорости мотора и Servo.write(угол) для серво (библиотека сама делает нужные импульсы).
Суть: ШИМ — это быстрое «вкл-выкл», а управляет доля включённого времени. Для мотора эта доля = скорость (больше включено — быстрее). Для серво хитрее: серво смотрит на длину импульса (1.5 мс ≈ центр, 2 мс ≈ край) и ставит соответствующий угол. Один и тот же тип сигнала, но мотор и серво «читают» его по-разному — поэтому в Arduino для них и функции разные.