Перейти к основному содержимому

Драйвер моторов

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

Arduino управляет двумя моторами через отдельный драйвер

Коротко

Arduino сообщает драйверу направление и требуемую мощность. Энергию мотор получает не из сигнального вывода, а от отдельной силовой линии. Земли контроллера и драйвера соединяют, чтобы у логических уровней была общая точка отсчёта.

Зачем это нужно

Коллекторный мотор при запуске может потреблять во много раз больше тока, чем в свободном вращении. При резкой остановке и переключении обмотка также создаёт электрические помехи. Если подключить двигатель прямо к выводу Arduino, напряжение на пине просядет, плата может перезапуститься, а выход микроконтроллера — повредиться.

Драйвер решает сразу несколько задач:

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

Без этого узла невозможно надёжно управлять колёсами мобильного робота, конвейером, насосом или редукторным приводом.

Главная идея

У системы есть два потока, которые встречаются в драйвере:

Arduino -> логическая команда -> драйвер
аккумулятор -> силовая энергия -> драйвер -> мотор

Команда почти не несёт мощности. Она только сообщает, какие силовые ключи открыть. Общий GND связывает уровни Arduino и входов драйвера. Положительный провод источника моторов не следует соединять с выходным пином контроллера.

Командные линии, отдельное питание и силовой выход драйвера

Какие контакты встречаются у драйвера

Названия выводов различаются у разных плат, поэтому первым документом при подключении служит datasheet конкретной микросхемы или руководство модуля. Типовая организация выглядит так:

ГруппаЧастые обозначенияЧто подключают
Логическое питаниеVCC, VLOGICпитание логической части, если оно требуется отдельно
Силовое питаниеVM, VS, VINисточник, подходящий мотору и драйверу
Общий проводGNDземлю Arduino, драйвера и силового источника
НаправлениеIN1, IN2, DIR, PHASEцифровые выходы Arduino
Разрешение или PWMEN, ENABLE, PWMPWM-совместимый выход либо постоянный логический уровень
Выход к моторуOUT1, OUT2, M+, M-два вывода одного коллекторного мотора
ДиагностикаFAULT, ISEN, CURRENTсообщение об ошибке или измерение тока, если предусмотрено
Не все интерфейсы одинаковы

Один драйвер использует два входа направления и отдельный PWM, другой — DIR и PWM, третий принимает PWM на каждом из двух входов. Таблица режимов из документации важнее привычной схемы из чужого проекта.

Выбираем драйвер и источник

Смотреть только на рабочее напряжение недостаточно. Нужны как минимум четыре проверки:

  1. Диапазон силового напряжения драйвера включает напряжение аккумулятора.
  2. Допустимый непрерывный ток канала не меньше тока мотора под реальной нагрузкой.
  3. Кратковременный ток и защита учитывают пуск и заклинивание.
  4. Логические уровни входов совместимы с выбранной платой Arduino.

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

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

Логика направления и остановки

Ниже приведена распространённая логика H-моста с двумя входами. Это учебная модель, а не универсальная таблица для любой микросхемы.

IN1IN2Состояние мотора
LOWHIGHвращение в одну сторону
HIGHLOWвращение в другую сторону
LOWLOWобычно выбег или отключение
HIGHHIGHчасто торможение, но режим зависит от драйвера

При смене направления сначала уменьшают PWM до нуля, дают механике замедлиться, затем меняют направление и снова повышают мощность. Мгновенная команда «полный вперёд — полный назад» создаёт большой ток и ударную нагрузку на редуктор.

Схема подключения одного мотора

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

  1. При отключённом питании соедините мотор только с парой выходов драйвера.
  2. Подайте силовое питание на VM и силовой GND драйвера.
  3. Соедините GND Arduino с тем же общим проводом.
  4. Подключите входы направления к цифровым пинам.
  5. Подключите PWM или EN к пину, который поддерживает analogWrite() на вашей плате.
  6. Проверьте отсутствие короткого замыкания и только затем включите источник с ограничением тока, если оно доступно.

На некоторых шилдах соединение земли и логическое питание уже выполнены дорожками платы. Это нужно подтвердить по схеме именно этого шилда, а не дублировать соединения наугад.

Программа управления скоростью и направлением

Пример ниже рассчитан на распространённый интерфейс IN1 + IN2 + PWM. Диапазон 0…255 соответствует обычному 8-битному вызову analogWrite() на классических платах AVR; на других Arduino разрешение и поддерживаемые пины могут отличаться.

const uint8_t in1Pin = 7;
const uint8_t in2Pin = 8;
const uint8_t pwmPin = 5;

void setMotor(int command) {
command = constrain(command, -255, 255);

if (command == 0) {
analogWrite(pwmPin, 0);
digitalWrite(in1Pin, LOW);
digitalWrite(in2Pin, LOW);
return;
}

const bool forward = command > 0;
digitalWrite(in1Pin, forward ? HIGH : LOW);
digitalWrite(in2Pin, forward ? LOW : HIGH);
analogWrite(pwmPin, abs(command));
}

void setup() {
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(pwmPin, OUTPUT);
setMotor(0);
}

void loop() {
setMotor(150);
delay(1500);
setMotor(0);
delay(500);

setMotor(-150);
delay(1500);
setMotor(0);
delay(1000);
}

Знак command выбирает направление, а модуль числа задаёт заполнение PWM. Функция начинает с безопасного состояния в setup(). Для движущегося робота задержки обычно заменяют таймером на millis(), чтобы одновременно читать датчики и принимать команды.

PWM меняет не напряжение источника

PWM быстро включает и выключает силовые ключи. При заполнении 40% мотор часть периода получает питание, а часть — нет. Инерция ротора и электрические свойства обмотки сглаживают импульсы, поэтому меняется средняя передаваемая мощность.

Команда PWMНаблюдаемое поведениеВозможное ограничение
малаямотор может гудеть и не тронутьсямомента не хватает для старта
средняяустойчивое вращение под умеренной нагрузкойскорость зависит от питания и механики
большаяблизко к максимальной доступной мощностирастут ток, нагрев и расход энергии
нольвыбег либо торможение по логике входовточный режим задаёт драйвер

У двух одинаковых на вид моторов стартовые значения могут различаться из-за трения и нагрузки. Поэтому скоростью колёс нельзя точно управлять только одинаковыми числами PWM: для ровного движения применяют энкодеры и обратную связь.

Пример: движение робота с двумя колёсами

Для дифференциального робота нужен отдельный канал драйвера на каждый мотор. Движение складывается из двух команд:

Левое колесоПравое колесоДействие робота
вперёдвперёдедет прямо
стопвперёдповорачивает влево по дуге
назадвперёдразворачивается на месте
одинаковый PWM, разная фактическая скоростьодинаковая команда, разная механикауходит в сторону

Функцию setMotor() удобно обобщить для двух каналов, но сначала проверяют каждый мотор отдельно. Если команда «вперёд» вращает одно колесо назад, можно поменять местами два моторных провода при выключенном питании либо скорректировать логическое направление в программе. Не меняйте проводку во включённой силовой цепи.

Безопасный первый запуск и диагностика

Перед установкой колёс поднимите робота над поверхностью. Задайте небольшой PWM и краткое время работы. Если мотор не вращается, не увеличивайте команду сразу до максимума.

Проверяйте цепь от причины к следствию:

СимптомЧто проверить первым
мотор неподвиженENABLE, силовое питание, общий GND, таблицу входов
Arduino перезапускаетсяпросадку питания, общий путь тока, развязку силовой части
драйвер быстро нагреваетсязаклинивание, ток мотора, короткое замыкание, охлаждение
направление не меняетсяуровни IN1/IN2, распиновку и режим входов
мотор вращается рывкамиконтакт разъёмов, слишком малый PWM, ограничение тока источника

Если у лабораторного источника есть ограничение тока, начните с разумного безопасного значения для стенда. Окончательный предел выбирают по документации мотора, драйвера, проводов и источника.

Что запомнить про управление мотором

  • Arduino формирует команды, а силовой ток коммутирует драйвер.
  • Мотор подключают к выходам драйвера и отдельному источнику, а не к GPIO.
  • Общий GND нужен для корректного распознавания логических уровней.
  • Направление задают логическими входами, скорость — PWM, но точные режимы зависят от микросхемы.
  • Пуск, заклинивание и резкий реверс дают самые тяжёлые режимы.
  • Первый тест проводят с вывешенными колёсами и контролем тока и нагрева.

Практика

Задание 1. Карта соединений

Для имеющегося драйвера найдите datasheet и составьте таблицу: контакт модуля, его назначение, контакт Arduino или источника. Отдельно отметьте логическое питание, силовое питание и общий провод. Не подключайте питание до проверки наставником.

Задание 2. Три режима

Дополните скетч так, чтобы мотор последовательно выполнял мягкий разгон, свободный выбег и вращение назад. Время и PWM выберите сами, не превышая ограничения стенда.

Задание 3. Два колеса

Спроектируйте функции drive(left, right) и stopMotors() для двухканального драйвера. Запишите ожидаемое действие робота для четырёх пар команд, но не запускайте колёса на столе.

Задание 4. Поиск причины

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

Проверьте себя

  1. Почему мотор нельзя питать непосредственно от цифрового выхода Arduino?
  2. Чем логическая команда отличается от силового тока?
  3. Зачем соединять земли контроллера и драйвера?
  4. Какие параметры мотора нужны при выборе драйвера?
  5. Что делает PWM и почему он не равен снижению напряжения источника?
  6. Почему таблицу режимов H-моста нужно сверять с datasheet?
  7. Чем опасен мгновенный реверс на большом PWM?
  8. С чего начать диагностику, если Arduino перезапускается при старте мотора?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Драйвер мотора — силовой электронный узел, который переключает ток двигателя по логическим командам.
  • H-мост — схема ключей, способная менять направление тока через нагрузку.
  • PWM (ШИМ) — управление средней мощностью изменением доли времени включённого состояния.
  • Коэффициент заполнения — отношение времени включения импульса к полному периоду.
  • Силовое питание — источник энергии для мотора и силовых ключей.
  • Логический вход — контакт драйвера, принимающий командный уровень от контроллера.
  • Ток блокировки — ток мотора при неподвижном роторе и приложенном напряжении.
  • Выбег — остановка без активного электрического торможения.
  • Общий провод — общая точка отсчёта напряжений, обычно обозначаемая GND.

Связанные темы

Источники