Перейти к содержанию

Почему сервопривод дёргается?

Обновлено Редакция GAW

Сервопривод сравнивает длительность управляющего импульса с положением своего потенциометра и крутит двигатель, пока они не совпадут. Дёргается он, когда меняется одно из двух: напряжение питания проседает так, что сбрасывается электроника, или сам импульс от периода к периоду разной длины.

Питание

Parallax в руководстве на стандартный привод указывает: в движении без нагрузки он берёт около 100 мА, а под нагрузкой ток кратко растёт до 500 мА и больше. У HS-422 при остановке вала — 600–750 мА. Если привод питается от того же стабилизатора, что и микроконтроллер, такой скачок вызывает провал питания: сбрасывается плата, импульсы прерываются, привод дёргается — и цикл повторяется. Parallax рекомендует отдельное питание для приводов и общую землю с микроконтроллером.

Дрожание импульса

У каждого привода есть зона нечувствительности — изменение длительности импульса, на которое он не реагирует. У HS-422 это 5 мкс по спецификации (8 мкс на странице изделия). Ход ±60° при импульсах 900–2100 мкс даёт:

120∘2100−900 мкс=0,1∘ на мкс\frac{120^\circ}{2100 - 900\ \text{мкс}} = 0{,}1^\circ\ \text{на мкс}

то есть зона нечувствительности соответствует 0,5° (наш расчёт). Если длительность импульса гуляет больше чем на 5 мкс, привод отрабатывает каждое изменение и дрожит.

Источник дрожанияПочемуЧто делать
Нет общей землиимпульс отсчитывается от «плавающего» уровнясоединить минусы питания привода и платы
Другие прерываниябиблиотека Servo формирует фронты в прерывании таймера, чужое прерывание его задерживаетаппаратный ШИМ таймера или PCA9685
Наводки на длинном проводефронт искажается рядом с силовыми проводамикороткий провод, витая пара с землёй
Шум в программезначение угла меняется на единицу туда-сюдафильтр или гистерезис перед write()

Библиотека Arduino Servo считает время таймером с предделителем 8 — на 16 МГц это 0,5 мкс на такт, а сами фронты переключает обработчик прерывания. Пока выполняется другое прерывание, фронт ждёт, и импульс удлиняется. Аппаратный ШИМ таймера формирует фронты без участия программы — настройку для AVR и STM32 считает калькулятор ШИМ для сервопривода. Для многих приводов удобна микросхема PCA9685.

Что такое управляющий импульс и какие длительности допустимы, описано в статье об импульсе управления сервоприводом, подключение и питание — в статье «Сервоприводы».

Похожие вопросы

Помогает ли конденсатор на питании сервопривода?

Помогает сгладить короткие провалы, если источник в целом тянет ток: электролит у разъёма привода отдаёт пиковый ток, пока стабилизатор догоняет. Слабый источник или тонкие длинные провода конденсатор не заменит.

Почему сервопривод дёргается при включении питания?

Пока программа не начала слать импульсы, на сигнальном входе может быть случайный уровень, и привод на миг поворачивается. Помогает подключить attach() и задать положение сразу после старта, а питание привода подавать после того, как микроконтроллер заработал.

Почему привод дёргается, только когда работает другая часть программы?

Библиотека Servo переключает фронты в обработчике прерывания таймера. Код, который надолго запрещает прерывания или сам долго сидит в прерывании, задерживает фронт, и импульс удлиняется на это время. Помогает аппаратный ШИМ или отдельный контроллер вроде PCA9685.

Источники

  1. Parallax Inc. Parallax Standard Servo (#900-00005) Product Guide, v3.0 — питание 4–6 В; 100 мА в движении без нагрузки, 20 мА в покое; под нагрузкой ток кратко растёт до 500 мА и больше; отдельное питание привода и общая земля с микроконтроллером, чтобы скачки тока не вызывали провал питания (brown-out) микроконтроллера; один стабилизатор на всё — только если он держит напряжение при одновременном пиковом токе всех приводов
  2. Hitec RCD. HS-422 General Specification, spec sheet v2.2 — зона нечувствительности 5 мкс; ход ±60° при 900–2100 мкс; ток при остановке 600/750 мА при 4,8/6 В; на странице изделия hitecrcd.com — 8 мкс и 800 мА
  3. Arduino. Servo library, src/avr/Servo.cpp (LGPL 2.1) — библиотека формирует импульсы в прерывании 16-битного таймера (Interrupt driven Servo library); предделитель 8, перевод микросекунд в такты usToTicks; период REFRESH_INTERVAL 20 000 мкс

Нашли ошибку?