Страница 1 из 20

Умножитель частоты шагов на STM32

СообщениеДобавлено: 05 дек 2016, 19:01
MX_Master
Иногда встречается необходимость увеличить микрошаг драйвера шаговика. Чтобы сделать работу мотора более плавной и тихой. Для этой задачи нужно сделать так, чтоб ваше ЧПУ и контроллер выдавали наружу больше шагов (импульсов). Для более дорогих контроллеров с этим нет проблем. А вот в бюджетных решениях увеличить частоту шагов проблемно.

Например, вы используете Mach3 или LinuxCNC + программный вывод шагов через LPT порт. Для таких систем вывести на драйвер шаговика больше 50 КГц шагов будет нереально. Тем не менее, сам драйвер поддерживает частоту до 200 КГц. Для более плавной работы мотора нужно хотя бы 150 КГц на выходе. Как раз для таких случаев и нужен умножитель частоты шагов. Он получает на вход STEP/DIR сигналы от контроллера, умножает их на указанное число и выводит наружу. К примеру, если на входе была частота шагов 36.21 КГц, то на выходе будет ровно 108.63 КГц. Думаю, принцип понятен.

В начале я сделал прошивку для STM32F407VET6. Такие макетки продаются на АЛИ по 10$. Но в природе есть и более бюджетные модели. Например, синяя пилюля с STM32F103C8T6. Всего 2$, зато сколько удовольствия ;D Окончательный вариант прошивки заточен именно под синюю пилюлю (см. фотки).

Максимальное кол-во осей step/dir - 4.
Максимальная частоты вывода шагов - 1 МГц.

Исходники проекта можно посмотреть здесь - https://github.cnc32.ru/MX_Master/steps-frequency-multiplier
Готовые прошивки выложу чуть позже, всё там же.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 19:07
aftaev
MX_Master писал(а): поднять частоту STEP/DIR на участке между контроллером (или платой развязки) и драйверами моторов.

Не совсем понятно зачем это нужно?

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 19:19
MX_Master
aftaev писал(а):Не совсем понятно зачем это нужно?

Все, что у меня есть, выдает на выходе не больше 30 КГц, в том числе и ПК с LCNC. Для плавной и быстрой работы ШД нужен весьма мелкий микрошаг и, соответственно, чуть больше STEP'чиков, хотя п до 200 КГц (лимит драйвера). Плюс, может кому-ньть кроме меня в быту пригодится.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 20:01
Mamont
MX_Master писал(а):
aftaev писал(а):Не совсем понятно зачем это нужно?

Все, что у меня есть, выдает на выходе не больше 30 КГц, в том числе и ПК с LCNC. Для плавной и быстрой работы ШД нужен весьма мелкий микрошаг и, соответственно, чуть больше STEP'чиков, хотя п до 200 КГц (лимит драйвера). Плюс, может кому-ньть кроме меня в быту пригодится.


А какой у тебя драйвер двигателей?

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 20:08
aftaev
MX_Master писал(а): в том числе и ПК с LCNC.

Если на ПК собрать Pluto-P мож по шустрее будет чем городить что то непонятное на Ардуине ;)

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 20:53
MX_Master
Mamont писал(а):А какой у тебя драйвер двигателей?

DQ860MA
aftaev писал(а):Если на ПК собрать Pluto-P мож по шустрее будет чем городить что то непонятное на Ардуине

Дуинка это чисто на "попробовать". Тут скорее было интересно разобраться с МК и разработкой под них.
Первый блин, так скать (:
У меня брат - электроник, а я прогер. И было бы неплохо объединить эти две области.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 20:58
Сергей Саныч
А про Степмастер забыли? Или он не входит в категорию "бюджетных"?

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 21:20
MX_Master
Сергей Саныч писал(а):А про Степмастер забыли? Или он не входит в категорию "бюджетных"?

Это был первый вариант в поисках истины (: Я уважаю работу Михаила. Он создаёт сами платы и разработал под них свой софт. Цена адекватная. Но моя цель не в покупке готового решения, а в превращении любой сподручной платки с МК в полезное ЧПУ устройство, просто средствами прошивки. Если на этих Мегах2560 даже GRBL софт пашет, то простой фильтр сигналов тоже должен уместиться.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 21:32
selenur
Может попробовать тебе посмотреть на STM32 микроконтроллеры?
Например с 8-ми битными AVR микроконтроллерами я знаком хорошо, и для получения максимальной скорости, я пользовался ассемблером, но сейчас используя stm32f103c8t6 мне уже абсолютно не нужно просчитывать такты процессора, для получения желаемого результата, теперь даже не оптимизированный код работает сверх быстро...
Хотя конечно обилие регистров в STM немного пугает после AVR, но обычно и не стоит задача использовать по максимуму всю периферию микроконтроллера.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 22:09
UAVpilot
Обилие регистров почти не заметно, если пользоваться CubeMX и HAL.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 22:13
selenur
UAVpilot писал(а):Обилие регистров почти не заметно, если пользоваться CubeMX и HAL.

Не ну я конечно этим пользуюсь, поэтому и получается легко делать всякую чепуху, но не дает покоя осознание того, что непонятно как работает внутри... вот и лезешь разбираться... :-)

Вот к стати благодаря этому каналу, познавал STM32: https://www.youtube.com/user/Sappise

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 22:18
UAVpilot
Так исходники HAL включаются в проект и можно легко глянуть кишочки любой функции.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 22:30
MX_Master
selenur писал(а):Может попробовать тебе посмотреть на STM32 микроконтроллеры?
Например с 8-ми битными AVR микроконтроллерами я знаком хорошо, и для получения максимальной скорости, я пользовался ассемблером, но сейчас используя stm32f103c8t6 мне уже абсолютно не нужно просчитывать такты процессора, для получения желаемого результата, теперь даже не оптимизированный код работает сверх быстро...
Хотя конечно обилие регистров в STM немного пугает после AVR, но обычно и не стоит задача использовать по максимуму всю периферию микроконтроллера.

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

Код: Выделить всёРазвернуть
out_pin_cur ^=
    ( (-GET_BIT(buf[ buf_out_pos[axis] ], step_bit[axis])) ^ out_pin_cur ) &
    ( 1 << step_bit[axis] );

Всё это для экономии места в оперативке под выходной буфер. В общем, я убедился, что 8 кб оперативки это чудовищно мало для REALTIME обработки! 20 кб у stm32f103c8t6, конечно, улучшат положение, но это ведь тоже немного. Стал присматриваться к 196 Кб на макетках с STM32F407VET6, цена, благо, не кусается.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 22:38
UAVpilot
MX_Master писал(а):Всё это для экономии места в оперативке под выходной буфер.

Твой код лежит во флеше, а не в ОЗУ.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 05 дек 2016, 23:07
MX_Master
Буффер как раз в ОЗУ, т.к. он глобален, как и прочие вспомогательные массивы. Из 8кб при работе занято 5. Про флэху тут речи не было, бинарник в 2 кб вполне в ней поместится (:

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 06 дек 2016, 00:03
selenur
Я в некоторых проектах использую вот такую http://www.st.com/en/evaluation-tools/3 ... overy.html в ней есть внешняя память на 64 мбит, работать с памятью легко, скорость огромная....

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 06 дек 2016, 12:13
UAVpilot
MX_Master писал(а):Буффер как раз в ОЗУ, т.к. он глобален, как и прочие вспомогательные массивы. Из 8кб при работе занято 5. Про флэху тут речи не было, бинарник в 2 кб вполне в ней поместится (:

Внимательно следи за буквами: твой буфер размещается в ОЗУ, программный код во флеше. Уменьшение размера кода сократит место занимаемое во флеше и никак не повлияет на место, занимаемое в ОЗУ.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 06 дек 2016, 12:20
Mamont
А ниче что вы одно и тоже написали уже 4 раза?

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 06 дек 2016, 12:22
Сергей Саныч
UAVpilot писал(а):буфер размещается в ОЗУ, программный код во флеше
Предполагаю, что это сделано для экономии места в ОЗУ путем рациональной организации хранения данных. Чтобы, скажем, один пиксел черно-белой картинки занимал один бит, а не, скажем, целый байт.

Re: Умножитель STEP/DIR на Arduino

СообщениеДобавлено: 06 дек 2016, 12:26
UAVpilot
selenur писал(а):Я в некоторых проектах использую вот такую http://www.st.com/en/evaluation-tools/3 ... overy.html в ней есть внешняя память на 64 мбит, работать с памятью легко, скорость огромная....

А эта память может отображаться в общее адресное пространство МК, чтоб её можно было использовать под переменные? В доках не нашёл ничего про это...