Опубликовано 2026-04-02
В этом руководстве объясняется, как управлять стандартнымсервоприводдвигатель с использованием сигналов широтно-импульсной модуляции (ШИМ). Вы узнаете точные параметры ШИМ (период, ширина импульса, рабочий цикл), необходимые для установкисервоприводна любой угол от 0 до 180 градусов. The instructions are based on widely available microcontroller platforms and have been verified with common 50Hz analog and digitalсервоприводИспользуется в любительской робототехнике. Следуя пошаговым примерам кода и методам калибровки, вы сможете надежно позиционировать сервопривод без дрожания и дрейфа.
Стандартный серводвигатель ожидает сигнал ШИМ со следующими фиксированными характеристиками:
Период сигнала: 20 мс (миллисекунды), что соответствует частоте50 Гц.
Ширина импульса (большое время): варьируется между1,0 мси2,0 мс.
Рабочий цикл= (ширина импульса / 20 мс) × 100%.
Примечание. Некоторые сервоприводы могут принимать значение от 0,5 до 2,5 мс для расширенного диапазона, но стандартные 1,0–2,0 мс подходят почти для всех распространенных сервоприводов.
Следующая структура кода работает на любой платформе, обеспечивающей аппаратную ШИМ (например, Arduino, STM32, ESP32, Raspberry Pi с аппаратной ШИМ). Мы используем общий псевдокод, чтобы вы могли адаптировать его к своему конкретному микроконтроллеру.
Выберите вывод с поддержкой ШИМ.
Установите частоту ШИМ на50 Гц(период = 20 мс).
Установите разрешение не менее 8 бит (0–255) или 16 бит для более точного управления.
Для 8-битного ШИМ (0 = коэффициент заполнения 0 %, 255 = коэффициент заполнения 100 %):
Рабочий цикл для 1,0 мс = (1,0/20,0) × 255 = 12,75 → округляется до13
Рабочий цикл для 1,5 мс = (1,5/20,0) × 255 = 19,125 → округлить до19
Рабочий цикл для 2,0 мс = (2,0/20,0) × 255 = 25,5 → округлить до26
Общая формула для любого угла (0–180°):
pulse_width_ms = 1,0 + (угол/180,0)(2,0–1,0) значение_должности = (ширина_импульса_мс / 20,0)(2^разрешение - 1)
Пример для 8-битного разрешения и угла 45°:
![]()
Pulse_width_ms = 1,0 + (45/180)1,0 = 1,25 мс
обязанность_значение = (1,25/20)255 = 15,9375 → целое число16
// Псевдокод pwm_set_ Frequency(PWM_PIN, 50); // 50 Гц pwm_set_solve(PWM_PIN, 8); // 8-битное целое число = 90; // целевой угол intduty = map(angle, 0, 180, 13, 26); // используя заранее вычисленную минимальную/максимальную нагрузку pwm_write(PWM_PIN,duty);
Поскольку не существует двух абсолютно идентичных сервоприводов, всегда измеряйте фактические пределы ширины импульса:
1. Запишите импульс длительностью 1,0 мс – наблюдайте за положением сервопривода. Если он не достигает физического упора, увеличивайте ширину импульса с шагом 0,05 мс, пока он не перестанет двигаться (запишите какмой_пульс).
2. Запишите импульс длительностью 2,0 мс – аналогичным образом найдите максимальную ширину импульса, обеспечивающую полное вращение (max_pulse).
3. Используйте эти измеренные значения в своем коде вместо теоретических 1,0/2,0 мс.
Общий случай: Требуется типичный микросервопривод Tower Pro SG90.мин_пульс = 0,9 мсимакс_пульс = 2,1 мсдля истинного диапазона 0–180°. Всегда калибруйте для каждой модели сервопривода.
// Управление сервоприводом с использованием ШИМ – внешние библиотеки не требуются // Работает на любой плате с аппаратным ШИМ (например, Uno, Nano, Mega, ESP32) const int servoPin = 9; // вывод ШИМ const int freq = 50; // 50 Гц const int разрешение = 8; // 8 бит (0–255) // Предварительно калиброванные пределы импульсов (в микросекундах) const int minPulseUs = 1000; // 1,0 мс = 1000 мкс const int maxPulseUs = 2000; // 2,0 мс = 2000 мкс void setup() { // Настраиваем ШИМ LEDcSetup(0, Freq, Разрешение); // канал 0ledcAttachPin(servoPin, 0); } void setServoAngle(int angular) { // Ограничиваем угол значением 0-180 angular = constrain(angle, 0, 180); // Преобразование угла в ширину импульса (микросекунды) intpulseUs = minPulseUs + (angle(maxPulseUs - minPulseUs)) / 180; // Преобразование ширины импульса в рабочий цикл (0-255) intduty = (pulseUs255)/20000; // 20000 мкс = период 20 мсledcWrite(0, Duty); } void Loop() { setServoAngle(0); // переход на 0° задержка(1000); setServoAngle(90); // переход на 90° Delay(1000); setServoAngle(180); // переход на 180° Delay(1000); }
1. Всегда калибруйте каждый сервопривод индивидуально.– даже два сервопривода одной модели могут иметь отклонение ±0,1 мс. Напишите простой тестовый эскиз с разверткой от 0,5 мс до 2,5 мс и запишите точную ширину импульса для 0° и 180°.
2. Используйте отдельный источник питания– никогда не подавайте питание на сервопривод напрямую от контакта 5 В вашего микроконтроллера (скачки тока могут привести к перезагрузке платы). Регулируемый источник питания 5 В/2 А или 4 NiMH аккумулятора (4,8 В) работают надежно.
3. Добавьте электролитический конденсатор емкостью 100–470 мкФ.через клеммы питания сервопривода рядом с сервоприводом. Это компенсирует провалы напряжения, вызванные внезапным запуском двигателя.
4. Избегайте задержек программного обеспеченияпока сервопривод движется. Используйте неблокирующую синхронизацию (например, конечные автоматы на основе millis()), чтобы ваша программа могла выполнять другие задачи.
5. Для высокоточных приложений (например, роботизированных манипуляторов), используйте 16-битный таймер ШИМ и линейную интерполяцию между калиброванными точками. Также рассмотрите возможность добавления 10-битного потенциометра аналоговой обратной связи для замыкания контура.
Основной вывод: Управление сервоприводом с помощью ШИМ становится простым, если вы зафиксировали частоту 50 Гц и настроили угол на ширину импульса 1,0–2,0 мс. Однако реальная надежность обеспечивается правильной калибровкой, адекватной мощностью и использованием измеренных пределов, а не теоретических значений. Применяйте метод калибровки, описанный в разделе 2.4, к каждому новому сервоприводу, который вы интегрируете, и ваши проекты будут каждый раз достигать плавного и точного движения.
Время обновления: 2 апреля 2026 г.
Свяжитесь со специалистом по продукции Kpower, чтобы порекомендовать подходящий двигатель или редуктор для вашего продукта.