Шаговые двигатели

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

Шаговый двигатель (ШД) является бесколлекторным двигателем постоянного тока. Как и другие бесколлекторные двигатели, ШД высоконадежен и при надлежащей эксплуатации имеет длительный срок службы. ШД нашли широкое применение в области, где требуется высокая точность перемещений или скорости. Наглядными примерами устройств с ШД могут служить принтеры, факсы и копировальные машины, а также более сложные устройства: станки с ЧПУ (числовым программным управлением), фрезерные, гравировальные машины и т. д.

Достоинствами шаговых двигателей по сравнению с простыми являются:

 угол поворота ротора ШД зависит от числа поданных на двигатель пусковых импульсов;

 максимальный момент на валу ШД развивается в режиме останова (в случае, если обмотки двигателя запитаны);

 высокая точность позиционирования и повторяемости — качественные ШД имеют точность не хуже 2,5 % от величины шага, при этом данная ошибка не накапливается при последующих шагах;

 ШД может быстро стартовать, останавливаться и выполнять реверс;

 высокая надежность двигателя обусловлена отсутствием щеток, при этом срок службы двигателя ограничивается только лишь сроком службы подшипников;

 четкая взаимосвязь угла поворота ротора от количества входных импульсов (в штатных режимах работы) позволяет выполнять позиционирование без применения обратной связи;

 ШД обеспечивает получение сверхнизких скоростей вращения вала для нагрузки, подведенной непосредственно к валу двигателя, без использования редуктора;

 работают ШД в широком диапазоне скоростей, поскольку скорость напрямую зависит от количества входных импульсов.

Недостатки шаговых двигателей:

 ШД обладает явлением резонанса;

 возможен вариант выпадения двигателя из синхронизации с последующей потерей информации о положении при работе цепи обратной связи;

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

 сложность управления при работе на высоких скоростях (на самом деле эффективная работа шагового двигателя на высоких скоростях возможна);

 низкая удельная мощность шагового привода;

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

 Управление шаговым двигателем

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

 

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

 

На блок управления ШД (драйвер) подаются сигналы "сделать шаг" и "задать направление". Сигналы представляют собой импульсы 5 В. Такие импульсы можно получить от микроконтроллера Arduino. Для шагового двигателя необходимо отдельное питание — выводы шагового двигателя напрямую к выводам Arduino подключать нельзя. Подключение ШД осуществляется через Motor Shild либо с помощью микросхемы драйвера двигателей — например, L293. Схема подключения представлена на рисунке.

Arduino-библиотека Stepper

Для управления шаговым двигателем в Arduino имеется стандартная библиотека

Набор функций у нее следующий:

 Stepper();

 setSpeed();

 step().

Функция Stepper()

Функция Stepper() создает новый объект класса Stepper, привязанный к одному шаговому двигателю, подключенному к контроллеру Arduino. Конструктор следует использовать при объявлении переменной класса Stepper, обычно в самом начале — вне setup() и loop(). Количество параметров зависит от способа подключения — 2 или 4 выхода используются для управления двигателем.

Синтаксис:

Stepper(steps, pin1, pin2) Stepper(steps, pin1, pin2, pin3, pin4)

Параметры:

 steps — количество шагов в полном обороте используемого двигателя. Если в документации к двигателю указан угол одного шага, то следует разделить 360° на этот угол, что даст нам искомое количество шагов;

 pin1, pin2, pin3, pin4 — выходы Arduino для подключения шагового двигателя. Возвращаемое значение: новый экземпляр объекта класса Stepper.

Функция setSpeed(rpm)

Функция setSpeed(rpm) устанавливает скорость вращения в оборотах в минуту. Эта функция не заставляет двигатель вращаться, а лишь устанавливает скорость вращения, которая будет использована при вызове функции step().

Синтаксис:

Stepper.setSpeed(rpm)

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

Возвращаемого значения нет.

Функция step(steps)

Функция step(steps) вращает шаговый двигатель на определенное количество шагов на скорости, заданной функцией setSpeed(). Эта функция блокирующая, т. е. она ожидает окончания вращения двигателя, прежде чем передать управление в следующую строку кода. Во избежание длительной блокировки выполнения кода скетча, управление необходимо организовывать так, чтобы скорость была высокая, а за один вызов step() делалось всего несколько шагов.

Синтаксис:

Stepper.step(steps)

Параметр: steps — количество шагов:

• положительное число — вызывает вращение в одну сторону;

• отрицательное — в противоположную. Возвращаемого значения нет.

Пример использования библиотеки Stepper

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

 

Sketch code

#include <Stepper.h>

const int stepsPerRevolution=200; // количество шагов в полном обороте двигателя

Stepper myStepper(stepsPerRevolution,8,9,10,11);

int minangle=15; // угол поворота на 1 нажатие (шаг камеры) struct KEYS // структура для хранения статусов клавиш

{

int button; // нажатая кнопка

long millisbutton[7]; // millis для button

};

 

void setup() {;}

void loop() { int valbutton;

// опрос клавиатуры valbutton=analogRead(A0); if(valbutton<1000)

{buttonClick2(buttonClick1(valbutton));}

}

// обработка нажатия кнопки int buttonClick1(int val)

{

if(val>650) {KEYS1.button=1;return 1;}

if(val>600) {KEYS1.button=2;return 2;}

if(val>530) {KEYS1.button=3;return 3;}

if(val>450) {KEYS1.button=4;return 4;}

if(val>300) {KEYS1.button=5;return 5;}

if(val>200) {KEYS1.button=6;return 6;}

return 0;

}

void buttonClick2(int val)

{

if(millis()-KEYS1.millisbutton[val]<100) // проверка на дребезг return;

KEYS1.millisbutton[val]=millis(); KEYS1.button=val;

switch(val) { case 1: // left

myStepper.step(stepsPerRevolution*minangle/360*(-1)); break;

case 2: // up break;

case 3: // down break;

case 4: // right myStepper.step(stepsPerRevolution*minangle/360); break;

case 5: // white break;

case 6: // red

// код на нажатие кнопки камеры break;

default: break;

}

}

 


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

Arduino-библиотека AccelStepper

Стандартной библиотеки Stepper вполне достаточно для простого применения с одним двигателем. Библиотека AccelStepper значительно улучшает стандартную библиотеку Stepper, позволяя подключать несколько шаговых двигателей с управляемым ускорением и замедлением. Можно создать несколько объектов AccelStepper, давая уникальное имя каждому двигателю. Библиотеку можно скачать по адресу http://www.open.com.au/mikem/arduino/AccelStepper.