Подключение шагового двигателя. Контроллер L298

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

Серия-статей: Ардуино, использование шаговых двигателей #1

Мы подключили к нашему контроллеру обычные двигетели постоянного тока. С их помощью можно, например двигать мобильную платформу на колесном или гусеничном ходу или совершать простейшие действия (типа открытия двери или поднятия штор). Вот только регулировать вращение этих двигателей можно только подавая на них определенное напряжение. И если мы, например, подадим 100% мощности на одну секунду, мы не можем быть уверены, что за это время двигатель повернет вал, например, на 100 оборотов. Ведь нагрузка может меняться, а соотвтетственно и скорость вращения при той-же заданной мощности. В случае визуального управления роботом это не проблема – увидел, что робот проехал нужную дистанцию – подал команду на остановку. Но мы веть хоти создавать именно автоматические устройства, которые не будут ребовать посоянного внимания. Тут есть несколько вариантов:

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

Если же нам нужно обеспечить более точное управление двигателем, чтобы он делал точное количество оборотов или даже долей оборота – тогда нам нужно применять шаговые двигатели. С их помощью можно совершать очень точные движения, ведь вращение вала контролируется с точностью до нескольких градусов. Благодаря этому можно использвоать такие двигатели для точныз перемещений – в станках с ЧПУ, 3D принтерах и там, где возможностей сервоприводов недостаточно.

В отличие от сервопривода, в котором используется обычный двигатель постоянного тока, пусть с дополнительным датчиком, шаговый двигатель изначально построен по другой схеме. У него не одна обмотка, а несколько независимых обмоток. Причем обмотки расположены параллельно ротору, но под углом друг к другу. Подача тока на одну из обмоток заставляет ротор поворачиваться на небольщой угол и останвоиться. Если теперь выключить ток на первой обмотке, и подать на следующую – ротор повренется еще на долю оборота. А чередование аодачи напряжения между обмотками заставит ротор вращаться, причем в зависимости от частоты это будет выглядеть или как скачкообразный поворот вала двигателя на определенный угол, или как непрерывное вращение (в случае большой частоты переключения обмоток). Причем здесь мы контроллируем не только мощность но и точную частоту вращения. И можем задать точный угол поворота двигателя и отановить точно на определенном угле поворота.

В отличие от традиционного двигателя постоянного тока, шаговый двигатель обычно имеет от четырех до шести проводов для подключения. Если проводов четыре – перед нами биполярынй двигатель. Два провода подключены к одной обмотке, два – к другой. Схема подключения биполярного шагового двигателя к контроллеру на базе L298

Если же проводов шесть – это униполярыный двигатель. По два провода подключены к концам каждой обмотки и по одному – в ее середине. Эти провода подключается к заземлению. Схема подключения униполярного шагового двигателя к контроллеру на базе L298

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

Схема подключения униполярного шагового двигателя к контроллеру на базе L298 как биполярного

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

Конечно мы можем вручную написать код, который с определенным интервалом будет чередовать подачу тока на обмотки и таким образом обеспечить управление нашим двигателем. Но этот код давно уже написан и входит в стандартную сборку Arduino IDE, просто подключим библиотеку Stepper командой #include . Теперь создадим объект типа stepper и укажем, к каким именно пинам подключены наши обмотки. Для этого нам нужно указать еще одну характеристику шагового двигателя – количество шагов для одного оборота вала. Стандартыне двигатели, которые проще всего приобрести, обычно имеют точность позиционирования 1,8° или 3.6°. Этот угол соответствует значению одного шага, соответственно для одного оборота нужно будет совершить, соответственно, 200 и 100 шагов. Пусть наш двигетель обладет точностью 200 шагов на оборот:

const int StepsForRotation=200; // 200 шагов на оборот - 1.8 градуса на один шаг

Stepper stepmotor (StepsForRotation, 4, 7); // первая обмотка управляется выходом 4, вторая - 7

Поскольку при управлении шаговым двигателем используется только наличие или отсутствие тока на обмотках, то нам нет необходимости в подключении выходов с ШИМ регулированием. Достаточно использовать только пины I1 и I2. Логическая единица на выводе будет соотвтетствовать подаче номинального напряжения на один конец обмотки и нулевого – на другой. Логический ноль - номинальное напряжение на втором конец обмотки и нулевого на первом. Таким образом каждая из двух обмоток управляется одним цифровым выходом.

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

const int StepsForRotation=200;

Stepper stepmotor (StepsForRotation, 4, 5, 6, 7);

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

Схема подключения униполярного шагового двигателя к контроллеру на базе L298 с двумя пинами для управления одной обмоткой

И в том, и в другом случае на каждую обмотку будет подпапться ток на время, достаточное для совершения валом одного шага. Затем ток с первой обмотки убирается, а подается на вторую (для следующего шага), или ток подается на обе обмотки (для остановки вала в текущем положении) или же тока с обеих обмоток будет снят (для свободного вращения вала) Частота таких переключений будет регулировать скорость вращения. Для изменения частоты служит метод Stepper.setSpeed(int speed);который устанавливает для нашего шагового двигателя определенную скорость вращения (в оборотах в минуту). При этом при вызове этого метода двигатель не начнет вращаться с указанной скоростью – мы только устанавливаем скорость. Для движения необходимо использовать метод Stepper.step(int steps);, который подает команду двигателю сделать steps шагов со скоростью, установленной командой setSpeed. Пример использования для двигателя, подключенного к 4 и 7 пинам:

/* Управление шаговым двигателем, подключенного к контроллеру на базе микросхемы L298*/

#include // Подключаем библиотеку управления шаговыми двигателями

const int StepsForRotation=200; // 200 шагов на оборот - 1.8 градуса на один шаг

Stepper stepmotor (StepsForRotation, 4, 7); // Инициализируем шаговый двигатель 200 шагов на оборот, управление обмотками через 4 и 7 цифровые выходы

void setup()

{

stepmotor.setSpeed(60); // Устанавливаем скорость вращения 60 оборотов в минуту (1 оборот в секунду)

}

void loop()

{

stepmotor.step(100); // Посывлаем двигателю команду сделать 100 шагов (половину оборота)

delay(1000); // Ждем одну секунду

stepmotor.step(-100); // Посывлаем двигателю команду сделать 100 шагов (половину оборота) в обратном направлении

delay(-1000);

}

После загрузки на контрорллер, подключенный к нему двигатель сделает пол оборота со скоростью 60 об/мин (1 об/сек, т.е. на пол оборота ему понадобится 0.5 секунды), остановится на одну секунду, затем с той-же скоростью провернется на пол оборота в обратном направлении.

Нужно уситывать, что мы здесь не можем напрямую влиять на скорость вращения – только на частоту шагов. И если для средних и больших скоростей вращения это не так важно, то при малых значениях скорости будет хорошо заметно прерывистое вращение вала. Например, при установленной скорости 1 оборот в минуту вал двигателя не будет медленно вращаться со скоростью 6 градусов в секунду. Он максимально быстро повернется на 1,8 градуса, затем остановится на треть секунды мс, затем повернется еще на 1,8 градуса, и т.д. Для средних скоростей такое прерывистое значение будет не так заметно, зато хорошо слышны частые щелчки (с частотой переключения обмоток). Поэтому в тех случаях, где нужно медленное и плавное движение, использовать шаговые двигатели напрямую не получится – нужно будет добавлять понижающий редуктор или использовать традиционные двигатели постоянного тока.

Еще:

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