Кремень FMZ Реклама
Kremen FMHM Реклама

Сага о абсолютном энкодере и шаговом двигателе

alexxy
Идет загрузка
Загрузка
04.05.2019
19580
104
Техничка

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

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

В качестве подопытного было приобретено несколько разных магнитных энкодеров наподобие тех, что используются в таких проектах как mechaduino (или его китайская инкарнация как MSK Servo42) или же в системах стабилизации камер (внезапно там используются те же магнитные энкодеры). В итоге у меня оказалось два их от разных производителей:
  • AS5048A с разрешением 12bit (если пересчитать в угол по нехитрой формуле 360/2**12 ~ 0.08789 градуса)
  • TLE5012b с разрешением 15bit (опять же если пересчитать в угол то 360/2**15 ~ 0.01099 градуса)

В итоге я остановился на втором варианте, так как его разрешения хватает что бы легко ловить повороты даже для двигателя в 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 раз
  • Данные с энкодера писались в лог (скриптик с сериал консоли всё писал в файлики)

В итоге получилось довольно занятная картинка:
Сага о абсолютном энкодере и шаговом двигателе
На картинке выше нарисована статистика собранная по каждой скорости в виде так называемого boxplot (прямоугольник это все значения которые были в измерениях и лежат в пределах одного стандартного отклонения, зеленая линия это среднее значение, оражевая линия это медиана). На картинке нарисовано отклонение от значения медианы для каждой измеренной точки для каждой скорости. Как её интерпретировать:
  • На низких скоростях (до 50 мм/с), у нас повторяемость очень неплохая, на уровне погрешности измерения энкодера
  • На скорости 75мм/с (а это у нас ~1.875 оборота в секунду) ошибка повторяемости позиционирования шаговика становится сравнимой с одним микрошагом
  • На скоростях 100, 125, 150 и 200 мм/с у нас ошибка повторяемости позиционирования шаговика снова становится сравнимой с погрешностью датчика угла поворота (особенность драйвера tmc2130, для него это другой режим работы и он пытается делать точное позиционирование)
  • А вот на скорости в 250мм/с система идёт в разнос и повторяемость падает до ~0.7 градусов (что примерно 7 шагов при дроблении 1/16, или если пересчитать в мм то это будет ~0.1 мм в среднем)

Но это если речь идёт о повторяемости а не о точности. А это разные понятия. Так что теперь поговрим про точность. Будем считать, как это далают прошивки большниства принтеров, что перемещение на один микрошаг у нас всегда одианково (в данном случае это 0.1125 градуса или 0.0125 мм если у нас 80 шагов на мм). Посмотрим насколько это так.

То что мы видим при скорости 10мм/с (да довольно медленно)
Сага о абсолютном энкодере и шаговом двигателе
На картинках нарисовано чтение с датчика и счётчик шагов (данные датчика это синяя линия) а так же идеальные значения углов для данного номера шага (хе хе, довольно просто посчитать) а так же вертикальными черточками различия реально измеренного от идеального. Какие выводы можно сделать по этой картинке:
  • Шаги у нас не равномерны (что в целом понятно, исходя из физики двигателя)
  • Какие то шаги у нас почти точно попадают в идеальные значения углов поворота (но не все..., совсем не все...)
  • Хотя точность позиционирования у нас не очень высокая, но повторяемость хорошая (синяя линия на картинке это статистика по 25 повторам



Теперь посмотрим что будет если шаговик пойдёт немного быстрее 25 мм/с
Сага о абсолютном энкодере и шаговом двигателе
Картинка в целом не поменялась, но ошибка позиционирования возросла (разница между реальным и идеальным положением)

Теперь 50 мм/с
Сага о абсолютном энкодере и шаговом двигателе
Видно что позиционирование стало ещё хуже...

Теперь 75 мм/с
Сага о абсолютном энкодере и шаговом двигателе
Всё поплыло ещё дальше...

100 мм/с
Сага о абсолютном энкодере и шаговом двигателе
Ошибка осталась на прежнем уровне (tmc2130 перешел в другой режим работы)

125мм/с
Сага о абсолютном энкодере и шаговом двигателе
150 мм/с
Сага о абсолютном энкодере и шаговом двигателе
200 мм/с
Сага о абсолютном энкодере и шаговом двигателе
и 250мм/с
Сага о абсолютном энкодере и шаговом двигателе
Как видим, с увеличением скорости ошибка позиционирования растёт... Что можно нарисовать примерно так...
Сага о абсолютном энкодере и шаговом двигателе
Картинка похожа на первую. Опять же зеленая линия это среднее. Оражневая медиана. Какие выводы можно сделать?
  • Что приятно средняя ошибка позиционирования примерно 0. Что означает что шаговик с одинаковой вероятность как проскакивает положение, так и недоходит до него (по этому среднее и есть 0).
  • А вот медиана уже становится большой. На уровне 0.5-0.8 градуса.
  • Разброс ошибок довольно большой, он растёт с примерно 0.2 градусов при 10мм/с до 4 градусов при 250мм/с, что соответсвует разбросу хода от 0.02 до 0.5 мм (хе хе.. кто там хвастался что печатает на скорости 200+мм/с....?)
  • Ещё замечу, что всё это измерялось на свободном шаговике без нагрузки. С нагрузкой будет все печальнее (и я это проверю в следующей части)



Что из всего этого следует?

Если хочется повышать качество печати, то надо слегка поменять подход к позиционирования шаговика в прошивках (позицоинирование у него не линейное, и это надо учитывать). По идее надо сделать умный closed-loop шаговик, которые будет в состоянии корректировать нелинейности при перемещении.

Продолжение следует...

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

42
Комментарии к статье