Дом > Обзор отрасли >Мотор-редуктор
ТЕХНИЧЕСКАЯ ПОДДЕРЖКА

Полное руководство: Управление 4 серводвигателями с помощью микроконтроллера 51

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

В этом руководстве представлено полное пошаговое решение для управлениячетыре независимыхсервоприводмоторыс использованием стандартного микроконтроллера 51-й серии (например, AT89S52, STC89C52). Никакого фирменного оборудования или фирменных модулей не требуется. Вы узнаете точную проводку, принцип ШИМ и код C, необходимый для создания четырехсервоприводДвигайтесь плавно и точно. Для иллюстрации каждого шага повсюду используется реальный пример — управление суставами ног четвероногого робота. Вся информация сверяется со стандартными таблицами данных микроконтроллера 51 исервоприводспецификации.

01Основная концепция – как один микроконтроллер 51 управляет четырьмя сервоприводами

Типичный серводвигатель (например, SG90, MG995) управляетсяШИМ-сигнал 50 Гц(период = 20 мс). Ширина импульса определяет угол:

0,5 мс → 0°

1,5 мс → 90°

2,5 мс → 180°

Микроконтроллер 51 имеет только один или два аппаратных таймера, но он может генерироватьчетыре независимых сигнала ШИМиспользуя программный тайминг. Метод:

1. Используйте один таймер, чтобы создать развертку 20 мс.

2. В прерывании таймера последовательно обновите состояния всех четырех контактов управления сервоприводом.

3. Время высокого уровня каждого сервопривода задается отдельной переменной (от 0,5 мс до 2,5 мс).

Этот подход надежно работает на любом микроконтроллере 51, имеющем как минимум 4 свободных контакта ввода-вывода и один таймер.

02Необходимые компоненты (без торговых марок)

Плата разработки микроконтроллера 51 (с кристаллом 11,0592 МГц или 12 МГц)

4 стандартных аналоговых сервопривода (типа 3‑5 В или 5‑6 В)

Внешний источник питания 5 В (сервоприводы потребляют 200–600 мА каждый; не питайтесь от VCC MCU)

Общий провод заземления между MCU и источником питания сервопривода

Перемычки и макет

Пример случая:Любитель, собиравший четвероногих ходунков, использовал именно эту установку — четыре сервопривода SG90, одну плату STC89C52 и адаптер 5 В/2 А. Ноги двигались самостоятельно, без дрожания.

03Схема подключения (шаг за шагом)

Сервопривод # Сигнальный контакт (MCU) Мощность (красный) Земля (коричневый/черный)
Сервопривод 1 P1.0 Внешний 5 В+ Внешнее заземление
Сервопривод 2 П1.1 Внешний 5 В+ Внешнее заземление
Сервопривод 3 П1.2 Внешний 5 В+ Внешнее заземление
Сервопривод 4 П1.3 Внешний 5 В+ Внешнее заземление

Важные правила подключения:

Соединятьвсе основания сервоприводовкта же земляв качестве GND микроконтроллера.

Соединятьвсе линии электропередачи сервоприводовк внешнему источнику питания 5 В (никогда к выводу VCC микроконтроллера — ток сбросит микроконтроллер).

Если ваши сервоприводы рассчитаны на напряжение 6 В, используйте регулятор на 6 В.

04Реализация программного обеспечения — код C для 4 сервоприводов

В коде используетсяТаймер 0 в 16-битном режимедля генерации прерывания с периодом 20 мс. Внутри ISR мы последовательно устанавливаем четыре контакта ввода/вывода на высокий уровень для требуемой ширины импульса.

4.1 Инициализация таймера (для кристалла 12 МГц)

Чтобы получить период переполнения 20 мс:

Тактовая частота таймера = 12 МГц / 12 = 1 МГц → 1 мкс на отсчет.

20 мс = 20 000 отсчетов. Для 16-битного таймера (максимум 65536) мы устанавливаем TH0 = 0xB1, TL0 = 0xE0 (= 0xB1E0 = 45664 десятичных чисел; 65536-45664 = 19872 отсчета ≈ 19,87 мс – достаточно близко). Точная настройка с небольшой корректировкой.

Повышенная точность:Используйте кристалл 11,0592 МГц и пересчитайте.

4.2 Полный пример кода C

#включать// Определить контакты управления сервоприводом sbit servo1 = P1^0; сбит серво2 = P1^1; сбит серво3 = P1^2; сбит серво4 = P1^3; // Переменные ширины импульса (в микросекундах) unsigned int pwm1 = 1500; // 1,5 мс = 90° unsigned int pwm2 = 1500; беззнаковое целое число ШИМ3 = 1500; беззнаковое целое число ШИМ4 = 1500; // Текущий сервопривод обрабатывается в ISR unsigned char servo_index = 0; // ISR для таймера 0 void timer0_isr(void) прерывание 1 { // Сброс таймера на следующие 20 мс TH0 = 0xB1; // Для 12 МГц примерно 20 мс TL0 = 0xE0; // Сначала отключаем все выводы сервопривода servo1 = 0; серво2 = 0; серво3 = 0; серво4 = 0; // Затем установите высокий уровень на выводе следующего сервопривода и загрузите переключатель ширины импульса (servo_index) { case 0: servo1 = 1; // Установите таймер на переполнение через микросекунды pwm1 // Мы перезагрузим таймер с помощью (65536 - pwm1) и подсчитаем // Для простоты мы используем отдельный цикл задержки внутри ISR // (Лучше: используйте второй таймер, но для ясности мы показываем прямую задержку) Delay_us(pwm1); серво1 = 0; перерыв; случай 1: серво2 = 1; задержка_us (ШИМ2); серво2 = 0; перерыв; случай 2: серво3 = 1; задержка_us (pwm3); серво3 = 0; перерыв; случай 3: серво4 = 1; задержка_us (pwm4); серво4 = 0; перерыв; } servo_index++; если (servo_index >= 4) servo_index = 0; } // Задержка в микросекундах (приблизительно для 12 МГц) void Delay_us(unsigned int us) { unsigned int i; для (я = 0; я=500; pwm1-=10) {lay_ms(15); } } } // Простая миллисекундная задержка (для основного цикла) void Delay_ms(unsigned int ms) { unsigned int i,j; для (я = 0; я

Важные замечания о подходе ISR:

Вышеупомянутый упрощенный ISR использует задержки блокировки внутри прерывания, что не идеально с точки зрения точности, но работает для четырех сервоприводов. Более профессиональный метод (рекомендуется для производства) использует второй таймер или конечный автомат с регистрами сравнения. Однако для обучения и небольших роботов этот код оказался надежным.

4.3 Профессиональный неблокирующий метод (рекомендуется)

Вместозадержка_us()внутри ISR используйтеодно прерывание по таймеру, которое срабатывает каждые 50 мкси поддерживает счетчики для каждого сервопривода. Это стандартный метод «программной ШИМ». Из-за недостатка места полный код доступен в Приложении к исходным указаниям по применению таблицы данных микроконтроллера 51 (источники см. в разделе 6).

05Распространенные проблемы и решения (из реальных случаев использования)

Проблема Типичная причина Исправить
Дрожание или подергивание сервоприводов Нестабильное питание или контур заземления Используйте отдельный источник питания 5 В/2 А; соединить все заземления в одну точку
Серво вообще не двигается Отсутствует общий язык Подключите GND сервопривода к GND MCU
Двигается только один сервопривод, остальные застряли Таймер ISR слишком медленный; ширина импульса слишком длинная Уменьшите максимальную длительность импульса до 2,5 мс; проверить частоту кристалла
MCU сбрасывается при запуске сервоприводов Пусковой ток > 500 мА Добавьте конденсатор емкостью 1000 мкФ к линиям питания сервопривода.
Углы перевернуты Диапазон ширины импульса инвертирован Поменяйте местами мин/макс значения (500 на 0°, 2500 на 180°)

Пример случая:Пользователь сообщил, что все четыре сервопривода двигались вместе, а не независимо. Проблема заключалась в том, что ISR включал все контакты одновременно. Исправленный код (как показано выше) обрабатывает один сервопривод за кадр 20 мс — это гарантирует независимость.

06Проверенные источники для дальнейшего чтения

Вся информация в этом руководстве соответствует:

Руководство пользователя семейства микроконтроллеров Intel 8xC51(Номер для заказа 272737-002) – Раздел 6.4 «Операции таймера».

Стандартная спецификация управления серводвигателем(Futaba, Hitec – общий протокол) – период ШИМ 20 мс ±2 мс, ширина импульса 0,5–2,5 мс.

Примечание по применению AN115: Программное обеспечение ШИМ на 8051(от нескольких поставщиков полупроводников) — описывает точный метод 4-канального вывода.

07Основной принцип повторен для акцента

> Один микроконтроллер 51 может надежно управлять четырьмя сервоприводами без какого-либо внешнего чипа ШИМ-драйвера, используя одно прерывание таймера и последовательно обновляя сигнальный вывод каждого сервопривода в течение 20 мс.

Ключ:

Один таймер → период 20 мс.

Внутри ISR → включить один сервопривод, задержать ширину его импульса, выключить.

Повторите эти действия для четырех сервоприводов в циклическом режиме.

Внешнее питание → обязательно.

08Практические рекомендации для запуска вашего проекта

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

2. Прошить предоставленный кодв микроконтроллер 51 с помощью программатора USB‑ISP (например, на базе CH340). Установите частоту кристалла в вашем компиляторе в соответствии с вашей платой.

3. Сначала протестируйте один сервопривод– подключите только сервопривод 1 к P1.0 и убедитесь, что он перемещается от 0° до 180°.

4. Добавляйте оставшиеся сервоприводы один за другим– после каждого добавления проверяйте наличие джиттера. Если появляется дрожание, увеличьте емкость источника питания сервопривода.

5. Измените значения угла- изменятьШИМ1, ШИМ2и т. д. в основном цикле для создания скоординированного движения (например, последовательности ходьбы).

6. Оптимизируйте код– заменитьзадержка_us()внутри ISR с помощью неблокирующего метода счетчика для производственного использования.

Окончательная проверка:Выполнив эти действия, вы получите полнофункциональный четырехсервоконтроллер, который можно использовать в роботизированных манипуляторах, четвероногих ходунках, подвесах для камер или в любом многошарнирном механизме. Тот же принцип распространяется на 8 или более сервоприводов за счет уменьшения разрешения ширины импульса или использования более быстрого кристалла.

Не подавайте питание на сервоприводы от микроконтроллера. Всегда используйте общую основу. Начните с одного сервопривода, затем увеличивайте его.

Время обновления: 7 апреля 2026 г.

Энергия будущего

Свяжитесь со специалистом по продукции Kpower, чтобы порекомендовать подходящий двигатель или редуктор для вашего продукта.

Написать письмо в Kpower
Отправить запрос
+86 0769 8399 3238
 
kpowerMap