Руководство · Начальный · 25 мин

Шагов на миллиметр: ремни, ходовые винты, разрешение

Откуда берутся 80 и 400 steps/mm, почему ремень и винт меняют соотношение разрешения и скорости и как откалибровать это число с помощью линейки.

Одно число, одна формула

Драйвер шагового двигателя считает импульсы. Машина перемещается в миллиметрах. Число, преобразующее одно в другое, — это число шагов на миллиметр, и все остальные калибровки машины зависят от его правильности.

Формула не меняется:

steps/mm = (full steps per revolution × microstepping) ÷ travel per revolution

Числитель определяется двигателем и драйвером: двигатель с 1.8° при микрошаге 1/16 всегда даёт 200 × 16 = 3200 микрошагов на оборот. Знаменатель — единственная часть, зависящая от машины, и это механический вопрос: на какое расстояние перемещается ось при одном обороте вала?

Две наложенные панели. Верхняя панель показывает шкив GT2 на двадцать зубьев с выходящим из него зубчатым ремнём, шаг ремня в два миллиметра между двумя зубьями и вычисление: двадцать зубьев по два миллиметра дают сорок миллиметров на оборот, затем 200, умноженные на 16 и делённые на 40, дают 80 шагов на миллиметр. Нижняя панель показывает ходовой винт T8 с четырьмя заходами, окрашенными в разные цвета, и гайкой, установленной на нём; отмечен ход в восемь миллиметров и приведено вычисление: 200, умноженные на 16 и делённые на 8, дают 400 шагов на миллиметр.
Два механизма, используемых почти в каждой машине для любителей, и два числа, которые уже встречались в файле конфигурации. Изменяется только знаменатель. Скачать SVG

Ремни

Для зубчатого ремня перемещение за оборот равно числу зубьев шкива, умноженному на шаг ремня. Ремень GT2 имеет шаг 2 mm, а шкив на 20 зубьев используется по умолчанию почти на каждой машине для любителей:

travel  = 20 teeth × 2 mm = 40 mm per revolution
steps/mm = (200 × 16) ÷ 40 = 80

Вот источник значения 80 steps/mm в конфигурации осей X и Y каждого 3D-принтера. Это не магическая константа: расчёт соответствует GT2 на 20 зубьев при шестнадцати микрошагах, а при установке шкива на 16 зубьев получается 100.

Шкив Перемещение за оборот steps/mm при 1/16 Разрешение
16 зубьев GT2 32 mm 100 0.010 mm
20 зубьев GT2 40 mm 80 0.0125 mm
30 зубьев GT2 60 mm 53.33 0.019 mm
20 зубьев GT3 (3 mm) 60 mm 53.33 0.019 mm

Обратите внимание, что значение для шкива на 30 зубьев делится не нацело. 53.333… steps/mm совершенно допустимо — прошивка хранит его как число с плавающей точкой и накапливает дробные шаги, — но ни одна позиция никогда не окажется точно на границе шага, и это один из аргументов в пользу числа зубьев, которое используют остальные.

Ходовые винты

Для винта перемещение за оборот — это ход, и ход не равен шагу резьбы. Это самая распространённая ошибка во всей теме.

  • Шаг резьбы — расстояние между соседними витками.
  • Ход — расстояние, на которое гайка перемещается за один оборот.
  • Lead = pitch × number of starts.

Однозаходный винт имеет ход, равный шагу резьбы. Но распространённый винт «T8» имеет шаг резьбы 2 mm и четыре отдельные винтовые спирали, навитые рядом друг с другом, поэтому один оборот перемещает гайку на четыре витка:

lead     = 2 mm pitch × 4 starts = 8 mm per revolution
steps/mm = (200 × 16) ÷ 8 = 400

Вот и второе встречавшееся число. Если измерить шаг резьбы T8 штангенциркулем, получится 2 mm, вычисление даст 1600 steps/mm, и каждое перемещение окажется в четыре раза короче. Посчитайте заходы на конце винта — видны четыре отдельные спирали — или просто поверните его на полный оборот относительно линейки.

Винт Шаг резьбы Число заходов Ход steps/mm при 1/16
T8, 4-заходный (“T8x8”) 2 mm 4 8 mm 400
T8, 2-заходный (“T8x4”) 2 mm 2 4 mm 800
T8, однозаходный (“T8x2”) 2 mm 1 2 mm 1600
Резьбовой стержень M5 0.8 mm 1 0.8 mm 4000
Шариковый винт 1605 5 mm 1 5 mm 640

Выбор между ними

Разрешение не бесплатно. Винт с десятикратно большим разрешением ремня также требует в десять раз больше импульсов для того же расстояния, поэтому при фиксированной максимальной частоте шагов он в десять раз медленнее. Это жёсткий компромисс:

Ремень GT2, 20T Ходовой винт T8
Перемещение за оборот 40 mm 8 mm
Разрешение при 1/16 0.0125 mm 0.0025 mm
Steps/s для 100 mm/s 8 000 40 000
Практическая максимальная скорость 300+ mm/s ~30 mm/s
Сила на оси Низкая — ремень растягивается Высокая — механическое преимущество 5×
Удерживает положение без питания Нет Обычно да (самоторможение)
Люфт Низкий при натяжении Реальный, в гайке
Назначение X и Y — быстро, мало нагрузки Z — медленно, тяжело, не должен падать

Именно поэтому 3D-принтер использует ремни для X и Y, а винт для Z. Оси X и Y перемещаются быстро и несут почти ничего. Ось Z движется медленно, несёт вес стола или портала и не должна провисать после отключения питания; небольшой угол винтовой линии T8 обеспечивает самоторможение, поэтому под нагрузкой ось не провернётся.

Значение 40 000 steps/s в таблице также является реальным пределом, а не теоретическим. Arduino Uno при программном формировании импульсов выдаёт не более примерно 10 000–15 000 в секунду, прежде чем цикл перестанет справляться; для T8 при микрошаге 1/16 это около 30 mm/s. Если ось с винтом должна двигаться быстрее, решения — меньшее число микрошагов, более быстрая плата или аппаратный таймер, а не более мощный двигатель.

Момент и то, чего не говорит таблица

Изменение механизма изменяет не только скорость, но и нагрузку, которую видит двигатель. Ходовой винт увеличивает силу примерно в 2π × radius ÷ lead раз, поэтому T8 превращает умеренный момент двигателя в существенную осевую силу — благодаря этому ось Z с небольшим двигателем поднимает тяжёлый стол.

Ремень действует наоборот. Шкив GT2 на 20 зубьев имеет делительный диаметр 12.7 mm, поэтому натяжение ремня равно моменту двигателя, делённому на 6.4 mm. Двигатель с моментом 0.3 N·m создаёт около 47 N на ремне, и это всё. Именно этим объясняется пропуск шагов осью X при столкновении с препятствием.

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

Калибруйте, не полагайтесь на расчёт

Рассчитанное число — отправная точка, а не ответ. Ремни растягиваются, шкивы имеют производственные допуски, а винты продаются с оптимистичными описаниями. Измерьте:

  1. Отметьте каретку относительно неподвижной точки. Используйте полоску клейкой ленты и чёткую линию карандашом.
  2. Задайте длинное перемещение — 100 mm, а не 10 mm. Ошибка является процентной, поэтому длинный ход измеряет её точнее.
  3. Измерьте фактическое перемещение штангенциркулем или стальной линейкой.
  4. Скорректируйте коэффициентом:
new steps/mm = old steps/mm × (commanded ÷ measured)

Задано 100 mm, измерено 98.4 mm, текущее значение равно 80: 80 × 100 ÷ 98.4 = 81.3 steps/mm.

Затем повторите измерение для подтверждения. Если единственная коррекция не сходится, ошибка не является ошибкой масштаба, и это различие даёт диагностическую подсказку:

Закономерность измерений Причина
Постоянное отклонение на один процент для любого расстояния Неверное steps/mm — исправляет приведённый выше расчёт
Постоянное отклонение на постоянную величину независимо от расстояния Люфт или ослабленный стопорный винт шкива
Каждый раз отклонение на разную величину Пропуск шагов — ток, скорость или ускорение
В одном направлении правильно, в другом ход короткий Люфт, а измерение выполнялось в обоих направлениях
Ошибка ровно в 2×, 4× или 16× Перемычки микрошагов не соответствуют прошивке
На оси с винтом ход короче ровно в 4× Использован шаг резьбы вместо хода

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

Вращающиеся оси: шагов на градус

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

steps/degree = (full steps × microstepping × gear ratio) ÷ 360

Двигатель 1.8° при микрошаге 1/16 и редукторе 5:1 даёт (200 × 16 × 5) ÷ 360 = 44.4 steps per degree, то есть разрешение 0.0225°. Стоит заметить, что это та же арифметика, что и для ремня, только вместо миллиметров на оборот используются 360 градусов.

Экструдер 3D-принтера — исключение, поскольку для привода вращательного типа его параметр указывается в шагах на миллиметр филамента. Знаменателем служит эффективная длина окружности фрезерованного зубчатого колеса, а не его номинальный диаметр: зубья вгрызаются в филамент, поэтому фактический радиус сцепления меньше напечатанного на детали. Именно поэтому параметр E-steps не рассчитывают, а измеряют:

  1. Отметьте филамент на расстоянии 120 mm выше входа экструдера.
  2. Экструдируйте ровно 100 mm.
  3. Снова измерьте расстояние от входа до отметки. Если получится 27 mm, фактически экструдировано 93 mm, а не 100.
  4. new = old × 100 ÷ 93. При исходном значении 93 steps/mm получается 100 steps/mm.

Начальная отметка на 120 mm выбрана намеренно: она оставляет достаточно филамента, чтобы метка не достигла входа даже при сильном избытке экструзии.

Нецелое число шагов на миллиметр

После калибровки число перестаёт быть круглым: 80 превращается в 81.3, а перемещение на 10 mm требует 813.0 шагов. Прошивка обрабатывает это правильно, но код, написанный вручную, обычно нет, поскольку очевидная реализация отбрасывает дробную часть при каждом перемещении:

// Wrong: truncates on every call. Two hundred 0.1 mm moves land 1.4 mm short.
long stepsFor(float mm) { return (long)(mm * stepsPerMm); }

При 81.3 steps/mm перемещение 0.1 mm составляет 8.13 шага, что усекается до 8. Дробь 0.13 отбрасывается и при следующем перемещении, и затем снова. За несколько сотен коротких отрезков — именно их образует кривая или штриховка — ошибка накапливается до заметной величины.

Исправление состоит в сохранении остатка, а не позиции:

// Right: carry the fraction forward, so the error never accumulates past one step.
float carry = 0;

long stepsFor(float mm) {
  float exact = mm * stepsPerMm + carry;
  long whole = lround(exact);
  carry = exact - whole;        // always within half a step
  return whole;
}

Теперь наибольшая ошибка в любой момент не превышает половины шага — 0.006 mm на этой оси — и не растёт. Это тот же приём, который использует растеризация линий Брезенхэма, и причина, по которой прошивка отслеживает позицию в шагах, а не в миллиметрах: целое число шагов не может дрейфовать, а позиция с плавающей точкой в миллиметрах может.

В прошивке

Marlin и GRBL хранят это число как настраиваемый параметр, поэтому перекомпиляция требуется редко:

; Marlin — X, Y, Z, E
M92 X80 Y80 Z400 E93
M500          ; save to EEPROM

; GRBL
$100=80       ; X steps/mm
$101=80       ; Y
$102=400      ; Z

Запишите установленное значение. Самая неприятная форма этой проблемы — машина, однажды откалиброванная правильно, затем перепрошитая и молча вернувшаяся к значениям прошивки по умолчанию.

Далее

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

Исследуйте граф

Входит в эти сборки

Проекты и учебные пути, в которые входит это руководство.

Дополнительные материалы

Источники