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

Вопросы об управлении шаговыми двигателями
Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 28 янв 2017, 23:06

Есть задача крутить шаговый двигатель, типа NEMA 23 57HS7630A4 с помощью драйвера bl-tb6600-v1.2 и контроллера на базе Arduino UNO. Параметры драйвера http://www.progdron.com/ru/arduino-shie ... 0-dc12-45v или здесь http://totcnc.com/tblog/20_instruction-bl-tb6600-v1-2
В схеме (а также программе контроллера) нужно предусмотреть возможность выставления скорости двигателя, направления вращения, старта\стопа, и выведения подобной информации на ЖК экран типа LCD 1602 Hd44780.
Вопрос следующий. Драйвер работает с максимальной частотой следования импульсов 200 кГЦ, т.е. 5 мкс (см. ссылки). Управление STEP\DIR происходит в каждом такте? Например, мне нужно разогнать двигатель. Для этого следует увеличивать частоту следования импульсов (уменьшать период тактовых импульсов) по гиперболическому закону дабы получить постоянное ускорение. Возможно ли такое реализовать, учитывая, время выполнения программного кода конечно и не обязательно укладывается в минимальный период следования импульсов на драйвер шагового двигателя?


Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 29 янв 2017, 00:01

Хочу пояснить задачу. Это не станок ЧПУ и вообще не станок. Просто двигатель должен перемещать груз 5-10 кг посредством ШВП с разной скоростью. Желательно иметь в арсенале максимально возможную скорость. Двигатель имеет микрошаг 1\16, 200 полных шагов на один оборот, соответственно при скорости 1 оборот в секунду, получаем 3,2 кГЦ частоту шаговых импульсов. 10 оборотов в секунду - 32 кГЦ. Раз драйвер позволяет оперировать максимальной частотой 200 кГЦ, соответственно теоретически можно получить 60 оборотов в секунду, или 3600 об\мин. Понимаю, что шаговый двигатель с такой скоростью обычно не крутится, либо имеет очень малый момент при этом. Однако нужно выжать максимум, а какой он получится - будет видно...

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 29 янв 2017, 00:31

Прежде всего, вам надо формализовать задачу.

У меня следующие вопросы.

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

    Зачем Вам микро шаговый режим? Он снижает скорость вращения двигателя, уменьшает крутящий момент, требует увеличивать частоту импульсов STEP.

    Гиперболический закон изменения скорости вращения это обязательное условие? Или вы боитесь, что двигатель выйдет из синхронизма?

    С какой точностью и дискретностью надо регулировать частоту вращения?

На какие-то вопросы, касающиеся физических процессов, вы, скорее всего не знаете ответы. Я бы рекомендовал сделать так.

    Собрать реальную конструкцию или близкий к ней макет.

    Подключить STEP/DIR драйвер к плате Arduino UNO по схеме из урока 35. Загрузить в плату программу драйвера с AT командами.

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

    Проверить на реальной конструкции, с реальной нагрузкой работу всего: механической конструкции, двигателя, электроники. Вы узнаете все: мощность, скорость, какой режим вращения предпочтительнее…

    В уроке 32 есть программа верхнего уровня для следящего электропривода. Можете попробовать управлять с помощью нее. Посмотрите фильм из урока.


После этого вы будете иметь практически всю информацию и сможете сформировать задачу.

Только после всего этого может идти речь об индикаторах, кнопках и т.п.

Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 29 янв 2017, 16:05

Эдуард писал(а):Прежде всего, вам надо формализовать задачу.

У меня следующие вопросы.

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


Думаю, что логично иметь возможность остановки двигателя в нужный момент. Либо концевой датчик для остановки (микропереключатель). Точность положения ротора меня, практически, не интересует, это не станок. В рабочем цикле, когда двигатель вращается нужно только выведение информации на LCD 1602 Hd44780 желательно на русском языке такого характера: установленная скорость, ну и "СТОП" чтобы можно было понять, что для остановки двигателя нужно нажать на кнопку. Характер сообщений или МЕНЮ я еще конкретно не обдумывал, но должны быть такие параметры как скорость в условных единицах, направление вращения, старт\стоп. Пока как-то так. Не плохо было бы иметь уровень разряда аккумулятора, ибо устройство предполагается мобильным, но пока не представляю как это реализовать.

Эдуард писал(а):Прежде всего, вам надо формализовать задачу.

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

Гиперболический закон изменения скорости вращения это обязательное условие? Или вы боитесь, что двигатель выйдет из синхронизма?

С какой точностью и дискретностью надо регулировать частоту вращения?



Читал известную в сети статью Леонида Ридико, по всему видно, что это профессионал в шаговых двигателях. http://darxton.ru/wiki-article/kontroller-shagovogo-dvigatelya/
Он, в частности, указывает ''.. В микрошаговом режиме можно осуществлять только разгон и торможение, а основное время работать в полношаговом режиме...'' Затем, на невысоких скоростях микрошаговый режим позволяет работать двигателю более плавно.
Что касается гиперболического закона, то в вышеуказанной статье пишется следующее :
"... Использование разгона и торможения позволяет достичь значительно больших скоростей - в индустриальных применениях используются скорости до 10000 полных шагов в секунду. ......
...На практике чаще всего применяют разгон и торможение с постоянным ускорением.....
...При разгоне или торможении с постоянным ускорением частота повторения шагов должна изменяться линейно, соответствено значение периода, которое необходимо загружать в таймер, должно меняться по гиперболическому закону...."
Точность регулировки частоты вращения не имеет ни малейшего значения. Достаточно весь спектр скоростей поделить на 10-20 градаций от нуля до максимума и выбирать просто нужную относительную цифру перед пуском.

Эдуард писал(а):[list]Собрать реальную конструкцию или близкий к ней макет.

Подключить STEP/DIR драйвер к плате Arduino UNO по схеме из урока 35. Загрузить в плату программу драйвера с AT командами.

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



Конструкцию собрал, а именно: двигатель, драйвер, контроллер. Питание на контроллер пока пробовал только 12 вольт, вот вот появится возможность подать до 48 В (как того требует драйвер для максимальных скоростей).
Загружал именно Ваш скетч из урока 35 с библиотекой StepDirDriver. Двигатель вращается. Правда максимальная скорость не очень высока. Я ещё плохо понимаю Ваш скетч, буду задавать вопросы. Мне там не понятно, как формируется скорость.
С AT командами не пробовал, но думаю, что максимальную скорость без разгона по гиперболе все равно не получить.

Эдуард писал(а):
Проверить на реальной конструкции, с реальной нагрузкой работу всего: механической конструкции, двигателя, электроники. Вы узнаете все: мощность, скорость, какой режим вращения предпочтительнее…


На реальной конструкции пока не получается, еще не собрал, комплектующие не все в наличии...

Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 29 янв 2017, 16:26

Я так понимаю, что Вы хотите сказать, что во время разгона\торможения, когда программа рассчитывает период в каждом такте импульсов STEP, то прерывания на обслуживания прочих задач не возможны. Однако, разгон\торможение выполняются за несколько десятков или сотен первых шагов (это 2-3 оборота двигателя), а далее скорость достигает заданной величины и может не контролироваться в каждом такте. Я прав?
Поэтому обрабатывать команду(кнопку) СТОП можно, да и точность выполнения этой команды жестко не нормируется, это не станок. Получается, что программа подвиснет только в режимах разгон\торможение. Я хочу спросить, в таком случае возможен вывод информации на дисплей? Или все потухнет и погаснет в эти моменты? :)

Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 29 янв 2017, 16:33

Что-то не нахожу кнопку редактирования сообщения, поэтому пишу очередное. Мне нужно продумать алгоритм работы программы, нарисовать его, отточить. И только затем приступать к написанию кода, правильно?

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 29 янв 2017, 18:12

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

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

Возможно она вас устроит.

Я когда-то делал управление мощным индукторным двигателем с датчиками положения ротора (ДПР).
Сначала он разгонялся в режиме шагового двигателя без обратной связи.
Затем фазы переключались по сигналам ДПР.
А на следующем этапе скорости магнитное поле в обмотках отставало от реального положения ротора. Приходилось строить виртуальную диаграмму переключения фаз с опережением сигналов ДПР.
Но это был очень скоростной двигатель.

Для больших скоростей вращения применяют бесколлекторные двигатели. Например, эти. У них есть встроенные датчики положения ротора. Без ДПР вы не сможете получить высокой скорости вращения. Любое изменение механической нагрузки, и двигатель выходит из синхронизма.

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

Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 30 янв 2017, 15:45

Хорошо, попробую. Но мне нужны как ультранизкие скорости, так и "ультравысокие". Это устройство для видеосъемки, будет перемещать камеру. Высокие скорости нужны, чтобы заменить вал ШВП на трапециедальный или вовсе на метрический..
А не подскажите, как замерить количество оборотов?

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 30 янв 2017, 17:12

Измерить количество оборотов для шагового двигателя?

Посчитать шаги. Для вашего двигателя 200 шагов это полный оборот.

Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 30 янв 2017, 23:13

Эдуард писал(а):Измерить количество оборотов для шагового двигателя?

Посчитать шаги. Для вашего двигателя 200 шагов это полный оборот.


Нет, я скорость имел ввиду. Оборотов в минуту. По времени засекать - как-то не камильфо. Для Андроида скачивал проги по замеру скорости вращения, они не работают... Прибора для этого измерения - нет... :(

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 30 янв 2017, 23:16

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

Alian
Сообщения: 10
Зарегистрирован: 28 янв 2017, 22:48

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

Сообщение Alian » 03 фев 2017, 23:06

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

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 03 фев 2017, 23:08

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

Rom327
Сообщения: 6
Зарегистрирован: 09 июл 2017, 14:58

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

Сообщение Rom327 » 09 июл 2017, 15:10

Здравствуйте Эдуард!
В голове алгоритм программы крутится, но данные, полученные из уроков, не получается связать между собой.
Есть у меня задача по управлению ШД:
При кратковременном нажатии на кнопку К1, ШД совершает n1 оборотов по часовой стрелке и сразу (или с паузой t) n2 оборотов против часовой стрелки. n1 задается положением резистора R1, n2 положением резистора R2. Максимальные значения n1 и n2 и скорость вращения ШД прописываются в скетче.
При длительном нажатии на кнопку К1, происходит все тоже самое, что и при кратковременном нажатии, но циклы повторяются с частотой заданной резистором R3, t2(0-3с).
При нажатии кнопки К2 ШД вращается против часовой стрелки постоянно, пока нажата кнопка К2.

Хотя я в программировании мало что понимаю, но надеюсь с вашей помощью решить эту задачу. Поэтому у меня есть пара вопросов для начала:
Какие библиотеки необходимо использовать для моей задачи?
Какой пример (урок) Вы бы посоветовали в качестве основы для написания скетча. Спасибо!

Rom327
Сообщения: 6
Зарегистрирован: 09 июл 2017, 14:58

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

Сообщение Rom327 » 09 июл 2017, 15:24

Забыл добавить, что управление ШД планируется через драйвер Dir/Step

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 09 июл 2017, 19:22

Здравствуйте!
Управлению Step/Dir драйверами посвящен урок 35. Там даже есть пример программы которая заставляет сделать двигатель 2 оборота по часовой стрелке со скоростью 1 оборот в секунду, затем пауза 1 секунда, 2 оборота против часовой стрелки, опять пауза на секунду и так в цикле.
О том, как измерить напряжение на входе есть в уроке 13, конкретный пример использования переменного резистора для задания напряжения на входе приведен в уроке 48.

Rom327
Сообщения: 6
Зарегистрирован: 09 июл 2017, 14:58

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

Сообщение Rom327 » 09 июл 2017, 22:39

Здравствуйте! Вот наваял скетч из 2-х один. Работает от кнопки на 3-ем пине. Вторая кнопка вообще не реагирует, видимо что-то я наврал...
Вперед шагает на 400 шагов, назад на 100. В принципе то что надо. Как правильно задействовать кнопку на пине 2, чтобы при нажатии на нее мотор постоянно крутился обратно?

Код: Выделить всё

// define a constant value named stepPin and assign the value 9 to it - this value will not change during our code
// this assumes digital pin 9 of your Arduino is attached to the step input of your driver
// определяем значение константы по имени продвижение и присвойте значение 9 к нему - это значение не изменится в ходе нашего кода
// при этом предполагается, что цифровой контакт 9 части вашего Arduino крепится к шагу ввода драйвера
#define stepPin 9
 
// define a constant value named dirPin and assign the value 8 to it - this value will not change during our code
// this assumes digital pin 8 of your Arduino is attached to the step input of your driver
// определяем значение константы по имени штырь и присвоить значение 8 - это значение не изменится в ходе нашего кода
// при этом предполагается, что цифровой вывод 8 части вашего Arduino крепится к шагу ввода драйвера
#define dirPin 8
 
// define the pins on which we've put our N.O. buttons
// определить штыри, на которых мы поместили наши кнопки Н.О.
#define button1 2
#define button2 3
 
// setup() loop, the Arduino only runs through this once
// настройка() петли, Arduino только проходит через этот раз
void setup() {
  // digital pins on the Arduino can only be either set as an output or input - in our case we want to send data to the driver, so we choose output
  // цифровых пинов на Arduino можно только либо установить в качестве выходного или входного сигнала - в нашем случае мы хотим отправить данные на водителя, поэтому мы выбираем выходной
  pinMode(stepPin , OUTPUT);
  pinMode(dirPin , OUTPUT);
 
  // define our button pins as input pullup type
  // определения наша кнопка булавки в качестве входного типа подтяжки
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
 
  // let's set an initial value of low to both our step and dir pins, we could easily write false or 0 instead of LOW
  // зададим начальное значение минимума как шаг штырей и дира, мы могли бы легко написать false или 0, а не низкий
  digitalWrite(stepPin , LOW);
  digitalWrite(dirPin , LOW);
}
 
// loop() loop, the Arduino continuously cycles through this as fast as it can
// петля() петли, Ардуино постоянно циклов через это как можно быстрее
void loop() {
 
  if (digitalRead(button1) == LOW && digitalRead(button2) == HIGH) { // if button1 is pressed and button2 is not pressed если нажата кнопка button1 и button2 не нажимается
    digitalWrite(dirPin, LOW); // move in the LOW direction двигаться в низких направлении
  } else if (digitalRead(button1) == HIGH && digitalRead(button2) == LOW) { // if btton1 is not pressed and button2 is pressed если btton1 не нажата и button2 нажата
    digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
  // Makes 200 pulses for making one full cycle rotation
  for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
  }
  delay(10); // One second delay
 
  digitalWrite(dirPin,LOW); //Changes the rotations direction
  // Makes 400 pulses for making two full cycle rotation
  for(int x = 0; x < 100; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
  }
  delay(10);
   
  }
}

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 09 июл 2017, 23:50

Попробуйте в loop() вставьте что-то такое

Код: Выделить всё

while(digitalRead(button2) == LOW) {
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(500);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(500); 
}

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

Rom327
Сообщения: 6
Зарегистрирован: 09 июл 2017, 14:58

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

Сообщение Rom327 » 10 июл 2017, 10:16

Да не умею я программы писать! Не мое это! Вот понадобилось, пытаюсь разобраться.

Rom327
Сообщения: 6
Зарегистрирован: 09 июл 2017, 14:58

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

Сообщение Rom327 » 10 июл 2017, 10:51

Эдуард писал(а):Попробуйте в loop() вставьте что-то такое

Код: Выделить всё

while(digitalRead(button2) == LOW) {
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(500);
  digitalWrite(stepPin,LOW);
  delayMicroseconds(500); 
}

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

Не получилось...

Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

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

Сообщение Эдуард » 10 июл 2017, 13:53

А что происходит?

Rom327
Сообщения: 6
Зарегистрирован: 09 июл 2017, 14:58

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

Сообщение Rom327 » 10 июл 2017, 14:59

Вот мне один добрый товарищ код написал. Работает как надо! Я в него ввел две переменные F & R вперед-назад. Теперь можно задавать количество шагов вначале программы. Следующим шагом пытаюсь прикрутить потенциометры, чтобы эти две переменные менять в реальном времени. Но опять не пойму как... Алгоритм в голове крутиться, но наружу не выходит... Пока закомментировал...

Код: Выделить всё

#define stepPin 9 //сигнал step ШД
#define dirPin 8 //сигнал dir ШД
#define button1 2 //кнопка КН1 "вперед"
#define button2 3 // кнопка КН2 "назад"
bool f_step;
bool kn_bt1;
bool kn_bt2;
int F=800; // переменная F (Forward) количество шагов вперед
int R=200; // переменная R (Reverse) количество шагов назад
uint32_t temp = millis();
int mu_step = F; // переменная F шагов на оборот (делитель1/2)
  //int potPin1 = A0; //переменная потенциометр 1 количество шагов "вперед"
  //int potPin2 = A2; //переменная потенциометр 2 количество шагов "назад"
    //int potValue1 = 0;
    //int potValue2 = 0;

void setup() {
  pinMode(stepPin , OUTPUT);
  pinMode(dirPin , OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  digitalWrite(stepPin , LOW);
  digitalWrite(dirPin , LOW);
 
}

void loop() {
  //potValue1 = analogRead(potPin1); // считываем значения с потенциометра 1
  //potValue2 = analogRead(potPin2); // считываем значения с потенциометра 2
  if (digitalRead(button1) == LOW ) {
    kn_bt1 = 1;
    kn_bt2 = 0;
    digitalWrite(dirPin, LOW);
  }
  if (digitalRead(button2) == LOW) {
    kn_bt1 = 0;
    kn_bt2 = 1;
    mu_step = F;
    digitalWrite(dirPin, HIGH);
  }
  else {
   kn_bt2 = 0;
  }

  if (kn_bt1 && millis() - temp >= 2) {
    temp = millis();
    f_step = !f_step;
    mu_step--;
    if (mu_step <= 0 && digitalRead(dirPin) == LOW) {
      digitalWrite(dirPin, HIGH);
      mu_step = R;
    }
    if (mu_step <= 0 && digitalRead(dirPin) == HIGH) {
      digitalWrite(dirPin, LOW);
      mu_step = 800;
      kn_bt1=0;
    }
    if (mu_step > 0) digitalWrite(stepPin, f_step);
  }

  if (kn_bt2 && millis() - temp >= 2) {
    temp = millis();
    f_step = !f_step;
    digitalWrite(stepPin, f_step);
  }
}


Вернуться в «Шаговые двигатели и драйверы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость