Marlin: управление шаговыми двигателями

Подписаться на 3Dtoday
SergeyR7
Идет загрузка
Загрузка
17.07.18
4651
57
печатает на Flyingbear P905
Техничка
28
d1904b09e095b3693459c67dac4e9e76.png
Как выяснилось, прошивка Marlin не совсем честно управляет шаговыми двигателями. При увеличении частоты импульсов для шага, нарушается равномерность (период) импульсов.

Про разгон/торможение не буду рассказывать. Подключил осциллограф к пину STEP и гонял отключённый мотор с разной скоростью через Repetier-Host. У меня в настройках установлено 100 шагов на 1 мм. Считать скорость импульсов удобно - скорость 10 мм/с соответствует 10*100 = 1000 импульсов в секунду, т.е. частота импульсов 1 кГц. И наоборот - 5 кГц соответствует скорости перемещения 5000/100 = 50 мм/сек.

Начал с низкой скорости перемещения. Выставил 50 мм/сек и увидел что и ожидалось:
4f98deb2efb16cefb51dddf6376478d7.png
Только частота импульсов примерно 4 кГц, т.е. реальная скорость 40 мм/сек. Это объясняет несоответствие расчётного времени печати в слайсере и реального времени печати. Аналогичная ситуация и на скорости 80 мм/сек - реальная скорость печати 64 мм/сек… Поднимаю скорость, 100 мм/сек - реально 79 мм/сек:
b194a429085744e3d2dab371a0d2c20c.png
Поднимаю скорость до 130 мм/сек и тут я удивился:
14c5543be8f322fc46c6e5723d1edef0.png
Импульсы пошли пачками по два. Период пачек 193 мкс - частота пачек 5.18 кГц. Умножаем частоту на 2 (два импульса в пачке) получаем 103,6 мм/сек.
Дальнейшее повышение скорости перемещения выглядит также: 180 мм/сек соответствует 7,19 кГц * 2 - это 14380 импульсов в секунду (143 мм/сек).

Формально, количество импульсов соответствует (немного с занижением) скорости перемещения, но фактически, это может привести к искажению печатаемой модели. Если для перемещения печатающей головки на таких скоростях это сильно может не повлиять из-за инерции, то на экструдере это может привести к неравномерной подачи прутка. В зависимости от драйвера, этот эффект может сгладиться, например, если драйвер делает аппроксимацию микрошагами (1/128) и контроллирует реальное вращение вала. Если простой драйвер, например, A4988 - тут теряем момент на валу двигателя и можем получить пропуск шагов.

Если посмотреть в прошивку:
b4d18b696317a2b0353d874ad18f741e.png
Измерения подтверждаются кодом - для частоты импульсов от 10 кГц до 20 кГц получаем пачки по 2 импульса. Если частота выше 20 кГц - в пачке 4 импульса.

Из этого можно сделать следующий вывод:
При выборе количества микрошагов (1/16, 1/32, 1/128 и т.п.) нужно проверять, что пачки импульсов не повлияют на результат. Особенно это критично для экструдера. Если выбрать 1/128 микрошаг на драйвере экструдера, то предельная максимальная скорость вычисляется из ограничения частоты импульсов в 10 кГц. У экструдера без редуктора, на один оборот 200 шагов (если шаг двигателя 1,8 градусов).
Предельная скорость вращения вала экструдера 10000 Гц / (200 * 128) = 0,390625 оборотов в секунду, если превысить эту скорость, то возможно появление волн и т.п. - подача пластика будет пульсирующей.
Шестерёнки у всех разные - скорость подачи прутка можно пересчитать из скорости оборотов, зная диаметр шестерёнки. Это примерный расчёт, т.к. соотношение скорости подачи прутка и диаметра шестерёнки может зависеть от силы прижима и других параметров.

Итог такой: толще сопло - крупнее микрошаг. Сравнивать дроби - 1/16 больше, чем 1/128, т.е. крупнее.
Подписаться на 3Dtoday
28
Комментарии к статье

Комментарии

17.07.18 в 13:16
3
Агааа, было дело
http://3dtoday.ru/blogs/eta4ever/marlin-and-mega-the-frequency-of-the-step-signal/

С другими прошивками еще сравнение просится.
17.07.18 в 13:26
2
С другими прошивками еще сравнение просится.
В репетиере такое поведение задаётся каким-то #define (или, при конфигурировании на сайте, какой-то галочкой в конфигураторе на сайте), его можно вырубить.

из статьи
Измерения подтверждаются кодом - для частоты импульсов от 10 кГц до 20 кГц получаем пачки по 2 импульса. Если частота выше 20 кГц - в пачке 4 импульса.
quadstepping в репетиере управляется аналогично
17.07.18 в 13:30
1
Про сравнение думал, но у меня только одна плата и перепрошивать на другие прошивки пока не планирую. Интересно посмотреть на закрытых прошивках (Lerdge и др.), но это если только попросить тех, у кого есть эти платы и есть осциллограф или даталоггер.

Ещё интересно как в клипере это выглядит...
17.07.18 в 14:14
4
я думаю, что на 32битных платах достаточно вычислительной мощности чтобы quadstep там был попросту не нужен.
репитер на Due дает 80000 степов/сек без дабл степпинга https://forum.repetier.com/discussion/1512/double-quadstepping-setup

с клиппером, я уверен, тоже все ок
17.07.18 в 18:30
0
Про эту "фичу" я давно знал, но времени ковырять не было - вопрос, лимит в 10к импульсов в секунду это на одну ось или по сумме ?
17.07.18 в 19:04
1
Как я понял - это на каждый мотор. Если подключён расширитель на несколько экструдеров - там немного по-другому, но проверить этот вариант я не могу.
17.07.18 в 13:28
1
Поучительная информация....
17.07.18 в 13:51
2
Ограничение 8 битных платок, такого нету разьве что у Klipper, все остальные так делают, иначе просто успевать не будут.
17.07.18 в 13:53
3
ну так это известная тема что марлин (и репитер) не успевает обрабатывать в синг-степ режиме (1 степ за 1 прерывание) более 10000 степов/сек (на меге).
поэтому там есть double-step и quad-step режимы.
https://softsolder.com/2013/06/04/marlin-firmware-stepper-interrupt-timing/
и эти прошивки могут обрабатывать до 40000 степов/сек (ну может по мере улучшения кода чуть больше. и может репитер чуть быстрее)

а тиакап считает все в целых числах и умеет 53000 в сингл степ https://reprap.org/wiki/Step_rates
правда на меге 20МГц, что на 16МГц будет примерно 42400

а клиппер вроде как умеет на меге 16МГц 150000 (1 мотор) или 100000 (3 мотора одновременно) степов/сек
https://github.com/KevinOConnor/klipper/blob/master/docs/Features.md
17.07.18 в 14:23
1
Для меня это было открытие :)
Я искал решение для управления 8-ью моторами (цветная печать на 5 экструдеров) и разбирался где и как ими управляют.
Мне нужно синхронное управления всеми моторами и всякие дабл степы неприемлемы, т.к. нужно смешивать цвета.
17.07.18 в 14:27
1
Эм. А каких скоростей вы хотите добиться на экструдерах, чтобы выйти за синглстеп?
17.07.18 в 14:38
2
Скорость печати хотелось бы получить не меньше 100 мм/сек. На экструдерах планирую ставить редуктор и драйвера с микрошагами 1/64 и меньше. Мелкий шаг нужен чтобы можно было точно дозировать каждый цвет. Это с одной стороны. С другой стороны, если печатать только одним цветом, например, белым, то вся подача пластика пойдёт с одного экструдера и тут я попадаю на большую частоту импульсов... Пока всё в теории. В моём случае, нужен синглстеп на всём диапазоне скорости подачи прутка.
17.07.18 в 14:40
2
То есть, в цифрах диапазон скорости движка экструдера — не считали? А то, может, и хватит.
17.07.18 в 15:18
6
Посчитал. Скорость печати 100 мм/сек. Сопло 0.6, слой 0.3, редуктор 1:3, микрошаг 1/64, диаметр шестерёнки 10.8 мм, диаметр прутка 1.75 мм.
Получаю 1130 импульсов на 1 мм прутка. Скорость подачи прутка примерно 7.5 мм/сек
Итого: 8475 импульсов в секунду. Уже предел.
Если микрошаг 1/128 или меньше или скорость поднять - нужен двойной запас по скорости.
17.07.18 в 15:20
3
Во, так уже убедительно.
18.07.18 в 10:28
1
Немного поправлю
Сопло 0.6, слой 0.3
Как правило ширина экструзии не равна диаметру сопла, следовательно она будет больше, отсюда следует, что вам еще больший запас скорости нужен. В общем да, согласен с другими, что надо бы вам 32 бита. Если хотите использовать Марлин, то - Ре-АРМ+РАМПС или Ардуино ДУО+РуРАМПС.
17.07.18 в 15:02
2
переходите сразу на 32 бита, там и конфиг проще менять - не надо каждый раз перепрошивать плату.
17.07.18 в 15:19
1
Я больше склоняюсь к своей прошивке на 32 бита
17.07.18 в 14:54
3
клиппер умеет поддерживать несколько плат одновременно. он постоянно синхронизирует часы между ними так что движения не разъезжаются. если поднать на малинке/апельсинке 2 ком порта - то можно подключить допустим 2 меги с 2 рампсами.
на один повесить 3 оси и концевики. на второй - экструдеры. на который повесить нагрев и обдув (или вообще третий поставить:) - по вкусу.
17.07.18 в 15:22
1
Спасибо за информацию, клиппер ещё глубоко не копал, но смотрю в его сторону или его аналоги.
17.07.18 в 17:03
1
я правда все это представляю чисто теоретически.
но цена вопроса (эксперимента) без драйверов, имхо, с клиппером всего то до $50.
2 меги от $7 шт, 2 рампса v1.4 от $3.5 шт, ну и апельсинка от $10 шт за зеро. возможно зеро не хватит, и нужно что-то чуть круче. возможно еще нужны преобразователи уровней на ком порты.
и есть шансы на успех, что это все заработает
17.07.18 в 17:25
0
У меня эти эксперименты растянутся на долго.
По цене всё это намного дороже получается. Например, нужно 5 экструдеров с редуктором, 5 моторов (тонкие 22 мм). Печатающую головку ещё разработать надо и её фрезеровать (заказывать). Ну и ещё 5 катушек пластика разного цвета... Это только начало.
С электроникой проще - всё есть, только платы разработать и заказать.
Основная работа в этом проекте - программирование.
Стараюсь не покупать того, что не понадобится. Например, печатающие головки 3-in 1-out и т.п.
17.07.18 в 18:20
1
не, ну понятно, что еще стоимость драйверов, механики и прочего. это возьмет свои деньги при любом раскладе

просто если делать на попробовать концепцию или для себя на один раз, за минимум времени - то, имхо, готовый клиппер + дешевая электроника - самое то.
или альтернативный вариант проверки (более традиционный, без клиппера) - взять какую-нить 32 битную плату. ту же дуе. и к ней приваять 8 отдельных платок для драйверов и есть платки с мосфетами
из готовых плат на 8 драйверов я знаю только http://www.panucatt.com/Azteeg_X3_Pro_p/ax3pro.htm
но она опять же на меге. и как-то 135 долларов за "аналог" 2 мег и 2 рампсов не заводят.

заморачиваться своей платой + писать (даже адаптировать) под эту свою плату еще и свою прошивку - тут замах никак не меньше чем на серийный выпуск принтеров :)
нужно недюженную мотивацию + вагон времени и терпения.
тем не менее, если бы я озадачился такой темой - возможно в перую очередь пощупал бы https://reprap.org/wiki/RepRap_Firmware
17.07.18 в 18:59
1
У меня это хобби. Времени нет, но мозг покоя не даёт :)
Делаю для себя, но если это будет интересно и/или полезно другим - ещё больше мотивирует.

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

Например, идею для синхронного управления шаговыми двигателями с большой частотой импульсов, проверял на Cortex-M0 на 48МГц:
638f256279e4a2ea88727f9171f903dc.jpg


Разрешающая способность - 1 мкс на 16 каналов, т.е. на 8 моторов (сигналы DIR и STEP).
Это на любом канале сигнал может появится с дискретностью 1 мкс. Не зависимо от остальных. Но аппаратно это получилось, а вот обеспечить программно такой поток данных (16 Мбит в секунду) на этом контроллере уже не получится. Поэтому я начал с определения необходимого диапазона частоты импульсов. И марлин был под рукой.
17.07.18 в 18:32
1
кстати есть вот вроде как бы то что нужно
http://www.gh-enterprise.it/
http://blog.st.com/speedy-board-and-stm32f4-its-a-faster-world-for-3d/
но продается ли оно и цену даже сложно представить
17.07.18 в 19:01
0
Я к аналогичной плате и прихожу. Только опять вопрос с прошивкой и цветной печатью...
17.07.18 в 21:29
1
нужно 5 экструдеров с редуктором
https://www.thingiverse.com/thing:1620634
Я не думаю что у вас будет директ )))
Но этот дешево и сердито. Пластик давит так что (у автора есть еще и сам механизм подачи, очень прикольный и качественный, флексы как к себе домой, ни разу не ловил затор) если раньше я не мог печатать этим пластиком при 210 (щелкал экструдер), то сейчас и при 190 можно )))
17.07.18 в 22:40
1
Спасибо, я ещё такой вариант рассматривал, а у этого и редуктор 5:1.
Да, Вы правы - будет боуден. :)
18.07.18 в 07:16
1
я ещё такой вариант рассматривал
Тоже прикольный.
17.07.18 в 21:25
2
клиппер умеет поддерживать несколько плат одновременно
ВОт это поворот! Надо срочно выбивать время на изучение клиппера.
17.07.18 в 16:04
2
Сразу в Избранное, Благодарю!

Аналогия - такая:

d72b024c6bdc212d8dfd289c5536fca1.jpg
17.07.18 в 16:34
0
Аналогия - такая:
А как же быть с поговоркой "больше скорость - меньше ям?" :)
17.07.18 в 16:37
0
Тут с точностью наоборот - больше скорость больше ям :)
17.07.18 в 17:23
0
Скажите, а вы на гитхаб прошивки написали о проблеме? Или как обычно, всем рассказали,все обсудили а воз и нынче там. Просто сейчас делается крупный апгрейд Bugfix2.0 в который желательно внести вашу поправку если только она уже не там
17.07.18 в 17:26
3
Это не проблема. Так сделано, чтобы дать больше импульсов STEP при частоте прерываний в 10 КГц.
17.07.18 в 17:29
0
Это не бага - это фича. Просто, я о ней не знал.
17.07.18 в 17:34
-1
Это больше баг, я считаю что нужно вынести это в настройки конфига. Сделайте запись в ISSUE или Pull Request
17.07.18 в 17:43
2
Разработчики прошивок этот "баг" мучились, реализовывали, а вы сейчас ходите эту фичу под корень вынести? ;-)
Это было специально сделано...
17.07.18 в 17:51
1
Для меня это тоже больше баг, но изменить концепцию marlin по управлению шаговыми двигателями я не смогу. Для большинства применений этого достаточно.
17.07.18 в 18:24
1
Мне кажется, что выключить эту фичу в коде не так сложно... но я пока не понимаю, как это скажется на всем остальном... впрочем, раньше же этого не было и как-то печатал народ :-)

Насколько я помню, первый, кто это включил, был Repetier. И звук двигателей на его прошивке существенно отличался в лучшую сторону и печаталось, как-то "мягче", ровнее... потом это и в Marlin внедрили... как-то так...

Но вы правильно говорите... это надо было раньше такие хитрости применять, на старых драйверах и на 8 битах... сейчас наверное это уже не столь актуально.
17.07.18 в 19:06
2
Выключить можно, только прошивка не может выдать импульсы с большей частотой и с правильным периодом импульсов.
17.07.18 в 19:46
0
вообще-то в марлине еще и была проблема с неравномерностью импульсов между прерываниями.
но пришел желающий и переписал им там много чего https://github.com/MarlinFirmware/Marlin/pull/10688
вроде приняли они это в марлин 2.0
17.07.18 в 20:36
0
Да, в 2.0 там сильно оптимизировали и лучше должно работать. Но принцип генерации импульсов управления моторами остался тот же.
17.07.18 в 18:46
2
Я бы сказал, что тема слегка перегрета.
ШД в механике наших принтеров стоят на входе кинематических цепей. Что-то интегрируется (сглаживается) инерцией ротора ШД, затем натягиваются ремни, которые скорее резиновые в икромасштабах обсуждаемых эффектов, чем стальные, затем идут в движение оси/каретки, которые ещё тяжелее роторов ШД. Даже если бы у вас в наличии был сверхточный измеритель скоростей и координат с субмикронными делениями, вы вряд ли обнаружили бы что-то существенное после возвращение к сотым и десятым миллиметров, измеримым штангельциркулем деталей и разглядимых на печатной ребристой поверхности неровностей.
То же относится и к экструдерам : что-то резиноподобное, подпираемое филаментом с одной стороны и вяло вытекающее с другой сотороны - это ещё хуже резиноподобных длиннючих ремней по части предсказуемости. Многоцветные со смешением ещё менее предсказуемые.
Недавно один тут тоже поднимал вопрос о минимальном дискретном кубике пластика выдавливаемом на 1/16 шага двигателя экструдера - караул, это же такой большой объём в 0.0432 куб мм пластика на микрошаг - невозможно нормально печатать, как дальше жить?
Главное, что в среднем все нормально. Вот если оно в среднем передавливает или недодавливает (шаги пропускает) вот тогда - караул!
17.07.18 в 19:13
0
Главное, что в среднем все нормально
Так и есть.
17.07.18 в 20:40
1
Про разгон/торможение не буду рассказывать.
Про разгон/торможение не буду рассказывать.
Не знаю как в новых версиях Марлина, но той версии, что "RC" трапециидальный профиль ускорения. И jerk там вовсе не jerk, а всего лишь минимальная скорость, перед следующим ускорением.
Интересно было бы реализовать, честный S-curve профиль или даже чистый синус.
17.07.18 в 20:58
0
В новой версии марлин я что-то видел про curve профили, но не вникал. Видел, что кривую безье там считают на ассемблере для AVR и ARM процессоров.
Я больше склоняюсь к идее клиппера. Все расчёты вне контроллера. А контроллер только шаги передаёт на моторы.
18.07.18 в 10:31
1
Вчера, когда читал ваш пост, что-то меня "зацепило", но потом читая комментарии отвлекся и совсем упустил из виду...
Сегодня вспомнил, что...

При сравнении установленной скорости и скорости фактической, вы не учли ускорения... они существенно влияют на скорость перемещений. Дело в том что планировщик в прошивке (не слайсер, а именно планировщик в прошивке) все участки делит на сегменты и на каждый отдельный сегмент учитывает ускорение и jerk. Jerk - это не только как мы будем проходить резкие изменения направлений, но и то, до какой максимальной скорости может использоваться шаговый двигатель без применения ускорения. Это же касается и ШД на экструдере.

Попробуйте "беспредельно" (например, до 10000) увеличить значения ускорений и значение jerk (например, до 100), и посмотрите, пожалуйста, снова на осциллографе соответствие скорости установленной и фактической (рассчитанной по импульсам на осциллограмме). Только не ставьте большие скорости, иначе двигатели могут с места не сдвинуться ;-)
18.07.18 в 11:25
1
Мне тоже такая мысль приходила, но уже после измерений. Чтобы моторы не пытались успеть, я их отключаю. Как-нибудь попробую с завышенными джерками. А так я запускал движение на 50мм и ловил место с установившимся режимом, т.е. между разгоном и торможением. Если джерк завысить, то ловить не надо будет.
19.07.18 в 10:09
1
Хм, читаю и мысль закрадывается- а может снять нагрузку с контроллера? почему бы производителям софта (слайсера) в настройках позволять указывать количество шагов на мм, а не в прошивке принтера, и пусть г-коды сразу указывают шаги по осям... таким образом на стороне контроллера во первых нафиг не нужно будет считать что-то сложное, во вторых время работы программы будет реальным, т.е. совпадающем и физически и виртуально-расчетно....
А не так, что программа слайсер (утрировано естественно но суть такая) считает 0.5=1, а контроллер считает что 0.5=0...
Версия G-CODE v.2 - все в шагах. И не париться - в чем прошивка работает в мм или в дюймах...

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

:-)

[IMG]
19.07.18 в 11:29
0
Согласен. Так ещё контроллер прогноз делает куда и как двигаться, чтобы скорость держать. А слайсер всё это знает, но не передаёт через GCODE.
19.07.18 в 11:38
0
Не согласен. Ибо зачем нужен прогноз, если слайсер 100% знает куда потом пойдет голова принтера, соответсвеннно и ускорения тоже можно просчитать зараннее.... Как в той шутке - пропускная способность газели груженной терабайтными винтами во много выше даже 10 гигабайтной оптики.. :-)
Это имело бы смысл если было неизвестно что и куда должно пойти, а в данном случае - все известно априори. Вспоминаем принцип бритвы Оккама - зачем делать расчеты пусть даже на 32 битном контроллере, когда любой Core i3 его по вычислительным способностям сделает... причем в случае расчетов некритично если на каком то участке вычисления будут идти долго, в то время как во время печати любая задержка - дефект...


[IMG]
19.07.18 в 12:14
0
Так я об этом и говорю. Контроллер только шаги делает моторам, а прогноз и прочие алгоритмы - считать в "слайсерах".
19.07.18 в 13:18
0
Ибо конечному пользователю все равно этот процесс невидим, а перегоны мм в шаги - зачем на контроллер то вешать...
...это наверное вариативно должно быть, опционально... или, или... как например , в Slic3r, или в Cura есть возможность настраивать ускорения... да, они там есть, их можно указывать, и jerk можно переназначить... но... "ибо конечному пользователю" вообще порой не понятен механизм под названием "3D Printer" и принципы его работы ;-)

Вы же офисному принтеру не указываете с какой скоростью строчные или прописные буквы печатать... он сам "уж как могу, так и печатаю" :-)
19.07.18 в 13:14
0
разве этого до сих пор кто-то не знал?
использовать или нет такой хак с импульсами прям в конфиге указывается, опция квадростеппинг
да и на страничке с описанием функций марлина это описано.
21.07.18 в 11:07
0
Формально, количество импульсов соответствует (немного с занижением) скорости перемещения, но фактически, это может привести к искажению печатаемой модели. Если для перемещения печатающей головки на таких скоростях это сильно может не повлиять из-за инерции, то на экструдере это может привести к неравномерной подачи прутка...
а что, пруток тоже гонишь 180мм/сек?
может для экструдера, где скорости в 10 раз меньше эта проблема надумана?
21.07.18 в 12:24
0
Если сопло взять 1мм то скорости будут сравнимые. И если пруток 1.75 оставить.

Для написания комментариев, пожалуйста, авторизуйтесь.

Читайте в блогах

Ремонт/стайлинг габаритных огней вилочного электропогрузчика HELI

Сборка Creality CR-10S

Тест на излом прутка PLA, ABS, SBS, HIPS и PET-G

Самодельный 3D принтер из CD/DVD приводов

Калибровка Anycubic Photon не по феншую

3D Print Expo. Впечатления новичка.