Данная тема по сути репост моего же поста с 3dtoday. Так что обсуждать можно и тут и там 
Давно я тут не писал постов про принтеры и электронику, но тут назрела тема использования абсолютного энкодера и попытке делать вменяемое упралвение шаговым двигателем с рассчётом на точность позиционирования (не путать с повторяемостью). В качестве подопытного было приобретено несколько разных магнитных энкодеров наподобие тех, что используются в таких проектах как mechaduino (или его китайская инкарнация как MSK Servo42) или же в системах стабилизации камер (внезапно там используются те же магнитные энкодеры). В итоге у меня оказалось два их от разных производителей:
- AS5048A с разрешением 14bit (если пересчитать в угол по нехитрой формуле 360/2**14 ~ 0.022 градуса)
- TLE5012b с разрешением 15bit (опять же если пересчитать в угол то 360/2**15 ~ 0.011 градуса)
В итоге я остановился на втором варианте, так как его разрешения хватает что бы легко ловить повороты даже для двигателя в 400 шагов на оборот при 32 микрошаге (а это получится примерно так 360/(400*32) ~ 0.028125 градуса), хотя это уже и экстремальный вариант.
На макетке была собрана конструкция из stm32f103c8t6 aka bluepill энкодера и драйвера шагового двигателя tmc2130 (взял то что было под руками). Всё это счастье было запрограммировано на довольно простые действия:
- stm32 имеет прерывания на трех пинах которые подключены к Step/Dir/Enable на плате управления принтером при получении сигналов на Step/Dir/Enable производится stm32 делает шаг через tmc2130 после завершения шага (если успевает) считывает положение двигателя через энкодер tle5012b (на валу двигателя помещён магнит)
- stm32 печатает в UART инфу о количестве шагов, микрошаге, количесве оборотов и текущем угле поворота двигателя (энкодер таки абсолютный и умеет считать обороты)
Дальше у меня возникла идея проверить насколько точно шаговик встаёт по шагам. Для этого в управляющей плате принтера (которая тоже stm32 но пожирнее) были выставлены виртуальные 80 steps/mm для оси X (в принципе это значение стандартное для 20 зубой шпули для GT2) а драйвер двигателя был выставлен в 16 микрошаг (двигатель у меня 1.8 градуса, 200 шагов на оборот, и как следствия с 16 микрошагом каждый шаг соответсвует 360/(200*16) = 0.1125 градуса, запомним эту цифру). Я решил посмотреть как у нас зависит точность выставления угла поворота от скорости принтера (а как следствие и точность).
Как происходило тестирование:
- Был выбран набор скоростей: 10, 25, 50, 75, 100, 125, 150, 200, 250 мм/с
- Для каждой скорости передвижение с X0 до X160 и обратно и ожидание в крайних положения по 2 секунды (это 4 оборота движка в одну строну и в другую) повторялось по 25 раз
- Данные с энкодера писались в лог (скриптик с сериал консоли всё писал в файлики)
В итоге получилось довольно занятная картинка:
Вложение:
repeatability.png [ 16.07 КиБ | Просмотров: 2928 ]
На картинке выше нарисована статистика собранная по каждой скорости в виде так называемого boxplot (прямоугольник это все значения которые были в измерениях и лежат в пределах одного стандартного отклонения, зеленая линия это среднее значение, оражевая линия это медиана). На картинке нарисовано отклонение от значения медианы для каждой измеренной точки для каждой скорости. Как её интерпретировать:
- На низких скоростях (до 50 мм/с), у нас повторяемость очень неплохая, на уровне погрешности измерения энкодера
- На скорости 75мм/с (а это у нас ~1.875 оборота в секунду) ошибка повторяемости позиционирования шаговика становится сравнимой с одним микрошагом
- На скоростях 100, 125, 150 и 200 мм/с у нас ошибка повторяемости позиционирования шаговика снова становится сравнимой с погрешностью датчика угла поворота (особенность драйвера tmc2130, для него это другой режим работы и он пытается делать точное позиционирование)
- А вот на скорости в 250мм/с система идёт в разнос и повторяемость падает до ~0.7 градусов (что примерно 7 шагов при дроблении 1/16, или если пересчитать в мм то это будет ~0.1 мм в среднем)
Но это если речь идёт о повторяемости а не о точности. А это разные понятия. Так что теперь поговрим про точность. Будем считать, как это далают прошивки большниства принтеров, что перемещение на один микрошаг у нас всегда одианково (в данном случае это 0.1125 градуса или 0.0125 мм если у нас 80 шагов на мм). Посмотрим насколько это так.
То что мы видим при скорости 10мм/с (да довольно медленно)
Вложение:
f10mmps_real_vs_ideal.png [ 42.08 КиБ | Просмотров: 2927 ]
На картинках нарисовано чтение с датчика и счётчик шагов (данные датчика это синяя линия) а так же идеальные значения углов для данного номера шага (хе хе, довольно просто посчитать) а так же вертикальными черточками различия реально измеренного от идеального. Какие выводы можно сделать по этой картинке:
Шаги у нас не равномерны (что в целом понятно, исходя из физики двигателя)
Какие то шаги у нас почти точно попадают в идеальные значения углов поворота (но не все..., совсем не все...)
Хотя точность позиционирования у нас не очень высокая, но повторяемость хорошая (синяя линия на картинке это статистика по 25 повторам
Теперь посмотрим что будет если шаговик пойдёт немного быстрее 25 мм/с
Вложение:
f25mmps_real_vs_ideal.png [ 46.44 КиБ | Просмотров: 2933 ]
Картинка в целом не поменялась, но ошибка позиционирования возросла (разница между реальным и идеальным положением)
Теперь 50 мм/с
Вложение:
f50mmps_real_vs_ideal.png [ 51.16 КиБ | Просмотров: 2919 ]
Видно что позиционирование стало ещё хуже...
Теперь 75 мм/с
Вложение:
f75mmps_real_vs_ideal.png [ 43.1 КиБ | Просмотров: 2914 ]
Всё поплыло ещё дальше...
100 мм/с
Вложение:
f100mmps_real_vs_ideal.png [ 42.36 КиБ | Просмотров: 2922 ]
Ошибка осталась на прежнем уровне (tmc2130 перешел в другой режим работы)
125мм/с
Вложение:
f125mmps_real_vs_ideal.png [ 41.53 КиБ | Просмотров: 2923 ]
150 мм/с
Вложение:
f150mmps_real_vs_ideal.png [ 48.58 КиБ | Просмотров: 2919 ]
200 мм/с
Вложение:
f200mmps_real_vs_ideal.png [ 47.54 КиБ | Просмотров: 2923 ]
и 250мм/с
Вложение:
f250mmps_real_vs_ideal.png [ 49.58 КиБ | Просмотров: 2922 ]
Как видим, с увеличением скорости ошибка позиционирования растёт... Что можно нарисовать примерно так...
Вложение:
poss_errors.png [ 15.48 КиБ | Просмотров: 2941 ]
Картинка похожа на первую. Опять же зеленая линия это среднее. Оражневая медиана. Какие выводы можно сделать?
Что приятно средняя ошибка позиционирования примерно 0. Что означает что шаговик с одинаковой вероятность как проскакивает положение, так и недоходит до него (по этому среднее и есть 0).
А вот медиана уже становится большой. На уровне 0.5-0.8 градуса.
Разброс ошибок довольно большой, он растёт с примерно 0.2 градусов при 10мм/с до 4 градусов при 250мм/с, что соответсвует разбросу хода от 0.02 до 0.5 мм (хе хе.. кто там хвастался что печатает на скорости 200+мм/с....?)
Ещё замечу, что всё это измерялось на свободном шаговике без нагрузки. С нагрузкой будет все печальнее (и я это проверю в следующей части)
Что из всего этого следует?
Если хочется повышать качество печати, то надо слегка поменять подход к позиционирования шаговика в прошивках (позицоинирование у него не линейное, и это надо учитывать). По идее надо сделать умный closed-loop шаговик, которые будет в состоянии корректировать нелинейности при перемещении.
Здравая критика, и идеи приветствуются