Руководство · Начальный · 25 мин
Шагов на миллиметр: ремни, ходовые винты, разрешение
Откуда берутся 80 и 400 steps/mm, почему ремень и винт меняют соотношение разрешения и скорости и как откалибровать это число с помощью линейки.
Одно число, одна формула
Драйвер шагового двигателя считает импульсы. Машина перемещается в миллиметрах. Число, преобразующее одно в другое, — это число шагов на миллиметр, и все остальные калибровки машины зависят от его правильности.
Формула не меняется:
steps/mm = (full steps per revolution × microstepping) ÷ travel per revolution
Числитель определяется двигателем и драйвером: двигатель с 1.8° при микрошаге 1/16 всегда даёт 200 × 16 = 3200 микрошагов на оборот. Знаменатель — единственная часть, зависящая от машины, и это механический вопрос: на какое расстояние перемещается ось при одном обороте вала?
Ремни
Для зубчатого ремня перемещение за оборот равно числу зубьев шкива, умноженному на шаг ремня. Ремень 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 при столкновении с препятствием.
Приведённая инерция также изменяется в том же направлении: чем выше разрешение механизма, тем меньше масса каретки влияет на двигатель, что частично объясняет, почему ось с винтом допускает более агрессивное ускорение, чем ось с ремнём. Этот эффект можно увидеть непосредственно в симуляторе шагового двигателя: при неизменных остальных параметрах переключите механизм с ремня на ходовой винт и проследите за изменением угла запаздывания.
Калибруйте, не полагайтесь на расчёт
Рассчитанное число — отправная точка, а не ответ. Ремни растягиваются, шкивы имеют производственные допуски, а винты продаются с оптимистичными описаниями. Измерьте:
- Отметьте каретку относительно неподвижной точки. Используйте полоску клейкой ленты и чёткую линию карандашом.
- Задайте длинное перемещение — 100 mm, а не 10 mm. Ошибка является процентной, поэтому длинный ход измеряет её точнее.
- Измерьте фактическое перемещение штангенциркулем или стальной линейкой.
- Скорректируйте коэффициентом:
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 не рассчитывают, а измеряют:
- Отметьте филамент на расстоянии 120 mm выше входа экструдера.
- Экструдируйте ровно 100 mm.
- Снова измерьте расстояние от входа до отметки. Если получится 27 mm, фактически экструдировано 93 mm, а не 100.
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
Запишите установленное значение. Самая неприятная форма этой проблемы — машина, однажды откалиброванная правильно, затем перепрошитая и молча вернувшаяся к значениям прошивки по умолчанию.
Далее
Приведённое число сообщает машине, насколько далеко она переместилась, но ничего не говорит о том, где она начала. При включении питания разомкнутая машина не может это определить. Для этого служит возврат в исходное положение по концевому выключателю.
Исследуйте граф
Входит в эти сборки
Проекты и учебные пути, в которые входит это руководство.
Дополнительные материалы