Шаговый двигатель - плавный разгон
- Войдите на сайт для отправки комментариев
Ср, 24/10/2012 - 09:11
Нужно управлять шаговым двигателем, разгоняя и плавно останавливая его.
С помошью tone работает на частоте 10 кГц. Но в таком случае сложно отследить количество сделанных шагов.
Если разонять, уменьшая интерваллы между подачами сигнала HIGH и LOW на порт - максимальная частота 5 кГц.
Прочитал статью про двигатели, где есть формула расчета времени для след.шага
1/T = 1/T0+At, где T – длительность шага, T0 – начальная длительность шага, t – текущее время;
Откуда T = T0/(1+T0At)
но тут вообще какая то ерунда выходит :(
Может кто подскажет, как линейно разогнать до макс. скорости?
P.S. Функция должна быть не блокирующей.
А поискать по форуму слабо?
Неоднократно давалась ссылка на библиотеку AccellStepper
Про библиотеку уже почитал и потестил, но свой код уже написан, хотел его доработать.
AccelStepper к сожаленью тоже не раскручивает до максимума :(
Придумал, как с помощью tone управлять движком и считать кол-во импульсов.
Нашел метод, который позволяет разогнать движек до 25 об/сек ( частота 10 кГц ).
На один их выходов подаю частоту с помощью tone, он подключен к входу 2, на который подписана функция прерывания. В ней отправляю на нужный выход состояние + считаю импульсы.
Минус - крутиться может только один двигатель - либо все с одинаковой скоростью. Но меня это устраивает.
Придумал, как с помощью tone управлять движком и считать кол-во импульсов.
Нашел метод, который позволяет разогнать движек до 25 об/сек ( частота 10 кГц ).
На один их выходов подаю частоту с помощью tone, он подключен к входу 2, на который подписана функция прерывания. В ней отправляю на нужный выход состояние + считаю импульсы.
Минус - крутиться может только один двигатель - либо все с одинаковой скоростью. Но меня это устраивает.
Если не сложно (и если сохранился) выложите код пожалуйста. Столкнулся с той же проблемой плавного запуска
Если со скоростью проблем нет, то можно использовать библиотеку из комплекта, там вроде реализован планый разгон.
Мне не хватало ее максимальной скорости, либо не до конца разобрался :)
P.S. Постараюсь не забыть на неделе посмотреть код.
Нужно управлять шаговым двигателем, разгоняя и плавно останавливая его.
С помошью 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 шагов в секунду (медицинский, кровь гнать) решил, что это примерно физические границы мотора+контроллера. И решил больше не эксперементировать.
Пришли/выложи код, если не лень, может вместе найдем правильное решение.
-Переписал accelstepper так, что бы он нормально работал. Выпилил оттуда лишний расчет, в итоге поднял максимальную скорость с 4600 в сек, примерно до 12-18 кгц. Правда нельзя теперь "тормозить" по ходу, т.е. пересчет всех показателей делается теперь один раз и когда мотор стоит.
18Кгц не многовато? у меня на 10 КГц максимум работал, хотя двиг какой то крутой был.
Купил генератор, собрал схему с ардуиной, могу плавно менять частоту. Плавно ее поднимаю. Где-то на 8-12 тыс шагов в секунду мотору становится плохо. Вернее сказать он вдруг чихает и встает. И это все практически без нагрузки. Чем больше ограничиваю мотор по току, тем менее стабильно все работает. т.е. на 1 ампере, уже на 4-5 т сбоит.
Генератор не обязательно было покупать, импульсы можно генерировать с помощью ардуины, командой tone.
Пришли/выложи код, если не лень, может вместе найдем правильное решение.
Собственно у меня сейчас работа двигателя сделана так, на один выход подаются импульсы комнадой tone. Выход механически (т.е. проводком) присоединен к входу, на которое можно повесить обработку прерывания. Вешаю обработку прерывания и там указываю на какую ногу подавать импульс и считаю импульсы. В итоге можно разогнать больше чем 10Кгц, но нужно ли? Вроде даже контроллер на расчитан на большую частоту..
Ну а в финале работы оказалось, что видимо у двигателя 2 режима работы: шаг и полушаг (как то так, не помню уже точно), и у меня щас макс.частота 400 Гц и вполне резво гоняет. При нагрузке двигатели 10 Кгц не тянули (опять же вроде)
P.S. Может чтото ошибаюсь по поводу частоты, проект почти 2 года как работает на складе и я им не занимался. Щас смотрю просто константы в исходниках, смутно вспоминаю чтото :)
18Кгц не многовато? у меня на 10 КГц максимум работал, хотя двиг какой то крутой был.
Я - программист. мое дело оптимизировать программу. Когда я убрал косяки автора, то осцилограф стал показывать 18 кгц.
Это важно в первую очередь тем, что теперь длина цикла программы примерно 60 мкс, вместо 250мкс. т.е окно стало больше.и теперь можно помимо собсвтвенно операций с шаговым двигателем еще добавить немного логики в программу.
Купил генератор, собрал схему с ардуиной, могу плавно менять частоту. Плавно ее поднимаю.
Генератор не обязательно было покупать, импульсы можно генерировать с помощью ардуины, командой tone.
Угу. А расскажи как ты плавно умеешь менять частоту. Именно плавно, без сбоев по фазе. У меня мотор должен и 1-2 шага в секунду делать. Новая команда тоне- всегда виден маленький сбой на осцилогафе... А мне надо 100 шагов для разгона/торможения...
И как точно подкатить к определенной позиции. (в общей сложности 2 остановки в секунду)
Ну а в финале работы оказалось, что видимо у двигателя 2 режима работы: шаг и полушаг (как то так, не помню уже точно), и у меня щас макс.частота 400 Гц и вполне резво гоняет. При нагрузке двигатели 10 Кгц не тянули (опять же вроде)
P.S. Может чтото ошибаюсь по поводу частоты, проект почти 2 года как работает на складе и я им не занимался. Щас смотрю просто константы в исходниках, смутно вспоминаю чтото :)
Наверное все таки не двигателя, а контроллера? У меня там можно до 1/16 шага задать. И самый правильный с точки зрения вибрации режим именно 1/2 шага оказался.
Мне кажется, что по частоте ты не ошибаешься. У меня было так же.
Я - программист. мое дело оптимизировать программу. Когда я убрал косяки автора, то осцилограф стал показывать 18 кгц.
Мне было тогда лениво разбираться в библиотеке :) Казалось более простым найти свой способ.
Угу. А расскажи как ты плавно умеешь менять частоту. Именно плавно, без сбоев по фазе. У меня мотор должен и 1-2 шага в секунду делать. Новая команда тоне- всегда виден маленький сбой на осцилогафе... А мне надо 100 шагов для разгона/торможения...
И как точно подкатить к определенной позиции. (в общей сложности 2 остановки в секунду)
Вся фишка в том, что импульс с ножки tone поступает не сразу на контроллер, а на вход в ардуине, которая формирует финальную частоту, тогда вроде таких сбоев не должно быть (хотя я по осцилографу не смотрел)
+ ко всему прочему, т.к. идет прерывание, основной цикл программы никак не влияет на скорость движения.
Вся фишка в том, что импульс с ножки tone поступает не сразу на контроллер, а на вход в ардуине, которая формирует финальную частоту, тогда вроде таких сбоев не должно быть (хотя я по осцилографу не смотрел)
+ ко всему прочему, т.к. идет прерывание, основной цикл программы никак не влияет на скорость движения.
Поясни пожалуйста подробнее, приведи код. Не понимаю.
Моя задача: Проехать от 0 до 1000, встать, вернуться обратно в туже самую точку. Разгон плавный. т.е. на максимальной скорости мотор не успевает разогнаться: 500 шагов ускорения, 500 торможения. В нормальном режиме разгон занимает 40...80 шагов.
Концевик пришлось поставить, но идеально что бы без него. Коррекция сбивает всю динамику. Написал логику так, что бы он корректировал себя в при следующем цикле. т.е. если старт из позиции -2, то 1002 шага. Но как-то оно не стабильно работает.
Добрый день
нужно разогнать 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, объясните пожалуйста как?