Шаговый двигатель - плавный разгон

JSinx
Offline
Зарегистрирован: 19.10.2012

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

С помошью tone работает на частоте 10 кГц. Но в таком случае сложно отследить количество сделанных шагов.

Если разонять, уменьшая интерваллы между подачами сигнала HIGH и LOW на порт - максимальная частота 5 кГц. 

Прочитал статью про двигатели, где есть формула расчета времени для след.шага

Цитата:

1/T = 1/T0+At, где T – длительность шага, T0 – начальная длительность шага, t – текущее время;

Откуда T = T0/(1+T0At)
 

 

но тут вообще какая то ерунда выходит :(

Может кто подскажет, как линейно разогнать до макс. скорости?

P.S. Функция должна быть не блокирующей.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

 А поискать по форуму слабо?

Неоднократно давалась ссылка на библиотеку AccellStepper

JSinx
Offline
Зарегистрирован: 19.10.2012

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

AccelStepper к сожаленью тоже не раскручивает до максимума :(

JSinx
Offline
Зарегистрирован: 19.10.2012

Придумал, как с помощью tone управлять движком и считать кол-во импульсов. 

Нашел метод, который позволяет разогнать движек до 25 об/сек ( частота 10 кГц ).

На один их выходов подаю частоту с помощью tone, он подключен к входу 2, на который подписана функция прерывания. В ней отправляю на нужный выход состояние + считаю импульсы.

Минус - крутиться может только один двигатель - либо все с одинаковой скоростью. Но меня это устраивает.

John
Offline
Зарегистрирован: 22.01.2013

JSinx пишет:

Придумал, как с помощью tone управлять движком и считать кол-во импульсов. 

Нашел метод, который позволяет разогнать движек до 25 об/сек ( частота 10 кГц ).

На один их выходов подаю частоту с помощью tone, он подключен к входу 2, на который подписана функция прерывания. В ней отправляю на нужный выход состояние + считаю импульсы.

Минус - крутиться может только один двигатель - либо все с одинаковой скоростью. Но меня это устраивает.

Если не сложно (и если сохранился) выложите код пожалуйста. Столкнулся с той же проблемой плавного запуска

JSinx
Offline
Зарегистрирован: 19.10.2012

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

Мне не хватало ее максимальной скорости, либо не до конца разобрался :)

P.S. Постараюсь не забыть на неделе посмотреть код.

 

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

JSinx пишет:

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

С помошью tone работает на частоте 10 кГц. Но в таком случае сложно отследить количество сделанных шагов.

Если разонять, уменьшая интерваллы между подачами сигнала HIGH и LOW на порт - максимальная частота 5 кГц. 

Прочитал статью про двигатели, где есть формула расчета времени для след.шага

 

Привет !

Столкнулся с аналогичной проблемой. Долго долго мучался. 

Результаты:

-Переписал accelstepper  так, что бы он нормально работал. Выпилил оттуда лишний расчет, в итоге поднял максимальную скорость с 4600 в сек, примерно до 12-18 кгц. Правда нельзя теперь "тормозить" по ходу, т.е. пересчет всех показателей делается теперь один раз и когда мотор стоит. Пришли емейл, скину код/открою доступ к Bitbucket.

-переписал свой код так, что бы когда мотор работал ничего не происходило больше. Только кнопка аварийной остановки и опрашивается. Без этого было куча глюков. Месяц потратил только на то, что бы понять, что запись в сериальный порт стоит 2-5 мкс,А индикатор то вообще 20 мс.  ,т.е. вместо 5500 шаг/сек, вылезало около 800..

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

Итог: Устройство работает. Более-менее доволен. 

Что еще попробовал:

Купил генератор, собрал схему с ардуиной, могу плавно менять частоту. Плавно ее поднимаю. Где-то на 8-12 тыс шагов в секунду мотору становится плохо. Вернее сказать он вдруг чихает и встает.  И это все практически без нагрузки. Чем больше ограничиваю мотор по току, тем менее стабильно все работает. т.е. на 1 ампере, уже на 4-5 т сбоит.

Если поставить более дешевый контроллер на Тошибе, то вообще глючит и сбоит.

С учетом того, что мотор номер 1 китайский, а номер 2 расчитан на 800 шагов в секунду (медицинский, кровь гнать) решил, что это примерно физические границы мотора+контроллера. И решил больше не эксперементировать.

 

Пришли/выложи код, если не лень, может вместе найдем правильное решение.

 

JSinx
Offline
Зарегистрирован: 19.10.2012

achest пишет:

-Переписал accelstepper  так, что бы он нормально работал. Выпилил оттуда лишний расчет, в итоге поднял максимальную скорость с 4600 в сек, примерно до 12-18 кгц. Правда нельзя теперь "тормозить" по ходу, т.е. пересчет всех показателей делается теперь один раз и когда мотор стоит.

18Кгц не многовато? у меня на 10 КГц максимум работал, хотя двиг какой то крутой был.

achest пишет:

Купил генератор, собрал схему с ардуиной, могу плавно менять частоту. Плавно ее поднимаю. Где-то на 8-12 тыс шагов в секунду мотору становится плохо. Вернее сказать он вдруг чихает и встает.  И это все практически без нагрузки. Чем больше ограничиваю мотор по току, тем менее стабильно все работает. т.е.  на 1 ампере, уже на 4-5 т сбоит.

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

achest пишет:

Пришли/выложи код, если не лень, может вместе найдем правильное решение.

Собственно у меня сейчас работа двигателя сделана так, на один выход подаются импульсы комнадой tone. Выход  механически (т.е. проводком) присоединен к входу, на которое можно повесить обработку прерывания. Вешаю обработку прерывания и там указываю на какую ногу подавать импульс и считаю импульсы. В итоге можно разогнать больше чем 10Кгц, но нужно ли? Вроде даже контроллер на расчитан на большую частоту..

 

Ну а в финале работы оказалось, что видимо у двигателя 2 режима работы: шаг и полушаг (как то так, не помню уже точно), и у меня щас макс.частота 400 Гц и вполне резво гоняет. При нагрузке двигатели 10 Кгц не тянули (опять же вроде)

P.S. Может чтото ошибаюсь по поводу частоты, проект почти 2 года как работает на складе и я им не занимался. Щас смотрю просто константы в исходниках, смутно вспоминаю чтото :)

 
 
achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

JSinx пишет:

18Кгц не многовато? у меня на 10 КГц максимум работал, хотя двиг какой то крутой был.

Я - программист. мое дело оптимизировать программу.  Когда я убрал косяки автора, то осцилограф стал показывать  18 кгц.

Это важно в первую очередь тем, что теперь длина цикла программы примерно 60 мкс, вместо 250мкс. т.е  окно стало больше.и теперь можно помимо собсвтвенно операций с шаговым двигателем еще добавить немного логики в программу.

JSinx пишет:

achest пишет:

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

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

Угу. А расскажи как ты плавно умеешь менять частоту. Именно плавно, без сбоев по фазе. У меня мотор должен и 1-2 шага в секунду делать. Новая команда тоне- всегда виден маленький сбой на осцилогафе... А мне надо 100 шагов для разгона/торможения...

И как точно подкатить к определенной позиции. (в общей сложности 2 остановки в секунду)

JSinx пишет:

Ну а в финале работы оказалось, что видимо у двигателя 2 режима работы: шаг и полушаг (как то так, не помню уже точно), и у меня щас макс.частота 400 Гц и вполне резво гоняет. При нагрузке двигатели 10 Кгц не тянули (опять же вроде)

P.S. Может чтото ошибаюсь по поводу частоты, проект почти 2 года как работает на складе и я им не занимался. Щас смотрю просто константы в исходниках, смутно вспоминаю чтото :)

 

Наверное все таки не двигателя, а контроллера? У меня там можно до 1/16 шага задать. И самый правильный с точки зрения вибрации режим именно 1/2 шага оказался.

Мне кажется, что по частоте ты не ошибаешься. У меня было так же.

JSinx
Offline
Зарегистрирован: 19.10.2012

achest пишет:

Я - программист. мое дело оптимизировать программу.  Когда я убрал косяки автора, то осцилограф стал показывать  18 кгц.

Мне было тогда лениво разбираться в библиотеке :) Казалось более простым найти свой способ.

achest пишет:

Угу. А расскажи как ты плавно умеешь менять частоту. Именно плавно, без сбоев по фазе. У меня мотор должен и 1-2 шага в секунду делать. Новая команда тоне- всегда виден маленький сбой на осцилогафе... А мне надо 100 шагов для разгона/торможения...

И как точно подкатить к определенной позиции. (в общей сложности 2 остановки в секунду)

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

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

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

JSinx пишет:

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

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

Поясни пожалуйста подробнее, приведи код. Не понимаю. 

Моя задача: Проехать от 0 до 1000, встать, вернуться обратно в туже самую точку. Разгон плавный. т.е. на максимальной скорости мотор не успевает разогнаться: 500 шагов ускорения, 500 торможения.  В нормальном режиме разгон занимает 40...80 шагов.

Концевик пришлось поставить, но идеально что бы без него. Коррекция сбивает всю динамику.  Написал логику так, что бы он корректировал себя в при следующем цикле. т.е. если старт из позиции -2, то 1002 шага. Но как-то оно не стабильно работает.

 

JSinx
Offline
Зарегистрирован: 19.10.2012
tone( номер_ножки_которая_соединена_с_другим_входом_проводом, частота );

//привязываем обработку прерывания
attachInterrupt(1, функция_обработки, RISING );                    

void  функция_обработки()
{
  if ( StepCur < StepDest )  {      
    digitalWrite( pinStepMotor, HIGH );
    digitalWrite( pinStepMotor, LOW );   
    StepCur++;    
  }
  else
  {
    detachInterrupt( 1 );
    noTone( pinTone );
  }
}

 

Deamount
Offline
Зарегистрирован: 07.05.2012

Добрый день

нужно разогнать nema17 до 15 оборотов в секунду. Помогите...

для начала я не до конца понял смысл tone... Я думал так: digitalwrite выполняется 2мс, и чтобы это ускорить вы использовали tone. Где-то на хабре попалась мне статья с предложением заменить digitalwrite на прямую запись в порт и якобы это занимает меньше 10 мкс.

вот что я написал для своего nano:

      PORTB = B0001;
      delayMicroseconds(mks);
      PORTB = B0101;
      delayMicroseconds(mks);
      PORTB = B0100;
      delayMicroseconds(mks);
      PORTB = B0110;
      delayMicroseconds(mks);      
      PORTB = B0010;
      delayMicroseconds(mks);
      PORTB = B1010;
      delayMicroseconds(mks);
      PORTB = B1000;
      delayMicroseconds(mks);
      PORTB = B1001;
      delayMicroseconds(mks);

Это полушаг для моего драйвера на L298N. двигатель NEMA17 биполярный.

при mks меньше 500 двигатель гудит и не крутится.

при 500 - крутится примерно 6-8 оборотов в сек. навскидку...

Помогите разогнать в два раза. Если тут поможет tone, объясните пожалуйста как?