Поворотный столик для макросъёмки я поделил на двести позиций: полный шаг NEMA 17 — 1,8 градуса, и на объекте в три сантиметра каждый скачок виден на кадре. Полушаг я уже прикручивал к слайдеру в уроке про режимы обмоток — стало вдвое ровнее, но скачок остался: половина шага — это 0,9 градуса. Для панорамной головки хочется делить дальше, а библиотека Stepper умеет только такты партитуры, дробью дальше не идёт.
Выход нашёлся там, где я его не искал: у A4988 микрошаг есть из коробки. Драйвер держит токи обеих обмоток не в режиме включено-выключено, а по синусоиде: вектор магнитного поля поворачивается плавно, и между двумя полными шагами появляются промежуточные позиции. Три пина MS1, MS2 и MS3 выбирают, на сколько долей делить шаг — от половины до одной шестнадцатой.
В этом уроке — таблица делений и токи фаз на синусе, цена плавности моментом и правда о точности. Честно предупрежу заранее: разрешение вырастет в шестнадцать раз, а повторяемость позиций — нет, и это не дефект драйвера, а свойство механики, с которым лучше познакомиться на цифрах, а не на слух.
MS1, MS2, MS3: пять делений шага
Три пина задают деление из таблицы даташита: все три в нуле — полный шаг, единица на MS1 — полушаг, единица на MS2 — четверть, MS1 и MS2 вместе — восьмая, все три в единице — шестнадцатая. Таблица нелинейная, запоминать её бессмысленно — я пару недель тупил в неё каждый раз, пока не повесил бумажку над столом. На дешёвых модулях стоят перемычки, на приличных — три пина наружу; я всегда веду их на цифровые пины Arduino: смена деления на лету стоит ноль, новая комбинация читается на следующем фронте STEP.
Для NEMA 17 с его двумястами шагами арифметика такая: 200 × 16 = 3200 позиций на оборот, 0,1125 градуса на микрошаг. Пересчёт углов в позиции — та же формула из урока про 2048, меняется только константа. И то же правило про long: в микрошагах числа растут в шестнадцать раз быстрее, сутки счёта позиций int уже не удержит.
Теперь физика. За один полный шаг фаза A спускается от ста процентов тока к нулю, фаза B зеркально поднимается — их вектор вместе поворачивается на четверть электрического цикла. В режиме 1/16 этот спуск разбит на шестнадцать ступеней по пять-шесть процентов тока каждая: для осциллографа грубовато, для ротора — уже плавный поворот поля. Именно поэтому микрошаг слышен ушами: треск тактов на средних оборотах сходит в ровную ноту.
| Деление | MS1 / MS2 / MS3 | Позиций на оборот | Шаг вала | Токи фаз A / B в первой промежуточной точке |
|---|---|---|---|---|
| 1 (полный шаг) | 0 / 0 / 0 | 200 | 1,8° | 100% / 0% |
| 1/2 | 1 / 0 / 0 | 400 | 0,9° | 71% / 71% |
| 1/4 | 0 / 1 / 0 | 800 | 0,45° | 92% / 38% |
| 1/16 | 1 / 1 / 1 | 3200 | 0,1125° | 100% / 10%, ступени синуса по 5-6% |
Плата за плавность — жёсткость позиции. Пик момента не падает: даташитные ньютон-сантиметры никуда не деваются. Падает момент, которым ротор удерживается промежуточной позицией: стронуть его оттуда можно примерно вдвое меньшей силой, чем из полной позиции при делении 1/16. Правило с запасом, а не даташитная константа, но для механики я считаю именно так, и оно ещё ни разу не подвело.
Проверено на двух проектах. Горизонтальный слайдер в 1/16 едет гладко и не срывается никогда — груз на плече почти нулевой. Вертикальная шторка в 1/16 сорвалась там, где полный шаг тянул уверенно: вернул её в полный шаг и спал спокойно. Моё мнение с границей: подъём против гравитации — полный шаг или редуктор, микрошаг — для горизонтальных ходов и лёгких механизмов.
Практическое правило, которое я вывел из этих двух грабель: деление — не функция точности, а функция комфорта механики. Слайдеры, поворотные столики, подача бумаги — всё, что едет по гладкой горизонтали, живёт на 1/16 и не замечает половинного момента. Всё, что толкает, жмёт или поднимает, — полный шаг, а микрошаг там даёт только ровный звук и лишние грабли. Хорошая новость: переключение режимов в одном скетче A4988 бесплатно — та же функция ustanoviDelenie вызывается перед ходом, и мотор едет тем режимом, который нужен конкретному участку маршрута.
Теперь о точности, и здесь цифры некрасивые. Разрешение растёт в шестнадцать раз, повторяемость позиций — в лучшем случае в две-три: обработка зубцов ротора, трение и люфт механики съедают остальное. Слайдер на ремне GT2 со шкивом на двадцать зубьев даёт 40 мм на оборот: теоретический микрошаг 1/16 — 12 микрометров, реально платформа ходит в пределах пары десятых миллиметра из-за трения и упругости ремня. Лечится репером и обратной связью, а не новыми перемычками — цену срыва мы считали в уроке про скорость и позиционирование.
// Пины A4988: STEP, DIR и три пина деленияconst int PIN_STEP = 3;const int PIN_DIR = 4;const int PIN_MS1 = 7;const int PIN_MS2 = 6;const int PIN_MS3 = 5; const int STEPS_PER_REV = 200; // деление: 1, 2, 4, 8 или 16 (таблица из даташита)void ustanoviDelenie(int del) { if (del == 2) { digitalWrite(PIN_MS1, HIGH); digitalWrite(PIN_MS2, LOW); digitalWrite(PIN_MS3, LOW); } else if (del == 4) { digitalWrite(PIN_MS1, LOW); digitalWrite(PIN_MS2, HIGH); digitalWrite(PIN_MS3, LOW); } else if (del == 8) { digitalWrite(PIN_MS1, HIGH); digitalWrite(PIN_MS2, HIGH); digitalWrite(PIN_MS3, LOW); } else if (del == 16) { digitalWrite(PIN_MS1, HIGH); digitalWrite(PIN_MS2, HIGH); digitalWrite(PIN_MS3, HIGH); } else { digitalWrite(PIN_MS1, LOW); digitalWrite(PIN_MS2, LOW); digitalWrite(PIN_MS3, LOW); }} void impuls() { digitalWrite(PIN_STEP, HIGH); delayMicroseconds(10); digitalWrite(PIN_STEP, LOW); delayMicroseconds(10);} // 90 градусов = 50 полных шагов, в делении del - 50*del импульсовvoid poverniNa90(int del) { for (int i = 0; i < 50 * del; i++) { impuls(); delay(1); }} void setup() { pinMode(PIN_STEP, OUTPUT); pinMode(PIN_DIR, OUTPUT); pinMode(PIN_MS1, OUTPUT); pinMode(PIN_MS2, OUTPUT); pinMode(PIN_MS3, OUTPUT); digitalWrite(PIN_DIR, HIGH); Serial.begin(9600);} void loop() { int dels[5] = {1, 2, 4, 8, 16}; for (int i = 0; i < 5; i++) { ustanoviDelenie(dels[i]); Serial.print("Div: "); Serial.println(dels[i]); poverniNa90(dels[i]); delay(800); }}Функция ustanoviDelenie — пять веток, по одной на режим: комбинации MS-пинов не вычисляются из деления, и пытаться вывести их арифметикой — путь к тихому браку. Той же структурой ложится switch-case по режимам из основ: пять состояний, пять веток, читается с листа. Заметьте: MS3 в таблице поднимается только на последнем делении — код повторяет бумажку из даташита буква в буква.
Четверть оборота — пятьдесят полных шагов, в делении d это 50 × d импульсов: от 50 на полном шаге до 800 на 1/16. Оборот в 1/16 — 3200 импульсов: int держит, но счёт позиций за сутки в микрошагах уже просят long, арифметика та же, что в пересчёте градусов. Деление меняйте между сериями импульсов, не посреди хода: угол доедет и при смене на лету, но счётчик импульсов пересчитывайте на новое деление.
И ещё одна грабля, о которой легко забыть: после смены деления первый импульс приводит транслятор в ближайшую промежуточную позицию нового режима — не туда, где вы планировали по старой сетке. Если механизм привязан к конкретным позициям, меняйте деление в момент, когда вал стоит в полной позиции: сетки совпадут, и никто никуда не уедет.
Делим шаг на 16 в симуляторе
Честно: токи фаз и A4988 движок не эмулирует — в симуляторе живёт модель. Библиотечный Stepper создан на 3200 шагов на оборот — так выглядит NEMA 17 в режиме 1/16. Serial печатает деление, число импульсов на четверть оборота и угол на импульс, умноженный на сто, светодиод D12 мигает на каждом делении. За один проход цикла программа проходит все пять режимов — от полного шага до 1/16.
Сравните числа на выходе: полный шаг — 50 импульсов на 90 градусов, 1/16 — 800. Разница в шестнадцать раз — и во столько же растёт нагрузка на цикл импульсов: на Uno восемьсот циклов с паузой ещё догоняемо, на десятках оборотов в секунду — уже нет. Таблицу токов можно построить в Serial Plotter — график из урока про Serial охотно рисует синус по парам имя-значение, если распечатать ступени по очереди.
Модель, как и всякая модель, не показывает момент: ротор в симуляторе не сорвётся, и разница жёсткости между полным шагом и 1/16 на циферблате не видна. Это не делает модель бесполезной — арифметику импульсов она считает честно, а именно арифметика здесь единственное, что можно посчитать заранее. Жёсткость позиции проверяют на настоящем моторе с грузом на валу — и записывают границы для своих механизмов, как я записал для шторки.
- MS1/MS2/MS3: 000 — полный шаг, 100 — 1/2, 010 — 1/4, 110 — 1/8, 111 — 1/16; таблица нелинейная, держите её под рукой
- NEMA 17 в 1/16 — 3200 позиций на оборот, 0,1125° на микрошаг; счётчики позиций считайте в long
- Токи фаз идут синусом: первая промежуточная точка 1/16 — это 100% и 10% тока, ступени по 5-6%
- Жёсткость промежуточной позиции в 1/16 — примерно половина полной: подъём против гравитации в микрошаг не доверяйте
- Разрешение ×16, повторяемость ×2-3: микрошаг не заменяет репер и обратную связь, он лишь дробит путь
- 1. Сколько позиций на оборот даёт NEMA 17 в режиме 1/16?
- 2. Какая комбинация MS1-MS2-MS3 включает четверть шага?
- 3. Токи фаз A и B в первой промежуточной точке полушага?
- 4. Во сколько раз реально улучшается повторяемость позиций при переходе на 1/16?
- 5. Какой механизм можно смело вести в режиме 1/16?
Сетки делений теперь под контролем: пять режимов, синус токов, честная цена в моменте и честная же ложь про точность. Остался последний этаж этой башни — сам мотор. Драйверу всё равно, что крутить, поэтому разберём NEMA 17 по винтикам: почему 42 миллиметра фланца стали стандартом всей мехатроники, откуда берутся 200 шагов и 1,8 градуса, какой ток у него в паспорте и как под этот ток выбирать драйвер — заодно решим, когда время мелкого 28BYJ-48 окончательно вышло.
Частые вопросы по теме урока
- Сколько позиций на оборот даёт NEMA 17 в режиме 1/16?
- 200 полных шагов умножаются на деление: 200 × 16 = 3200 позиций, микрошаг — 0,1125 градуса. 3200
- Какая комбинация MS1-MS2-MS3 включает четверть шага?
- Таблица нелинейная: четверть — единица только на MS2. Полушаг — только на MS1, восьмая — на MS1 и MS2, шестнадцатая — на всех трёх. 0 / 1 / 0
- Токи фаз A и B в первой промежуточной точке полушага?
- Половина электрического угла — 45 градусов: косинус и синус от него дают по 71 процента. Вектор поля смотрит ровно между полными позициями. 71% и 71%
- Во сколько раз реально улучшается повторяемость позиций при переходе на 1/16?
- Разрешение растёт в 16 раз, а повторяемость ограничена обработкой зубцов, трением и люфтом — на практике выигрыш двукратный-трёхкратный. Примерно в 2-3
- Какой механизм можно смело вести в режиме 1/16?
- Горизонтальный ход почти не грузит вал: жёсткости промежуточной позиции хватает. Против гравитации и напора — полный шаг или редуктор. Горизонтальный слайдер камеры с лёгкой платформой