Управление сигналом ШИМ для серводвигателей: полное руководство по программированию_Servo_Industry Insights_Kpower
Дом > Обзор отрасли >Сервопривод
ТЕХНИЧЕСКАЯ ПОДДЕРЖКА

Управление сигналом ШИМ для серводвигателей: полное руководство по программированию

Опубликовано 2026-04-02

В этом руководстве объясняется, как управлять стандартнымсервоприводдвигатель с использованием сигналов широтно-импульсной модуляции (ШИМ). Вы узнаете точные параметры ШИМ (период, ширина импульса, рабочий цикл), необходимые для установкисервоприводна любой угол от 0 до 180 градусов. The instructions are based on widely available microcontroller platforms and have been verified with common 50Hz analog and digitalсервоприводИспользуется в любительской робототехнике. Следуя пошаговым примерам кода и методам калибровки, вы сможете надежно позиционировать сервопривод без дрожания и дрейфа.

01Основные параметры ШИМ для сервоуправления

Стандартный серводвигатель ожидает сигнал ШИМ со следующими фиксированными характеристиками:

Период сигнала: 20 мс (миллисекунды), что соответствует частоте50 Гц.

Ширина импульса (большое время): варьируется между1,0 мси2,0 мс.

Рабочий цикл= (ширина импульса / 20 мс) × 100%.

Желаемый угол сервопривода Ширина импульса Рабочий цикл (прибл.)
0° (минимум) 1,0 мс 5.0%
90° (нейтраль) 1,5 мс 7.5%
180° (максимум) 2,0 мс 10.0%

Примечание. Некоторые сервоприводы могут принимать значение от 0,5 до 2,5 мс для расширенного диапазона, но стандартные 1,0–2,0 мс подходят почти для всех распространенных сервоприводов.

02Программирование выхода ШИМ – шаг за шагом

Следующая структура кода работает на любой платформе, обеспечивающей аппаратную ШИМ (например, Arduino, STM32, ESP32, Raspberry Pi с аппаратной ШИМ). Мы используем общий псевдокод, чтобы вы могли адаптировать его к своему конкретному микроконтроллеру.

2.1 Настройка периферийного устройства ШИМ

Выберите вывод с поддержкой ШИМ.

Установите частоту ШИМ на50 Гц(период = 20 мс).

Установите разрешение не менее 8 бит (0–255) или 16 бит для более точного управления.

2.2 Преобразование желаемого угла в значение рабочего цикла

Для 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°:

舵机pwm控制源码_pwm控制舵机程序_pwm波控制舵机转动程序

Pulse_width_ms = 1,0 + (45/180)1,0 = 1,25 мс

обязанность_значение = (1,25/20)255 = 15,9375 → целое число16

2.3 Запись значения заполнения в регистр ШИМ.

// Псевдокод 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);

2.4 Калибровка в реальных условиях (устраняет дрожание)

Поскольку не существует двух абсолютно идентичных сервоприводов, всегда измеряйте фактические пределы ширины импульса:

1. Запишите импульс длительностью 1,0 мс – наблюдайте за положением сервопривода. Если он не достигает физического упора, увеличивайте ширину импульса с шагом 0,05 мс, пока он не перестанет двигаться (запишите какмой_пульс).

2. Запишите импульс длительностью 2,0 мс – аналогичным образом найдите максимальную ширину импульса, обеспечивающую полное вращение (max_pulse).

3. Используйте эти измеренные значения в своем коде вместо теоретических 1,0/2,0 мс.

Общий случай: Требуется типичный микросервопривод Tower Pro SG90.мин_пульс = 0,9 мсимакс_пульс = 2,1 мсдля истинного диапазона 0–180°. Всегда калибруйте для каждой модели сервопривода.

03Полный пример кода (в стиле Arduino, аппаратно-независимый)

// Управление сервоприводом с использованием ШИМ – внешние библиотеки не требуются // Работает на любой плате с аппаратным ШИМ (например, 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); }

04Устранение распространенных проблем с сервоприводами ШИМ

Проблема Наиболее вероятная причина Решение
Сервопривод не двигается Неправильная частота ШИМ (не 50 Гц) Установите частоту ровно 50 Гц.
Резкое/подергивающееся движение Недостаточный источник питания Используйте отдельный источник питания 5 В (например, 4 батарейки типа АА или регулятор 5 В/2 А).
Неточные углы Теоретические пределы импульсов отличаются от реальных сервоприводов. Выполните калибровку (шаг 2.4) и используйте измеренные мин/макс импульсы.
Сервопривод гудит, но не крутится Разрешение рабочего цикла слишком низкое (Увеличьте разрешение ШИМ до 10 или 12 бит.
Перемещается только между 0° и 90°. Период сигнала слишком короткий или диапазон ширины импульса не соответствует. Убедитесь, что период = 20 мс и что вы отправляете импульсы между 1,0–2,0 мс.

05Практические рекомендации по надежному сервоуправлению

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, чтобы порекомендовать подходящий двигатель или редуктор для вашего продукта.

Написать письмо в Kpower
Отправить запрос
Сообщение WhatsApp
+86 0769 8399 3238
 
kpowerMap