КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Сигналы управления драйвера ШД: PUL/DIR, STEP/DIR, CW/CCW. Управление шаговыми драйверами DM860H, DM556, TB6600.... с Arduino.

Общие сведения:

Шаговый двигатель это бесколлекторный двигатель, ротор которого вращается не плавно, а шагами (дискретно). Один оборот ротора (360°) состоит из определённого количества шагов. Количество полных шагов в одном обороте указывается в технической документации двигателя.

Например, ротор шагового двигателя 17HS1352-P4130, за один полный шаг, поворачивается на 1,8°. Значит для поворота ротора на 360° двигатель должен совершить 200 полных шагов.

Для совершения одного полного шага на обмотки двигателя поступает серия сигналов от драйвера (как в полношаговом «1», так и в микрошаговых режимах «2», «4», «8», «16»).

С принципом работы шаговых двигателей можно ознакомиться в разделе Wiki - ШД.

Микрошаг:

Большинство драйверов позволяют разделить полный шаг двигателя на несколько микрошагов. Выбор микрошага устанавливается согласно таблице в инструкции к драйверу. В таблице указывается количество микрошагов на полный шаг «Microstep» (1/2/4/8/16/32/...) и/или количество тактов на полный оборот вала «Pulse/rev» (200/400/800/1600/3200/6400/...).

Если для целого поворота ротора двигателя в режиме 1 микрошаг на полный шаг требуется 200 тактов, то в режиме 4 микрошага на полный шаг, потребуется уже 800 тактов.

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

Ограничение тока фазы:

Большинство драйверов позволяют ограничить ток фазы (ток протекающий через обмотки двигателя). Выбор тока фазы осуществляется согласно таблице в инструкции к драйверу. В таблице указывается действующий ток «Current» и/или пиковый ток «PK Current». Чем выше ток, тем выше отдаваемый момент (сила двигателя).

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

У некоторых драйверов ограничение тока осуществляется поворотом потенциометра.

Ток удержания:

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

Снижение тока удержания приводит к снижению нагрева двигателя при его удержании.

Силовые выводы драйвера:

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

  • Входы «VCC», «GND» / «+V», «GND» / «AC+», «AC-» - предназначены для получения напряжения питания шагового двигателя.
  • Выводы «A+» и «A-» - предназначены для подключения первой обмотки шагового двигателя.
  • Выводы «B+» и «B-» - предназначены для подключения второй обмотки шагового двигателя.

Подключение обмоток двигателя к драйверу зависит от количества выводов у двигателя.

Драйверы DM860H, DM556, TB6600 позволяют работать только с биполярными двигателями. Двигатели с 4 выводами подключаются по схеме А. Двигатели с 6 выводами подключаются по схеме Б или В. Двигатели с 8 выводами подключаются по схеме Г или Д.

Запрещается подключать или отключать обмотки двигателя на включенном драйвере!

Сигналы управления STEP/DIR (PUL/DIR):

  • Вход драйвера «STEP» (он же «PULSE») - предназначен для получения тактовых импульсов. За один импульс ротор двигателя поворачивается на один микрошаг. Вход может работать по фронту или спаду импульса. Чем выше частота импульсов, тем выше скорость вращения ротора.
  • Вход драйвера «DIR» - предназначен для выбора направления вращения двигателя («0» - в одну сторону, «1» - в другую сторону). Смена состояния вывода «DIR» должна осуществляться при отсутствии импульсов на выводе «STEP».
  • Вход драйвера «ENABLE» - разрешает работу двигателя. У большинства драйверов данный вход является инверсным, работа двигателя разрешена при отсутствии напряжения на входе. Некоторые драйверы позволяют вообще не подключать этот вход. Если работа двигателя запрещена, то его обмотки электрически отключаются и вал двигателя не удерживается.
  • Двигатель отключён если на входе «ENABLE» есть напряжение.
    Сигналы на входах «STEP» и «DIR» игнорируются драйвером. Вал двигателя освобождён.
  • Вал поворачивается на один микрошаг с каждым импульсом на входе «STEP», при условии что на входе «ENABLE» нет напряжения.
    Направление поворота вала зависит от состояния на входе «DIR».
  • Вал двигателя удерживается в неподвижном состоянии если на входе «ENABLE» нет напряжения и на вход «STEP» не подаются импульсы.
  • t1: После снятия напряжения со входа «ENABLE» должно пройти не менее 5мкс до изменения уровня на входе «STEP» или «DIR».
  • t2: После изменения состояния на входе «DIR» должно пройти не менее 5мкс до подачи импульса на вход «STEP».
  • t3, t4: Длительность импульса или паузы на входе «STEP» не должна быть меньше 2,5мкс.
  • t5: Автоматическое снижение тока удержания происходит через 1-2 сек после подачи последнего импульса на вход «STEP». Время зависит от типа драйвера.

Сигналы управления CW/CCW:

(Данные сигналы не поддерживаются драйверами DM860H, DM556, TB6600)

  • Вход драйвера «CW» - предназначен для получения тактовых импульсов. За один импульс ротор двигателя поворачивается на один микрошаг. Вход может работать по фронту или спаду импульса. Чем выше частота импульсов, тем выше скорость вращения ротора.
  • Вход драйвера «CCW» - выполняет те же действия что и вход «CW», но ротор двигателя поворачивается в другую сторону.
  • Вход драйвера «ENABLE» - разрешает работу двигателя. У большинства драйверов данный вход является инверсным, работа двигателя разрешена при отсутствии напряжения на входе. Некоторые драйверы позволяют вообще не подключать этот вход. Если работа двигателя запрещена, то его обмотки электрически отключаются и вал двигателя не удерживается.
  • Двигатель отключён если на входе «ENABLE» есть напряжение.
    Сигналы на входах «CW» и «CCW» игнорируются драйвером. Вал двигателя освобождён.
  • Вал поворачивается на один микрошаг с каждым импульсом на входе «CW» или «CCW», при условии что на входе «ENABLE» нет напряжения.
    Направление поворота вала зависит от того, на какой вход поступают импульсы.
  • Вал двигателя удерживается в неподвижном состоянии если на входе «ENABLE» нет напряжения и на входы «CW» и «CCW» не подаются импульсы.
  • t1: После снятия напряжения со входа «ENABLE» должно пройти не менее 5мкс до подачи импульса на вход «CW» или «CCW».
  • t2: После последнего импульса на одном входе должно пройти не менее 5мкс до подачи импульса на дрогой вход.
  • t3, t4: Длительность импульса или паузы не должна быть меньше 2,5мкс.
  • t5: Автоматическое снижение тока удержания происходит через 1-2 сек после подачи последнего импульса. Время зависит от типа драйвера.

Подключение управляющих выводов драйвера:

Для подключения управляющих выводов можно использовать одну их следующих схем:

Допускается подключать драйвер к контроллеру без использования сигнала ENABLE, тогда выводы ENA+ и ENA- остаются свободными (не подключёнными).

  • При уровне логической «1» = 5В, все сопротивления R исключаются из схемы.
  • При уровне логической «1» = 12В, все сопротивления R равны 1кОм.
  • При уровне логической «1» = 24В, все сопротивления R равны 2кОм.

Подключение драйвера к Arduino:

Так как логические уровни Arduino UNO равны 5В, то при подключении управляющих выводов к драйверу, ограничивающие сопротивления R не нужны.

Для подключения драйвера к Arduino воспользуемся схемой где выводы PUL-, DIR-, ENA- подключены к GND контроллера (правая схема на картинке выше).

Если подключить драйвер к Arduino без использования сигнала ENABLE, оставив выводы ENA+ и ENA- не подключёнными, то приведённый ниже скетч не сможет освобождать вал. Вал двигателя будет удерживаться всё время, пока он не вращается.

Выводы драйвера ENA+, DIR+ и PUL+ можно подключить к любым выводам Arduino, их номера указываются в начале скетча. В примере это выводы 2, 3 и 4 соответственно.

Если для подключения драйвера воспользоваться схемой где выводы PUL+, DIR+, ENA+ подключены к 5V контроллера (левая схема на картинке выше), то в скетче нужно изменить логические уровни устанавливаемые функциями digitalWrite().

Управление двигателем при помощи Arduino:

Для работы скетча установите микрошаг 1/4, что соответствует 800 тактов на 1 оборот. Микрошаг устанавливается DIP-переключателями драйвера согласно таблице на его корпусе.

Скетч постоянно повторяет 4 действия:

  • Поворот вала на 2 полных оборота в одну сторону.
  • Остановка двигателя на 5 секунд с удержанием вала.
  • Поворот вала на 2 полных оборота в другую сторону.
  • Остановка двигателя на 5 секунд с освобождением вала.
const uint8_t pin_ENA = 2;                // Вывод Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 3;                // Вывод Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 4;                // Вывод Arduino подключённый к входу драйвера PUL+.
                                          // Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.
uint32_t f = 1000;                        // Определяем частоту следования микрошагов от 1 до 200'000 Гц.
                                          // Чем выше частота, тем выше скорость вращения вала.
void setup(){                             //
     pinMode( pin_ENA, OUTPUT );          // Конфигурируем вывод Arduino как выход.
     pinMode( pin_DIR, OUTPUT );          // Конфигурируем вывод Arduino как выход.
     pinMode( pin_PUL, OUTPUT );          // Конфигурируем вывод Arduino как выход.
}                                         //
                                          //
uint32_t t = 1000000/f/2;                 // Определяем длительность импульсов t3 и пауз t4 в мкс.
                                          //
void loop(){                              //
//   Готовимся к движению вала:           //
     digitalWrite( pin_ENA, 0 );          // Разрешаем работу двигателя.
     delayMicroseconds(5);                // Выполняем задержку t1 (см. график STEP/DIR).
     digitalWrite( pin_DIR, 0 );          // Выбираем направление вращения.
     delayMicroseconds(5);                // Выполняем задержку t2 (см. график STEP/DIR).
//   Поворачиваем вал на 2 оборота:       //
     for(int i=0; i<1600; i++){           // Выполняем 1600 проходов цикла (1 оборот = 800 тактов, 2 оборота = 1600).
         digitalWrite( pin_PUL, 1 );      // Устанавливаем на выводе PUL состояние логической «1».
         delayMicroseconds(t);            // Выполняем задержку t3 (см. график STEP/DIR).
         digitalWrite( pin_PUL, 0 );      // Устанавливаем на выводе PUL состояние логического «0».
         delayMicroseconds(t);            // Выполняем задержку t4 (см. график STEP/DIR).
     }                                    //
//   Останавливаем вал удерживая его:     // Двигатель не вращается, если на вывод PUL не поступают импульсы.
     delay(5000);                         // Ждём 5 секунд. В это время двигатель остановлен, его вал удерживается.
//   Меняем направление движения вала:    //
     digitalWrite( pin_DIR, 1 );          // Меняем логический уровень вывода DIR с 0 на 1.
     delayMicroseconds(5);                // Выполняем задержку t2 (см. график STEP/DIR).
//   Поворачиваем вал на 2 оборота:       //
     for(int i=0; i<1600; i++){           // Выполняем 1600 проходов цикла (1 оборот = 800 тактов, 2 оборота = 1600).
         digitalWrite( pin_PUL, 1 );      // Устанавливаем на выводе PUL состояние логической «1».
         delayMicroseconds(t);            // Выполняем задержку t3 (см. график STEP/DIR).
         digitalWrite( pin_PUL, 0 );      // Устанавливаем на выводе PUL состояние логического «0».
         delayMicroseconds(t);            // Выполняем задержку t4 (см. график STEP/DIR).
     }                                    //
//   Останавливаем вал без удержания:     //
     digitalWrite( pin_ENA, 1 );          // Запрещаем работу двигателя, отключаем токи в обмотках.
     delay(5000);                         // Ждём 5 секунд. В это время двигатель отключен, его вал свободен.
}                                         //
  • Движение вала на 2 оборота в одну сторону:
    Перед началом движения вала мы разрешаем работу двигателя (установив 0 на выводе ENA) и выбираем направление движения (установив 0 или 1 на вывод DIR), далее выполняем движение подачей импульсов на вывод PUL в теле цикла for. Каждый импульс поворачивает ротор на угол одного микрошага. Микрошаг установлен DIP-переключателями в положение 800 тактов на полный оборот. Код цикла выполняется 1600 раз, значит вал повернётся на 2 оборота.
  • Остановка вала с удержанием:
    Двигатель не вращается, если на вывод PUL не поступают импульсы. Значит обычная задержка на 5000 мс приведёт к остановке двигателя на 5 секунд. Так как работа двигателя была разрешена (на выводе ENA ранее был установлен 0), то через обмотки двигателя будет протекать ток удержания вала.
  • Движение вала на 2 оборота в другую сторону:
    Направление движения вала определяется логическим уровнем на выводе DIR. Ранее на нём был установлен 0, значит теперь нужно установить 1. Далее подачей импульсов на вывод PUL мы заставляем вращаться вал, но теперь в другую сторону.
  • Остановка вала без удержания:
    В предыдущий раз мы останавливали двигатель прекращая подавать импульсы на вывод PUL, но не запрещали работу двигателя, в результате через его обмотки протекал ток удержания вала. Теперь мы запретим работу двигателя установив на выводе ENA уровень логической 1, что приведёт к исчезновению токов в обмотках двигателя. Теперь в течении 5 секунд, двигатель будет не только остановлен, но и его вал можно свободно вращать руками.

Управление шаговым двигателем по прерываниям от 2 таймера Arduino:

const uint8_t pin_ENA = 2;                // Вывод Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 3;                // Вывод Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 4;                // Вывод Arduino подключённый к входу драйвера PUL+.
                                          // Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.
volatile uint32_t step=0;                 // Переменная хранит количество микрошагов, которые требуется совершить.
                                          //
void setup(){                             //
     pinMode( pin_ENA, OUTPUT );          // Конфигурируем вывод Arduino как выход.
     pinMode( pin_DIR, OUTPUT );          // Конфигурируем вывод Arduino как выход.
     pinMode( pin_PUL, OUTPUT );          // Конфигурируем вывод Arduino как выход.
     funcSetTimer2( 1000 );               // Запускаем 2 таймер указав частоту следования микрошагов от 1 до 200'000 Гц.
}                                         // Чем выше частота, тем выше скорость вращения вала.
                                          //
void loop(){                              //
//   Готовимся к движению вала:           //
     digitalWrite( pin_ENA, 0 );          // Разрешаем работу двигателя.
     delayMicroseconds(5);                // Выполняем задержку t1 (см. график STEP/DIR).
     digitalWrite( pin_DIR, 0 );          // Выбираем направление вращения.
     delayMicroseconds(5);                // Выполняем задержку t2 (см. график STEP/DIR).
//   Поворачиваем вал на 2 оборота:       //
     step=1600;                           // Указываем количество микрошагов, которые требуется совершить.
     while(step){;}                       // Ждём обнуления переменной.
//   Останавливаем вал удерживая его:     // Двигатель не вращается, если на вывод PUL не поступают импульсы.
     delay(5000);                         // Ждём 5 секунд. В это время двигатель остановлен, его вал удерживается.
//   Меняем направление движения вала:    //
     digitalWrite( pin_DIR, 1 );          // Меняем логический уровень вывода DIR с 0 на 1.
     delayMicroseconds(5);                // Выполняем задержку t2 (см. график STEP/DIR).
//   Поворачиваем вал на 2 оборота:       //
     step=1600;                           // Указываем количество микрошагов, которые требуется совершить.
     while(step){;}                       // Ждём обнуления переменной.
//   Останавливаем вал без удержания:     //
     digitalWrite( pin_ENA, 1 );          // Запрещаем работу двигателя, отключаем токи в обмотках.
     delay(5000);                         // Ждём 5 секунд. В это время двигатель отключен, его вал свободен.
}                                         //
                                          //
//   ОБРАБОТКА ПРЕРЫВАНИЙ 2 ТАЙМЕРА:      //
ISR(TIMER2_COMPA_vect){                   // Функция вызывается по совпадению регистров TCNT2 и OCR2A.
      if( step ){                         // Если требуется выполнять микрошаги, то ...
          bool p = digitalRead(pin_PUL);  // Определяем текущее состояние на выводе PUL.
          digitalWrite(pin_PUL, !p);      // Меняем состояние на выводе PUL.
          if( p ){ step--; }              // Уменьшаем количество требуемых микрошагов.
      }                                   //
}                                         //
                                          //
//    ФУНКЦИЯ НАСТРОЙКИ 2 ТАЙМЕРА:        //
void  funcSetTimer2(uint32_t f){          // Параметр: «f» - частота тактирования ШД от 1 до 200'000 Гц.
      if(f>200000){f=200000;}
//    Определяем значение предделителя:
      uint16_t i; uint8_t  j; f*=2;
      if(f>(F_CPU/255/  1)){i=   1; j=1;}else
      if(f>(F_CPU/255/  8)){i=   8; j=2;}else
      if(f>(F_CPU/255/ 32)){i=  32; j=3;}else
      if(f>(F_CPU/255/ 64)){i=  64; j=4;}else
      if(f>(F_CPU/255/128)){i= 128; j=5;}else
      if(f>(F_CPU/255/256)){i= 256; j=6;}else
                           {i=1024; j=7;}
//    Устанавливаем регистры 2 таймера:
      TCCR2A = 0<<COM2A1 | 0<<COM2A0 | 0<<COM2B1 | 0<<COM2B0 | 1<<WGM21  | 0<<WGM20;
      TCCR2B = 0<<FOC2A  | 0<<FOC2B  | 0<<WGM22  | j;
      OCR2A  = (uint8_t)(F_CPU/(i*f))-1;
      TIMSK2 = 0<<OCIE2B | 1<<OCIE2A | 0<<TOIE2;
      SREG   = 1<<7;
}

Данный скетч выполняет те же действия что и предыдущий. Но подача импульсов на вывод PUL осуществляется не в цикле основного кода, а по прерываниям от таймера.

Как только переменной step присваивается число отличное от 0, то на драйвер начинают поступать импульсы. Значение step убывает с каждым поданным импульсом, пока не достигнет 0, что приведёт к остановке вала двигателя. Частота подачи импульсов в Гц указывается функцией funcSetTimer2().

В данном скетче мы ждём завершение вращения вала проверяя значение step в цикле while, вместо этого можно выполнять другие действия, например, опрашивать концевики, датчики, измерять пройденное расстояние и т.д.

Код работает на Arduino UNO, Pro Mini, Nano, Mega.

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями