Jump to content

    
Sign in to follow this  
baritono

МК на замену Ардуине

Recommended Posts

15 часов назад, baritono сказал:

Сделал прототип специализированного ЧПУ-станка на Ардуине Мега. Всё бы ничего, но проц подтормаживает. Запаздывает управление несколькими шаговиками на приличной скорости и микрошаге, реакция на датчики.

Для Управления шаговыми двигателями ATMega2560 должно быть за глаза достаточно. А если она "тормозит", то это программа так криво написана :).

 

Лично я сталкивалась с похожей проблемой на примере 3D-принтера, для которого пыталась создать свою прошивку, модифицируя фабричную. Для этой цели мне гораздо более понравилась специализированная плата "MKS Gen V1.4", которая представляет собой фактически ту же "Arduino Mega", только уже с готовыми драйверами под шаговые двигатели (5 штук) и питанием под них (12/24V).https://ae01.alicdn.com/kf/H8734bb8aa8d2429b9d7b103543b089d3B/MKS-Gen-V1-4-5-A4988-DRV8825.jpg_960x960.jpg

Она несколько дороже обойдется, чем "Arduino Mega", зато можно купить сразу с драйверами (я покупала в комплекте с A4988), они уже на адаптерах распаяны под DIP16.

Сильно понравилось то, что у этой платы нет той дурацкой Arduino-разводки по краям, а вместо этого выводы контроллера ATMega2560 выведены на многочисленные разъемы различного предназначения.

При желании можно вместе с ней купить еще дисплей TFT28 или TFT32 - в сумме обойдется дешевле, чем покупать по-отдельности, но этого уже я советовать не стану, т.к. дисплеем разочарована.

Сейчас китайских 3D-принтеров развелось тьма тмущая, а потому управляющие платы для них выпускают огромными тиражами, а цены на них соответственно снизились.

 

Теперь о программной части. По-хорошему так надо всю ардуиность из памяти этого контроллера стереть и писать самостоятельно. Т.е. чтобы без всяких скетчей. А главное - никаких таймаутов (!), импульсы для драйверов шаговикам надо создавать таймерами (в крайнем случае по прерыванию), но никак не временными задержками. Тогда при одновременной работе сразу нескольких шаговых двигателей они не будут друг друга тормозить.

 

В продаже часто бывает уменьшенный вариант "MKS Gen L", он чуть дешевле, но покупать его я не советую, хотя для 3D-принтера он вполне годится.

И наконец, бывает еще "MKS Robin" в разных вариантах - там уже STM32F103RCT6 стоит. Однако пишут что они хуже из-за их ... 3-вольтовости :), драйверы от 5 вольт якобы лучше срабатывают.

А STM32H7 на такую работу ставить - полное кощунство :).

Share this post


Link to post
Share on other sites
5 часов назад, baritono сказал:

А почему не STM32H7, он вроде мощнее? Таймеры - штука хорошая, но в Ардуине я вполне обошёлся, эмулируя их софтово.

Таким подходом любой самый мощный МК можно превратить в жуткого тормоза. Меняйте подход, изучайте периферию (таймеры, etc.), иначе и STM32H7 вам не поможет.

Проблема у вас не в МК, а в программисте....

 

5 часов назад, baritono сказал:

Вкусно всё это выглядит. Но тактовая в 3 с лишним раза ниже, чем у STM32H7, несколько смущает. Как и отсутствие аппаратной плавающей точки.

 

"Тактовая", "плавающая точка"... Какое это всё имеет отношение к формированию импульсов частотой ~50КГц?? Да никакого.  :unknw:

Share this post


Link to post
Share on other sites

Меняйте подход, изучайте периферию (таймеры, etc.), иначе и STM32H7 вам не поможет


За счёт чего аппаратные прерывания по таймерам будут существенно быстрее проверок счётчика циклов на кратность константам (мой софтовый "таймер")? И даже если будут, я бы не хотел усложнять систему из-за недетерминированности поведения, необходимости запрета прерываний на ответственных участках и т.п. Так у меня если "таймер" запаздывает, просто выдаётся предупреждение и сообщение (в отладочном режиме) - на сколько именно. А если аппаратный таймер сработал, а прерывания запрещены, потому что другой ещё не обработался - что будет?


"Тактовая", "плавающая точка"... Какое это всё имеет отношение к формированию импульсов частотой ~50КГц??


Частота импульсов, бывает, зависит от вычислений, в т.ч. и динамических с плавающей точкой.

Для этой цели мне гораздо более понравилась специализированная плата "MKS Gen V1.4", которая представляет собой фактически ту же "Arduino Mega", только уже с готовыми драйверами под шаговые двигатели (5 штук) и питанием под них (12/24V).



У меня сейчас аналогичная конструкция, только на Меге с шилдом. Плюс ещё один шаговик мощный, с внешним драйвером.


Теперь о программной части. По-хорошему так надо всю ардуиность из памяти этого контроллера стереть и писать самостоятельно. Т.е. чтобы без всяких скетчей. А главное - никаких таймаутов (!), импульсы для драйверов шаговикам надо создавать таймерами (в крайнем случае по прерыванию), но никак не временными задержками. Тогда при одновременной работе сразу нескольких шаговых двигателей они не будут друг друга тормозить.



Чем плохо делать через скетчи? Си оно вроде и в Африке Си. Таймаутов как таковых у меня нет, вместо этого в начале loop() берётся значение micros() и вызываются "таймеры", время вызова которых подошло. Когда "таймер" завершается, он устанавливает себе время следующего запуска. Движки осей сами по себе может и не тормозили бы, но есть ещё мощный движок с 50KHz пульсом, плавный разгон/останов его, датчики, в дальнейшем возможно придётся ещё ток на ходу мерять и управлять движением. Может быть всё это можно и на Меге сделать, но хотелось бы с запасом и без ухищрений.

Share this post


Link to post
Share on other sites
3 часа назад, baritono сказал:

За счёт чего аппаратные прерывания по таймерам будут существенно быстрее проверок счётчика циклов на кратность константам (мой софтовый "таймер")?

Я разве говорил про "прерывания"? Таймеры умеют генерить импульсы самостоятельно, без ногодрыга.

 

Цитата

Так у меня если "таймер" запаздывает, просто выдаётся предупреждение и сообщение (в отладочном режиме) - на сколько именно. А если аппаратный таймер сработал, а прерывания запрещены, потому что другой ещё не обработался - что будет?

У вас и мышление такое-же - ногодрыгательное. И о ARM-ах продолжаете думать в той же парадигме. Потому и советую менять подход. Иначе - очень скоро разочаруетесь в ARM-ах.

При формировании импульсов с помощью таймеров не нужно думать о задержках выполнения, запрещениях прерываний и т.п. ногодрыгательных проблемах. Вычисления производятся заранее их результаты записываются в DMA-поток идущий в регистры сравнения таймера. И тогда импульсы не будут зависеть от времянок выполнения вычислительного кода CPU.

 

Цитата

Чем плохо делать через скетчи? Си оно вроде и в Африке Си. Таймаутов как таковых у меня нет, вместо этого в начале loop() берётся значение micros() и вызываются "таймеры", время вызова которых подошло.

Плохо то, что как в любом суперлупе у всего кода, выполняющегося в нём, единый приоритет. И если вдруг потребуется обработать какое-то тяжёлое по вычислениям событие (редко возникающее), то оно покорёжит временную диаграмму всего суперлупа - нарушит его работу.

Предположим: вы взяли и переехали на этот самый STM32H7 со своим суперлупом 50кГц, ничего не поменяв в консерватории. Процессор жирный и решили вы: а почему бы не добавить скажем TCP/IP+HTTP (через Ethernet) в проект? Раз уж оно есть в МК. Добавили. И работа 50 кГц суперлупа порушилась. Так как даже STM32H7 при приходе Ethernet-кадра не в состоянии успеть обработать всю иерархию Ehternet-TCP/IP-HTTP за 1/50000 секунд.

А в нормально построенной системе и на гораздо меньших тактовых это не составит проблемы. Потому как нетрудно код разбить на отдельные задачи с разным приоритетом.

Share this post


Link to post
Share on other sites

А почему ТС, если всё время жил с ардуиной на AVR, не обратил внимание на ардуины на основе Cortex-M (если я ничего не путаю, существуют -M3) - вообще вопроса бы не возникло...
Вон уже и -М7 слабеньким кажется и Ethernet замаячил (-8Ж

Edited by Obam

Share this post


Link to post
Share on other sites
Quote

У вас и мышление такое-же - ногодрыгательное. И о ARM-ах продолжаете думать в той же парадигме. Потому и советую менять подход. Иначе - очень скоро разочаруетесь в ARM-ах.


При формировании импульсов с помощью таймеров не нужно думать о задержках выполнения, запрещениях прерываний и т.п. ногодрыгательных проблемах. Вычисления производятся заранее их результаты записываются в DMA-поток идущий в регистры сравнения таймера. И тогда импульсы не будут зависеть от времянок выполнения вычислительного кода CPU.

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


Интересно, на Ардуине Мега такой фичи нет. Но невозможность делать вычисления в реальном времени - это серьёзное ограничение. Не хотелось бы его без крайней необходимости вносить. Может потребоваться, например, регулировать подачу и обороты в зависимости от остроты инструмента. То есть, управлять движением двигателя оси Z и шпинделя, в зависимости момента (тока) на на шпинделе. Как это реализовать без суперлупа или прерываний по таймеру?

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

16 minutes ago, Obam said:

А почему ТС, если всё время жил с ардуиной на AVR, не обратил внимание на ардуины на основе Cortex-M (если я ничего не путаю, существуют -M3) - вообще вопроса бы не возникло...
Вон уже и -М7 слабеньким кажется и Ethernet замаячил (-8Ж

 

Обратил уже в процессе обсуждения, буквально сегодня, внимание на Arduino Portenta на STM32H7. Возможно, это и есть то, что нужно.

Edited by baritono

Share this post


Link to post
Share on other sites
13 часов назад, baritono сказал:

но в Ардуине я вполне обошёлся, эмулируя их софтово.

Ого, это сильно! В плане извращения. Используйте аппаратную периферию, и не забывайте, что любая софтовая эмуляция кушает процессорное время, которого вам так не хватает.

13 часов назад, baritono сказал:

А почему не STM32H7, он вроде мощнее?

Берите сразу Cortex-A, они ещё мощнее)

 

8 часов назад, jcxz сказал:

Проблема у вас не в МК, а в программисте....

+1.

 

5 часов назад, baritono сказал:

в т.ч. и динамических с плавающей точкой.

Какой плавающей точкой? Одинарной или двойной точности? Это я к чему: иные бывает берут Cortex-M4F, а затем пытаются вычислить это

auto result = 3.0 * getMyFloat() ; // getMyFloat возвращает float

И удивляются, почему же их аппаратный сопроцессор для плавающей точки совершенно не задействован компилятором)))

5 часов назад, baritono сказал:

Чем плохо делать через скетчи?

Плохо тем, что вы совершенно "не в зуб ногой" в периферии микроконтроллера, ровно как и в драйверах этой периферии. Вывод делайте сами.

 

5 часов назад, baritono сказал:

Может быть всё это можно и на Меге сделать, но хотелось бы с запасом и без ухищрений.

Вы совершенно неправильно решаете свою задачу) Упираете на мощность МК, и, похоже, что только на вычислительную. А надо брать в расчёт периферию. И тогда даже "хиленький" МК на частоте 102 МГц уделает собрата, работающего на тактовой 400 МГц, но не имеющего периферии. Посмотрите в сторону LPC4337. У него есть прекрасная периферия SGPIO. Не уверен на 100%, но можно до 4 шаговиков ей обслужить. Если, конечно, внимательно прочитать документацию на эту самую периферию и сопутствующую ей (ПДП, таймеры и т.п.).

1 час назад, baritono сказал:

Ардуине Мега

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

Share this post


Link to post
Share on other sites
1 час назад, baritono сказал:

Как это реализовать без суперлупа или прерываний по таймеру?

Вы взялись за решение очень сложной задачи без соответствующей подготовки. Вы хотите прочитать "Война и мир", но читаете по слогам. Хотя надо бы ещё почитать коротенькие детские сказки. Отсюда и все ваши вопросы. Вам бы сначала изучить и поработать отдельно с таймерами, ПДП, портами ввода-вывода, прерываниями и их контроллером, ОСРВ и т.п. Изучить их особенности, прочувствовать каждую из них, и потом бы подобных вопросов просто не возникало. Я понимаю, что в современном мире тратить пару-тройку лет на обучение не круто. Нужно сделать здесь и сейчас. В этом случае вам целесообразнее нанять профессионала, которые решит вам задачу, либо воспользоваться готовой системой ЧПУ.

Share this post


Link to post
Share on other sites
21 minutes ago, MrBearManul said:

Вы взялись за решение очень сложной задачи без соответствующей подготовки. Вам бы сначала изучить и поработать отдельно с таймерами, ПДП, портами ввода-вывода, прерываниями и их контроллером, ОСРВ и т.п. Изучить их особенности, прочувствовать каждую из них, и потом бы подобных вопросов просто не возникало.

Я зарабатываю программированием уже 25 лет, а с опытом постепенно понимаешь преимущества концептуально простых систем. Перестаёшь бросаться использовать всё, что есть, а смотришь на свою конкретную задачу. Которая может и отличаться от типичных, под которые создавалась железка или среда.

Пока я не вижу серьёзных препятствий к тому, чтоб сделать требуемое суперлупе. Поэтому усложнять систему использованием перефирии не хочу. Я не собираюсь  заниматься программированием МК регулярно, поэтому мне удобнее поддерживать такую, понятную мне систему. Если что-то меняется раз в пару месяцев, неудобно копать каждый раз доки API, свой код в старом добром цикле понятнее.

В чём по-вашему особая сложность регулировки оборотов в зависимости от тока? Мгновенного отклика и идеальной точности, как при управлении бесщёточником, здесь не требуется. Должно хватить простенького PID-регулятора.
 

Share this post


Link to post
Share on other sites
2 минуты назад, baritono сказал:

Я зарабатываю программированием уже 25 лет

И что? Без перехода на личности, но огромный стаж совершенно не показатель профессионализма в указанной сфере. К слову, я тоже не первый год разрабатываю встраиваемые системы, если что))

3 минуты назад, baritono сказал:

а с опытом постепенно понимаешь преимущества концептуально простых систем.

А не связано ли это с тем, что вы просто не умеете пользоваться предоставленными ресурсами (периферией), и нарочно всё упрощаете? О простом можно говорить лишь познав сложное. В противном случае вы получаете иллюзию.

5 минут назад, baritono сказал:

Пока я не вижу серьёзных препятствий к тому, чтоб сделать требуемое суперлупе

А пара человек, тоже не новичков в этом области, видит. И даже вам изложили возможные проблемы. Я работал в своё время с "суперлупом", или, правильнее, с главным циклом. Не спорю, что можно и с ним написать программу. Но обычно это требуется, если вы используете микроконтроллер с очень ограниченным количеством ресурсов, и вы проектируете что-то предельно простое, типа удалённого датчика с интерфейсом. Когда же вам дают "жирный" микроконтроллер, ну хотя бы с 128 кБ флеша и 32 кБ ОЗУ с кучей периферии, то суперлуп использовать можно, но неэффективно. Здесь уже пора задуматься об ОСРВ (FreeRTOS, scmRTOS и подобных), т.к. они просто предоставляют более удобные средства для организации тех же самых процессов.

10 минут назад, baritono сказал:

Пока я не вижу серьёзных препятствий к тому, чтоб сделать требуемое суперлупе. Поэтому усложнять систему использованием перефирии не хочу.

При чём здесь "суперлуп" и "использовании периферии"? Это совершенно разные вещи. Периферию можно исопльзовать и с суперлупом и без него, и наоборот. Не использовать периферию - глупо, извините уж за прямоту. Она для того и создана, чтобы не городить софтовые реализации. Давайте вместо аппаратного USART будем городить программный приёмопередатчик (делал такой очень давно, когда действительно не было такой периферии).

14 минут назад, baritono сказал:

Должно хватить простенького PID-регулятора

Ну пробуйте)

Share this post


Link to post
Share on other sites
9 hours ago, MrBearManul said:

А не связано ли это с тем, что вы просто не умеете пользоваться предоставленными ресурсами (периферией), и нарочно всё упрощаете? О простом можно говорить лишь познав сложное. В противном случае вы получаете иллюзию.

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

Share this post


Link to post
Share on other sites
16 часов назад, baritono сказал:

У меня сейчас аналогичная конструкция, только на Меге с шилдом. Плюс ещё один шаговик мощный, с внешним драйвером.

А где вы такой шилд для Arduino Mega раздобыли? Самое дешевое, что вижу у китайцев - это:

https://aliexpress.ru/item/10000066672988.html

но в сумме с ценой за "Arduino Mega" получается заметно больше, чем рекомендованная мной плата "MKS Gen V1.4", где то и другое уже собрано воедино. Кроме того, драйверы шаговых двигателей в состав шилда не входят (их покупать придется отдельно), тогда как "MKS Gen V1.4" можно купить сразу со вставленными драйверами примерно за ту же цену.

 

16 часов назад, baritono сказал:

Чем плохо делать через скетчи? Си оно вроде и в Африке Си.

Плох там не Си (он в Arduino Studio из GCC взят), а встроенные функции, которыми приходится пользоваться. Тогда как у Arduino с этим плохая наследственность - так уж повелось, что Arduino-контроллер (обычно это была ATmega8) использовался, как "автомат", т.е. составлялась таблица его контактов (даже не портов, а именно номеров пинов!), которыми тот мог "дрыгать" (управлять уровнем), и задавалась команда (одна на всю таблицу), которой можно было этот уровень изменять. А дальше  через эту таблицу всё и делали. При замене контроллера на другой заменялась таблица выводов, но всё остальное оставалось без изменений. Отсюда и та всеядность Ардуин ко всевозможным типам контроллеров - там по сути не было ничего, что зависело бы от их архитектуры.

Как это дело обстоит сейчас, я не в курсе, т.к. в современные прошивки не лазила. Полагаю, что UART и USB-СDC все-таки сделаны на аппаратном уровне с использованием предназначенных для этого линий и аппаратной поддержки.

Share this post


Link to post
Share on other sites
12 часов назад, baritono сказал:

Может потребоваться, например, регулировать подачу и обороты в зависимости от остроты инструмента. То есть, управлять движением двигателя оси Z и шпинделя, в зависимости момента (тока) на на шпинделе. Как это реализовать без суперлупа или прерываний по таймеру?

А что - эта самая "острота инструмента" у вас изменяется с такой скоростью, что её нужно именно 50кГц измерять и делать перерасчёт?

Или всё-таки - вполне "за глаза" будет мерять и пересчитывать 100 раз/сек?

Надуманная проблема.

12 часов назад, baritono сказал:

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

Да уж... вот так и рождаются монстро-проекты, где для решения элементарной задачи, с которой справится простейший МК, вкорячивают в разы более конский МК, а то ещё и не один.... :unknw:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this