17.02.2016, 20:02
|
|
Частый гость
Регистрация: 15.01.2008
Сообщений: 34
Сказал спасибо: 16
Сказали Спасибо 1 раз в 1 сообщении
|
Нелинейное перемещение шагового двигателя
Здравствуйте.
Есть привод от матричного принтера с шаговым двигателем.
Приладил к шаговому двигателю драйвер из четырёх кт815. Ключами управляет Atmega.
Алгоритм движения такой:
Шаг 1 (подаём питание на обмотку А), пауза, питание на обмотке А выключается.
Шаг 2 (подаём питание на обмотку В), пауза, питание на обмотке В выключается.
Шаг 3 (подаём питание на обмотку С), пауза, питание на обмотке С выключается.
Шаг 4 (подаём питание на обмотку Д), пауза, питание на обмотке Д выключается.
и дальше опять шаг 1.
Т.е. всё понятно - прямолинейное движение в одну сторону.
Стало скучно и захотелось это движение (а точнее скорость движения) сделать нелинейным, а именно если требуется скажем 100 шагов сделать то у первого шага (а также у последнего) пауза самая большая, у следующего шага чуть меньше, у 50-го шага пауза самая минимальная и потом снова на увеличение.
Что то типа "экспоненциального" закона изменения - или даже что-то типа "параболического" движения.
Т.е. нужна функция, в которую бы мы заходили, передавали 2 параметра это полное количество шагов при перемещении, и номер шага.
Не знаю правильно и понятно ли объясняюсь но хочу чтобы двигатель стартовал с минимальной скоростью (максимальная пауза), и ускорялся, посредине движения скорость была максимальная (минимальная пауза),а потом пауза вновь бы увеличивалась.
Т.е. можем заведомо задать минимальную скорость (максимальную паузу шага - 4000 uS), и максимальную скорость (минимальную паузу - 2000 uS).
Как такую функцию сделать и нужно учесть что количество шагов может быть как чётным так и нечётным.
Есть какие-либо мысли? Сам в программировании не очень силён sad.gif
Спасибо!
|
|
|
|
17.02.2016, 20:21
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя.
Сообщение от raptor376
|
Есть какие-либо мысли?
|
Нужно изменять частоту сигналов коммутации обмоток.
А вообще, вначале читаем о том, как в принципе управляются шаговые двигатели, что такое шаг, полушаг, микрошаг, где находится точка равновесия ротора при снятии питания со всех обмоток, как выполняется торможение мотора, какие бывают особенности при разгоне мотора под нагрузкой.
Ну а изменить скорость ШД - это уже плевое дело, нужно просто изменять частоту переключений управляющих сигналов.
Програмно это делается например на основе какого-нибудь таймера, изменяя период его счета. Значения, самое простое, брать из таблицы с заранее просчитанными цифрами.
Последний раз редактировалось NewWriter; 17.02.2016 в 21:59.
|
|
|
|
18.02.2016, 13:09
|
|
Частый гость
Регистрация: 15.01.2008
Сообщений: 34
Сказал спасибо: 16
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Нелинейное перемещение шагового двигателя.
Сообщение от NewWriter
|
Нужно изменять частоту сигналов коммутации обмоток.
|
Логично, но я об этом и пишу... частота и время обратно зависимые величины (частота и период), я же писал:
___
Алгоритм движения такой:
Шаг 1 (подаём питание на обмотку А), пауза, питание на обмотке А выключается.
Шаг 2 (подаём питание на обмотку В), пауза, питание на обмотке В выключается.
Шаг 3 (подаём питание на обмотку С), пауза, питание на обмотке С выключается.
Шаг 4 (подаём питание на обмотку Д), пауза, питание на обмотке Д выключается.
и дальше опять шаг 1.
___
Сообщение от NewWriter
|
это делается например на основе какого-нибудь таймера, изменяя период его счета. Значения, самое простое, брать из таблицы с заранее просчитанными цифрами.
|
Собственно пришли к тому же самому...
Дак вот я и поставил вопрос о том, как сделать такую подпрограмку, в которую я захожу с двумя параметрами (полное количество шагов в конкретном перемещении, и номер шага). Минимальная скорость, и максимальная - уже определена, это время 4 мс (минимальная) и 2 мс (максимальная).
Нужно чтобы из подпрограммки я выходил с одним числом в этом диапазоне, согласно "экспоненциальному/ или параболлическому закону.
Про шаговый двигатель можно просто опустить а вопрос лишь в такой подпрограммке.
Из таблицы? Хм... представьте что шагов в перемещении может быть и 10 и 1000, и неужели для каждого делать таблицу... и для каждого шага.
|
|
|
|
18.02.2016, 13:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя.
Сообщение от raptor376
|
Стало скучно и захотелось это движение (а точнее скорость движения) сделать нелинейным
|
Сообщение от raptor376
|
Минимальная скорость, и максимальная - уже определена, это время 4 мс (минимальная) и 2 мс (максимальная).
|
Однако, довольно своеобразная у вас скука! Вместо размытого полета фантазии - довольно конкретизированная постановка задачи. Похоже, что скука была не у вас, а у вашего заказчика.
Сообщение от raptor376
|
2 параметра это полное количество шагов при перемещении, и номер шага.
|
Сообщение от raptor376
|
с двумя параметрами (полное количество шагов в конкретном перемещении, и номер шага)
|
Вы уже второй раз употребляете термин "номер шага". Что это означает, применительно к данной задаче?
Сообщение от raptor376
|
Что то типа "экспоненциального" закона изменения - или даже что-то типа "параболического" движения
|
Это довольно сложная задача, требующая большого количества вычислений. При этом на некоторой скорости может оказаться, что для вычисления длительности следующего шага процессору не хватает времени. И надо будет или применять суперскоростной процессор, или вернуться к рассмотрению варианта с таблицами.
Есть достаточно много современных процессоров, у которых объем ОЗУ позволяет легко разместить таблицу такого объема. И даже процессор со средней производительностью легко сможет сначала рассчитать всю таблицу по заданному количеству шагов. А потом ему останется лишь брать готовые числа из таблицы, и играючись управлять шаговиком.
|
|
|
|
18.02.2016, 14:07
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя.
Так в том и фишка, что вычисления провести на калькуляторе и подставить в таблицу уже вычисление значения периода на этапе изменения скорости. Известно же, что самый быстрый способ - табличный. Много значений не потребуется. Вернее, зависит от многих факторов - нагрузка на валу двигателя, его мощности и момента, ускорения разгона...
У топикстартера неправильное понимание логики процесса.
В работе ШД есть 3 фазы - разгон, постоянная скорость и торможение.
На постоянной скорости период переключения сигналов постоянно и не зависит от числа шагов.
Во время разгона и торможения период сигналов будет меняться. Вот эти значения и берутся из таблицы, ну чтобы не вычислять их аппаратно.
Допустим, поступила команда повернуть ШД на 300 шагов. Делим эти 300 шагов на 3 этапа - разгон, пост.скорость и торможение. Например, 30 шагов занимает разгон, период переключенияберём из таблицы. Затем крутим с постоянной скоростью до (270-30) шагов и переходим снова к той же таблице, только наоборот.
Цитата:
|
вопрос о том, как сделать такую подпрограмку, в
|
Я думаю, навряд ли кто будет писать эту программку за топикстартера. Если он "от скуки" страдает, то всё должен сам осуществить
Последний раз редактировалось NewWriter; 18.02.2016 в 14:15.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
18.02.2016, 14:16
|
|
Прописка
Регистрация: 04.12.2010
Сообщений: 243
Сказал спасибо: 9
Сказали Спасибо 51 раз(а) в 32 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя.
Даа, скука может превратится в головняк
...вот здесь https://yadi.sk/d/UkTGNpTgp3pxb с 18 страницы Вашу скуку быстро разгонит
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Pajatel за это сообщение:
|
|
|
18.02.2016, 21:02
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя
Сообщение от raptor376
|
Собственно пришли к тому же самому...
Дак вот я и поставил вопрос о том, как сделать такую подпрограмку, в которую я захожу с двумя параметрами (полное количество шагов в конкретном перемещении, и номер шага). Минимальная скорость, и максимальная - уже определена, это время 4 мс (минимальная) и 2 мс (максимальная).
|
Всем привет.
Я думаю, что это можно реализовать не очень сложно.
Просто опрашиваем таблицу по прерыванию таймера, а для управления частотой просто записывать начальное значение таймера при выходе из прерывания (а может быть и при входе, мне кажется, что так не будет влиять на длительность между прерываниями величина программы прерывания).
И чем чаще вызывается прерывание, тем выше будет частота.
|
|
|
|
19.02.2016, 00:03
|
|
Временная регистрация
Регистрация: 17.01.2010
Сообщений: 60
Сказал спасибо: 3
Сказали Спасибо 31 раз(а) в 19 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя
Непонятная задача. Зачем иметь максимальную скорость только посередине? Первые несколько шагов (2,5,75 - от механики зависти) - разгон, потом постоянно (хоть один шаг, хоть тысяча) максимальная скорость, за несколько шагов до конца - обратная картина. А в исходной постановке задача скорее академический интерес представляет, как сделать ненужное...
|
|
|
Сказали "Спасибо" Харрисон
|
|
|
19.02.2016, 00:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя
Шаговик может разгоняться мгновенно (как на матричном принтере), с постоянным ускорением (скорость нарастает линейно; при включении ускорения/замедления возникают рывки), с линейно изменяемым ускорением (нет рывков: можно таскать налитый до краёв стакан, сложная математика). Практически широко применяется т.н. S-кривая разгна: постоянное ускорение с фиксированным участком линейного нарастания). Ещё важно, не изменится ли конечная точка в процессе движения? Тогда траектория сначала рассчитывается, потом исполняется. Если не так, то нужно считать в процессе движения и может не хватить времени.
Для начала можно реализовать алгоритм движения с постоянным ускорением.
Когда станете переходить от скорости двигателя к времени таймера, придёте к функции 1/(корень из координаты=номер шага). Физика простая: ускорение постоянно, скорость изменяется линейно, координата - квадратично. И увидите, что двухбайтовый таймер не очень-то обеспечивает диапазон частот при нужной точности.
Я запоминал таблицу разгона (время таймера от номера шага), сделанную в Excel'e, в памяти программы. Поскольку параметр изменяется сначала очень быстро, а потом всё медленнее, экспоненциально приближаясь к максимальной скорости, таблица хранилась в свёрнутом виде парами {время шага : количество шагов с таким временем}, 900 шагов укладывалось в несколько десятков пар с точностью 0,5%.
Дальше разгон - движение на максимальной скорости - торможение, пробегая по таблице вперёд-назад. Но у меня в любой момент движения может поменяться целевая точка, как "убежать" вперёд, так и приблизиться, вплоть до изменения направления. Контроллер Atmega32.
Последний раз редактировалось makakus; 19.02.2016 в 00:44.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо makakus за это сообщение:
|
|
|
19.02.2016, 00:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Нелинейное перемещение шагового двигателя
Сообщение от Харрисон
|
Зачем иметь максимальную скорость только посередине? Первые несколько шагов (2,5,75 - от механики зависти) - разгон, потом постоянно (хоть один шаг, хоть тысяча) максимальная скорость, за несколько шагов до конца - обратная картина.
|
Именно. Потому что максимальная скорость диктуется шаговиком и присобаченной к нему механикой. Ну и правильным драйвером, конечно.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:21.
|
|