Подключаем двигатель постоянного тока. Микросхема L298P

Серия-статей: Программирование Arduino с нуля #7

Серия-статей: Arduino, использование двигателей постоянного тока #1

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

В принципе обычные электрические двигатели спокойно используются и без контроллеров – достаточно подключить обмоку к сети постоянного тока, и двигатель будет работать. Т.е. можно включить в цепь питания двигателя обычное реле и управлять им с контроллера. Но нас такой вариант не устраивает, ведь мы хотим не просто включать/выкляючать двигатель, а регулировать скорость и направление вращения.

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

Одним из самых распространненых вариантов драйвера двигателя являются L293 или L298 (отличаются наличием или отсутствием встроенных защитных диодов). Для наших целей вполне достаточно L298, тем более что мы будем использовать не голую микросхему, а уже распаянную на плату со всеми нужными компонентами. Выпускается множество вариантов такой платы, наиболее удобным можно считать исплнение в вмде «мотор-шилда» для платы Arduino UNO:

Мотор шилд на базе L298P совместимый с Arduino UNO

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

Для управления одним двигателем необходимо не меньше двух уифровых выходов (один для задания направления, второй – скорости) Причем отвечающий за скорость должен поддерживать ШИМ (помечены на контроллере как PWM ~) Как видим на самом мотор-шилде помечены как используемые выводы 4, 5, 6, 7 (в зависимости от модели мотор-шилда номера используемых им выходвов могут отличаться)

Теперь займемся организацией питания. Motor-shield способен получать питание от контроллера или питаться независимо. Для переключения служит специальный джампер на шилде. Если он замкнут, то цепи питания контроллера и motor-shielda замкнуты. Т.е. мы можем подводить питание либо к выходам «Vin», и «Gnd», контроллера, либо к клеммнику питания на шилде. Такой вариант можно использовать при следующих условиях:

Напряжение питания motor-shielda находится в рекомендуемых для питания контроллера пределах 7-12 В

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

Если же снять джампер, то цепи питания контроллера и шилда будут независимыми. Т.е к клеммнику питания motor-shielda нужно будет подключить питание для двигателей. А контроллер запитать от другого источника (или напряжением 7-12 В через «Vin», или 5 В через вывод «»В таком случае мы можем использовать более мощные двигатели (вплоть до 18В – максимальное напряжение для Motor shielda, более мощные допускают даже 36 В). При этом мы не будем бояться за контроллер, работа которого не бедет зависеть от силовой части привода. Но за это придется расплачиваьться некоторым усложнением цепей питания. К тому-же у мобильного робота не всегда есть смысл делать две независимых цепи питания, намного проще запитать все от одного аккумулятора)

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

У двигателя постоянного тока всего два выхода, подключаем их к клеммнику на motor-shield-е (две верхние или две нижние клеммы, центральная соединена с «землей»)

Подключение двигателя постоянного тока к Arduino через драйвер L298P

Теперь приступим непосредственно к управлением двигателем. Для пуска двигателя достаточно подать на выход “E1” (согласно схеме подключен к 5 цифровому выходу) напряжение 5В. В зависимости от того, какой уровень сигнала будет на выходе «I1» ,будет меняться направление вращения.

byte E1=5; // Управление скоростью двигателя – подключение к 5 выходу

byte I1=4; // Управление направлением вращения – подключение к 4 выходу

void setup()

{

pinMode (E1, OUTPUT); // Задаем работу соответствующих пинов в качестве выходов

pinMode (I1, OUTPUT);

digitalWrite (E1, HIGH); // На вывод ENABLE подан высокий логический уровень, двигатель вращается на максимальной скорости

digitalWrite (I1, HIGH); // На вывод I1 подан высокий логический уровень, мотор вращается в одну сторону

}

void loop()

{

}

Для изменения направления вращения – изменим сигнал на выходе I1. Для остановки двигателя – подадим низкое напряжение на выход E1

byte E1=5; // Управление скоростью двигателя – подключение к 5 выходу

byte I1=4; // Управление направлением вращения – подключение к 4 выходу

void setup()

{

pinMode (E1, OUTPUT); // Задаем работу соответствующих пинов в качестве выходов

pinMode (I1, OUTPUT);

}

void loop()

{

digitalWrite (E1, HIGH); // На вывод ENABLE подан высокий логический уровень, двигатель вращается на максимальной скорости

digitalWrite (I1, HIGH); // На вывод I1 подан высокий логический уровень, мотор вращается в одну сторону

delay(2000); // Ждем 2 секунды

digitalWrite (I1, LOW); // На вывод I1 подан низкий логический уровень, мотор вращается в обратную сторону

delay(2000); // Ждем еще 2 секунды

digitalWrite (E1, LOW); // На вывод E1 подан низкий логический уровень, мотор останавливается

delay(2000); // Ждем еще 2 секунды

}

Результат – вращение двигателя в одну сторону в течении 2 секунд, смена направление еще на две секунды и остановка на то-же время. Затем цикл повторяется.

Теперь попробуем регулировать скорость. Контроллер Arduino не может подавать на цифровые выходы произвольное напряжение (на то они и цифровые, что у них только два состояния – HIGH (5 Вольт ) и LOW (0 Вольт)). Зато эти состояния он может переключать очень быстро (500 раз в секунду, а точнее, с частотой около 490 Гц).

Значение напряжение, регулируемого с помощью широтно-импульсной модуляции, определяется соотношением времени, гогда на выход подается логическая единица (5 В) к времени, когда на выход подан логический ноль (0 В). Это значение называется «скважностью»:
50% времени подается высокий сигнал – соответствует итоговому усредненному напряжению 2,5 В Состояние цифрового выхода, который управляется ШИМ со скважностью 50%


25% времени подается высокий сигнал – соответствует итоговому усредненному напряжению 1,25 В Состояние цифрового выхода, который управляется ШИМ со скважностью 25%


10% времени подается высокий сигнал – соответствует итоговому усредненному напряжению 0,5 В Состояние цифрового выхода, который управляется ШИМ со скважностью 10%}}%


Высокий сигнал подается от 10% до 50% времени – соответствует плавному увеличению напряжения с 0,5 до 2,5 вольт Состояние цифрового выхода, который управляется ШИМ со скважностью от 10 до 25%

Показанные графики дают только общее представление, в реальности частота переключения настолько велика, что мы просто не сможем увидеть мерцания светодиода или рывков двигателя, управляемых ШИМ

Для того, чтобы управлять выводом с помощью ШИМ, он во первых должен это поддерживать (для UNO все выводы, поддерживающие ШИМ, помечены «~»). Для вывода нужного значения используем команду analogWrite(значение)Мы можем подавать команду выдавть один из 255 уровней (т.е. 1 уровеь – 0,019 вольта) Т.е команда analogWrite(5, 255) будет выдавть на пятый пин 5 вольт (то-же самое, что и digitalWrite(5, HIGH)), analogWrite(5, 128) - дает нам 2.5 вольта, analogWrite(5, 25) - 0.5 вольта.

Теперь воспользуемся ШИМ для управления двигателем:

byte E1=5; // Управление скоростью двигателя – подключение к 5 выходу

byte I1=4; // Управление направлением вращения – подключение к 4 выходу

void setup()

{

pinMode (E1, OUTPUT); // Задаем работу соответствующих пинов в качестве выходов

pinMode (I1, OUTPUT);

}

void loop()

{

analogWrite (E1, 255); // На выводе ENABLE 5 вольт, двигатель вращается на максимальной скорости

digitalWrite (I1, HIGH); // На вывод I1 подан высокий логический уровень, мотор вращается в одну сторону

delay(2000); // Ждем 2 секунды

analogWrite (E1, 128); // На выводе ENABLE 2,5 вольт, двигатель вращается на половине максимальной скорости

delay(2000); // Ждем еще 2 секунды

analogWrite (E1, 25); // На выводе ENABLE 0,5 вольт, двигатель вращается на одной десятой от максимальной скорости

delay(2000); // Ждем еще 2 секунды

}

Теперь двигатель меняет свою скорость в определенные моменты времени. Обратите внимание, что при попытке задать очень низкую скорость вращения двигатель может гудеть, но не двигаться с места. Это связано с тем, что подаваемого напряжения просто недостаточно для того, чтобы побороть силы трения и инерцию ротора. Поэтому мы не можем управлять двигателем на малых (порядка 10-20% от максимума) скоростях.

Еще:

Программирование контроллеров – с чего начать (Программирование Arduino с нуля #1)
Плавный пуск двигателя постоянного тока с использованием таймеров (Arduino, использование двигателей постоянного тока #2)
Подключение периферии, платы расширения (Программирование Arduino с нуля #2)
Создание класса для работы с двигателем постоянного тока (Arduino, использование двигателей постоянного тока #3)
Организация питания для Arduino (Программирование Arduino с нуля #3)
Создание собственной библиотеки управления двигателем постоянного тока (Arduino, использование двигателей постоянного тока #4)
Подключаем сервопривод к Arduino (Программирование Arduino с нуля #4)
Создаем класс для управления сервоприводом (Программирование Arduino с нуля #6)
Подключение шагового двигателя. Контроллер L298 (Программирование Arduino с нуля #8)