Сервопривод для моделей — это двигатель с редуктором, потенциометром на выходном валу и платой управления. Плата сравнивает положение вала с длительностью входного импульса и крутит двигатель, пока они не совпадут. Импульсы повторяются с периодом около 20 мс; угол задаёт только длительность импульса, а не коэффициент заполнения как таковой — при 50 Гц он лежит в пределах 2,5–12,5 %.
Длительность импульса и угол
Зависимость линейная: каждый градус добавляет одно и то же число микросекунд,
Но концы диапазона у каждого производителя свои:
| Источник | Импульс | Ход | мкс на градус | Частота |
|---|---|---|---|---|
| Parallax Standard Servo 900-00005 | 620–2420 мкс, центр 1520 | 180° | 10 | 50 Гц |
| Hitec HS-422 | 900–2100 мкс, центр 1500 | ±60° | 10 | — |
| Arduino Servo, по умолчанию | 544–2400 мкс | 180° | 10,3 | 50 Гц |
У Parallax 90° — это 1520 мкс, у Arduino Servo те же 90° дают 1472 мкс, а 1500 мкс соответствуют 92,7°. Поэтому «1,5 мс — центр» верно лишь приблизительно, а для точной работы диапазон берут из документации на свой привод или подбирают на образце. Parallax указывает и рабочий диапазон своего привода — 500–2530 мкс: за его пределами привод перестаёт держать положение.
Таймер AVR
На ATmega328P удобнее всего 16-битный Timer1 в режиме 14 (Fast PWM, TOP = ICR1). Частота повторения по даташиту
а выход OC1A держится в единице OCR1A + 1 тиков. При 16 МГц и N = 8 один тик — 0,5 мкс, ICR1 = 39 999 даёт ровно 50 Гц, и импульс 1500 мкс получается при OCR1A = 2999. Библиотека Arduino Servo тоже работает на Timer1 с предделителем 8, только формирует импульсы в прерываниях, чтобы вести до 12 приводов одним таймером. Шаг в 0,5 мкс — это 0,05° у привода с 10 мкс на градус, точнее, чем держит механика.
Таймер STM32
У STM32 частота счётчика — fTIM/(PSC + 1), период — ARR + 1 тиков, а в режиме PWM mode 1 выход активен, пока счётчик меньше CCRx. Калькулятор подбирает самый маленький предделитель, при котором период получается точно. Для таймера на 72 МГц это PSC = 23 и ARR = 59 999: тик 1/3 мкс, импульс 1520 мкс — CCR = 4560. Если удобнее считать в микросекундах, можно взять PSC = 71 — тогда ARR = 19 999 и CCR равен длительности импульса в микросекундах.
Питание и ток
Привод потребляет мало, пока стоит, и много, когда двигается или упирается. По спецификации Hitec HS-422 потребляет 8 мА в покое, 150–180 мА при движении без нагрузки и 600–750 мА при остановке вала; на странице изделия Hitec указаны 800 мА — для расчёта питания берите большее. Parallax предупреждает, что ток его привода под нагрузкой кратковременно доходит до 500 мА и больше, и в схеме подключения даёт приводу отдельный источник питания. Источник рассчитывают на сумму токов остановки всех приводов, которые могут упереться одновременно, — это сделает калькулятор бюджета питания. Регистры для других частот и таймеров подберёт калькулятор таймера.
Частые вопросы
Какая длительность импульса у сервопривода?
Общего стандарта нет. Часто называют 1–2 мс при 50 Гц, но производители дают свои диапазоны: Parallax Standard Servo — 620–2420 мкс на 180°, Hitec HS-422 — 900–2100 мкс на ±60° с центром 1500 мкс, библиотека Arduino Servo по умолчанию — 544–2400 мкс на 180°. Если документа нет, начните с 1500 мкс и расширяйте диапазон понемногу, пока вал не дойдёт до упора без гудения.
Почему сервопривод гудит и греется в крайнем положении?
Импульс просит угол за механическим упором, и привод пытается его достичь: двигатель стоит под током, близким к току остановки. У Hitec HS-422 это 600–750 мА по спецификации v2.2 и 800 мА по странице изделия против 150–180 мА без нагрузки. Сузьте диапазон импульсов, чтобы крайние значения не доходили до упоров.
Как настроить Timer1 ATmega328P на сервопривод?
При 16 МГц и предделителе 8 таймер тикает каждые 0,5 мкс. Режим 14 (Fast PWM, TOP = ICR1) с ICR1 = 39 999 даёт период 20 мс, то есть 50 Гц. Импульс длится OCR1A + 1 тиков: для 1500 мкс OCR1A = 2999, для 1000 мкс — 1999, для 2000 мкс — 3999. Так один таймер ведёт два привода через выходы OC1A и OC1B.
Можно ли питать сервопривод от вывода 5 В платы Arduino?
Один маленький привод без нагрузки — иногда, но ток при остановке и при старте в сотни миллиампер вызывает просадки и перезапуски микроконтроллера. В схеме подключения Parallax привод питается от отдельного источника, чтобы скачки его тока не вызывали просадку питания микроконтроллера; общая у них только земля. Суммарный ток всех приводов при остановке и подбор источника посчитает калькулятор бюджета питания.
Источники
- Parallax Inc. Parallax Standard Servo (#900-00005) Product Guide, v3.0 (цифровая версия, 2022) — страница загрузок Parallax (файл 900-00005-Parallax-Digital-Std-Servo-Guide-v3.0.pdf); ШИМ 50 Гц, период 20 мс; рабочий диапазон импульсов 500–2530 мкс ±20 мкс; 620 / 1520 / 2420 мкс — 0° / 90° / 180°, t_pulse = 10 · angle + 620; механические упоры около −10° и 190°; ток 100 мА в движении без нагрузки, 20 мА в покое, под нагрузкой кратко 500 мА и больше; в схеме подключения привод питается от отдельного источника, чтобы скачки его тока не вызывали просадку питания микроконтроллера, общая — земля
- Hitec RCD. HS-422 Deluxe Standard Servo — страница изделия — проверено 29.10.2026: питание 4,8–6,0 В, ток покоя 8 мА, без нагрузки 150 мА, ток остановки 800 мА, зона нечувствительности 8 мкс; диапазона импульсов на странице нет
- Hitec RCD. HS-422 General Specification, spec sheet v2.2 — копия на сайте SparkFun, на сайте Hitec файла нет; по умолчанию ±60°, длительность импульса 900–2100 мкс, центр 1500 мкс; питание 4,8–6,0 В; ток покоя 8 мА, без нагрузки 150 и 180 мА, ток остановки 600 мА при 4,8 В и 750 мА при 6,0 В; зона нечувствительности 5 мкс
- Arduino. Servo library, src/Servo.h и src/avr/Servo.cpp (LGPL 2.1) — MIN_PULSE_WIDTH 544 мкс, MAX_PULSE_WIDTH 2400 мкс, DEFAULT_PULSE_WIDTH 1500 мкс, REFRESH_INTERVAL 20 000 мкс; write(angle) переводит 0–180° в 544–2400 мкс; Timer1 с предделителем 8, usToTicks(us) = clockCyclesPerMicrosecond() · us / 8
- Microchip. ATmega328P Data Sheet (DS40002061B), 16-bit Timer/Counter1 — Fast PWM: f = f_clk_I/O / (N · (1 + TOP)), режим 14 — TOP = ICR1; неинвертирующий выход OC1A устанавливается на BOTTOM и сбрасывается при совпадении с OCR1A
- STMicroelectronics. RM0008 Reference Manual, STM32F101xx–F107xx, general-purpose timers TIM2–TIM5 — частота счётчика f_TIM / (PSC + 1), период (ARR + 1) тактов; PWM mode 1 при счёте вверх — выход активен, пока CNT < CCRx
Где пригодится
- Почему сервопривод дёргается?Просадка питания, нет общей земли, импульс дрожит больше зоны нечувствительности
- Управляющий импульс сервоприводаИмпульс раз в 20 мс, длительность которого задаёт угол поворота сервопривода
- Зона нечувствительности сервоприводаМинимальное изменение импульса, на которое сервопривод отвечает движением
- Сервопривод постоянного вращенияСервопривод, у которого импульс задаёт скорость и направление вращения
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/servo-pwm/" title="Сигнал управления сервоприводом: импульс, угол, таймер" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/servo-pwm/">Сигнал управления сервоприводом: импульс, угол, таймер</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?