Интерактивный симуляторСредний

Симулятор шагового двигателя: потеря шагов и запаздывание

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

Категория
Встраиваемые системы
Время
20–40 min
Платформа
Браузер · Arduino · ESP32
Техническая схема: Симулятор шагового двигателя: потеря шагов и запаздываниеFIELDROTORCARRIAGE80 STEPS/MM · 1.8° · 1/16LAG ANGLE DECIDES WHETHER IT ARRIVES

01 / Начните здесь

Введение

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

Live lab / Open-loop step integrity

Stepper motor simulator

Command a move and watch the rotor trail the field. Push the acceleration, drop the voltage or add load until the lag angle runs past the 90° pull-out limit — and the motor silently stops arriving.

Browser native
This lab plots a stepper move twice: the position the driver believes the axis has reached against the position the rotor actually reached, and below it the lag angle between the commanded magnetic field and the rotor. Use the controls below to change the move, the drive and the load.

Upper plot: the dashed line is where the driver thinks the axis is, the solid line is where the rotor actually is. Lower plot: the lag angle between them. The shaded band is where a steady load can sit — past ±90 electrical degrees the torque starts falling instead of rising, so there is no equilibrium out there, and a rotor that keeps going reaches 180° and slips a pole.

  • Commanded (what the driver counted)
  • Actual rotor position
  • Where a load can sit (±90°e)
  • Sync lost
Try it

There is nothing to start — the whole move is re-integrated as you drag any control. Step through the five presets to see the four ways an open-loop move stops arriving.

The move
The drive
The load

The rotor stays inside the stable band for the whole move and lands on target.

Full steps lost
0
Peak lag
25°e
Position error
0.000 mm
Resolution
80 steps/mm
Pull-out torque
0.311 N·m
Corner speed
599 rpm

Every action has a button above. If you prefer the keyboard, focus the plots and press P for the next preset, M for the next microstepping setting, N to toggle the acceleration ramp, R to reset and F for full screen; sliders respond to the arrow keys.

Управление

Лаборатория повторяет весь ход при каждом изменении, поэтому траектории следуют за ползунком, а не ждут нажатия «Пуск». Нажимать запуск не нужно — перемещение состоит из 30 000 шагов интегрирования и заканчивается раньше, чем вы снова сдвинете пальцем.

Элемент управления Что изменяет
Пресет Пять разобранных ситуаций: от чистого перемещения до четырёх разных способов отказа
Частота шагов Трапецеидальный разгон или переход сразу на полную частоту
Расстояние / Максимальная скорость / Ускорение Запрашиваемое перемещение
Напряжение питания То, чем драйвер нагнетает ток в обмотку
Предел тока Значение, заданное подстроечным резистором, — пиковый момент
Микрошаги Насколько мелко делится поле, от 1/1 до 1/16
Механизм Ремень GT2 (40 mm/rev) или ходовой винт T8 (8 mm/rev)
Момент сопротивления Трение и нагрузка на валу двигателя

Верхний график — положение: пунктирная линия показывает, где, по мнению драйвера, находится ось, сплошная — где находится ротор фактически. Нижний график — угол запаздывания между ними с заштрихованной устойчивой полосой ±90°.

Теория

Шаговый двигатель не делает шаги. Драйвер вращает магнитное поле дискретно, а ротор следует за ним, всегда отставая на некоторый угол, и создаваемый им момент равен синусу этого угла:

T = T_peak(ω) × sin(δ)

δ измеряется в электрических градусах. У двигателя 1.8° есть 50 зубцов ротора, поэтому магнитная структура повторяется 50 раз за оборот, и один полный шаг равен ровно 90 электрических градусов. Это единственная арифметика во всей теме.

Между −90° и +90° двигатель работает как пружина: чем дальше он отстаёт, тем сильнее его тянет обратно. Эта устойчивая область объясняет, почему разомкнутый шаговый двигатель вообще работает, и именно в ней должна находиться постоянная нагрузка. После 90° синус перегибается, поэтому дальнейшее отставание даёт меньший возвращающий момент и заставляет отставать ещё сильнее, а при 180° момент меняет направление и начинает тянуть к следующему полюсу. Ротор соскальзывает к следующему устойчивому зубу, на один электрический цикл — четыре полных шага — дальше.

Это два разных числа, и лаборатория сохраняет их раздельно. 90° — место окончания равновесия; кратковременное превышение этого значения переживаемо, поэтому команда полного шага — толчок на 90° на каждом шаге — не разрушает машину. 180° — точка невозврата.

Три фактора увеличивают угол запаздывания:

  • Нагрузка. При установившейся скорости sin(δ) = demanded ÷ available. Нагрузка, равная половине доступного момента, соответствует 30° и оставляет запас 60°.
  • Ускорение. Запуск ротора расходует момент из того же бюджета, поэтому запаздывание максимально на разгоне, а не на скорости.
  • Скорость, потому что сам T_peak падает с ростом частоты вращения.

Последний фактор менее очевиден. Обмотка — это индуктивность, и чем быстрее вращается двигатель, тем труднее направить ток в неё и обратно: реактивное сопротивление растёт с электрической частотой, а собственная противоЭДС вращающегося ротора съедает напряжение питания. В результате кривая момента постоянна до переломной скорости и падает после неё, а сама переломная скорость определяется напряжением питания.

Отсюда следуют два правила, ради которых существует лаборатория: больше ампер покупает момент, больше вольт покупает скорость.

Алгоритм

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

// per 20 us tick
const ideal    = sampleProfile(plan, time).position;         // mm the planner wants
const command  = Math.round(ideal * stepsPerMm) / stepsPerMm; // the driver only does whole microsteps
const lag      = rotorTeeth * (commandAngle - theta);         // electrical radians

const { torque } = peakTorque(setup, omega);                  // falls with speed
const friction   = loadTorque * Math.tanh(omega / 0.5);       // smooth Coulomb, one line
const accel      = (torque * Math.sin(lag) - friction - damping * omega) / inertia;

theta += omega * dt + 0.5 * accel * dt * dt;
omega += accel * dt;

Две детали важнее, чем кажется.

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

Модель обмотки задаёт предел момента:

const backEmf   = kT * speed;
const impedance = Math.hypot(resistance, rotorTeeth * speed * inductance);
const current   = Math.min(currentLimit, Math.max(0, supplyVolts - backEmf) / impedance);
const torque    = Math.SQRT2 * kT * current;

Это упрощённая стационарная модель драйвера с широтно-импульсной модуляцией, а не пофазовая симуляция. Она воспроизводит форму настоящей кривой момента и даёт правильные ответы по обеим инженерным величинам, но в самом верхнем диапазоне работает консервативно.

Заданная траектория берётся из существующего планировщика профиля движения сайта, поэтому «с разгоном» и «без него» — один и тот же путь кода с разными пределами ускорения, отдельного режима отказа нет.

Управляемые эксперименты

Каждый эксперимент изолирует одну переменную. Больше ничего не меняйте.

1. Разгон — это вся машина. Оставьте всё по умолчанию и переключайте частоту шагов между с разгоном и сразу на полную скорость.

С разгоном Сразу на полную скорость
Пиковое запаздывание 25°e после 90° через 1.2 ms, исчезает к 3.0 ms
Потеряно полных шагов 0 280
Где заканчивается ось 60.00 mm 4.0 mm

Тот же двигатель, тот же драйвер, тот же ток и та же цель. Разница только в том, была ли частота шагов разогнана, и вся разница между вариантами — это всё перемещение.

2. Найдите предельную частоту шагов при запуске. Установите сразу на полную скорость, затем увеличивайте максимальную скорость от 100 mm/s шагами. Он работает, работает, а затем примерно около 200 mm/s полностью перестаёт работать — не постепенно. Этот порог — предельная частота шагов при запуске, и это настоящее число настоящих двигателей.

3. Вольты покупают скорость. Загрузите пресет питание 12 V, быстрый ход: перемещение останавливается. Теперь увеличьте напряжение питания до 24 и посмотрите, как оно завершается при неизменном пределе тока. Затем вернитесь к 12 V и попробуйте исправить это пределом тока — не получится. Выше переломной скорости драйвер никогда не достигал заданного тока.

4. Микрошаги не покупают точность. Зафиксируйте всё и переключайте микрошаги от 1/1 до 1/16, читая два значения:

Микрошаги Размер шага Наибольшее отклонение от траектории Ошибка установившегося состояния от нагрузки
Полный шаг 0.200 mm 0.127 mm 0.049 mm
1/4 0.050 mm 0.061 mm 0.044 mm
1/16 0.0125 mm 0.045 mm 0.044 mm

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

5. Выход из синхронизации. Медленно увеличивайте момент сопротивления при небольшой скорости. Следите, как угол запаздывания на нижнем графике приближается к пунктирной линии. Он остановится на 30°, затем 50°, затем 70° — а потом при одном небольшом увеличении ползунка синхронизация исчезнет. Предупреждающей области нет, потому что за 90° нет равновесия, в которое можно было бы установиться.

7. Полный шаг — это толчок на 90°. Загрузите пресет Полный шаг и прочитайте пиковое запаздывание: примерно 102°e. Каждый шаг задаёт полные 90°, и инерция ротора проносит его дальше. Он всё равно прибывает — ничего не теряется, — но всё перемещение проходит через область, в которую нагруженный двигатель не должен заходить. Это одновременно объясняет, почему полный шаг громкий и почему он оставляет так мало запаса по нагрузке.

6. Механизм меняет задачу. Переключите механизм на ходовой винт T8, не меняя остального. Разрешение меняется с 80 на 400 steps/mm, и та же максимальная скорость теперь требует в пять раз большей частоты шагов.

Что следует наблюдать

  • Отказ — это обрыв, а не постепенное ухудшение. Ничего не деградирует. Угол запаздывания плавно растёт до 90°, а затем перемещение просто исчезает. Это определяющее различие между шаговым двигателем и сервоприводом с замкнутым контуром, который просто замедляется под нагрузкой.
  • Машина никогда не знает. Пунктирная заданная линия всегда завершается точно на цели, потому что драйвер отсчитал каждый переданный импульс. Только сплошная линия показывает истину, и у настоящей машины такой линии нет.
  • Ошибка от нагрузки присутствует всегда. Даже при идеальном проходе ротор находится на десятки микрон позади того, что сообщает драйвер. Это не неисправность; этого требует sin(δ) = load ÷ torque.
  • Потерянные шаги всегда кратны четырём. Попробуйте получить другое число.

Переход к реальному оборудованию

Эта лаборатория Настоящая ось
Идеальное время шага 50 kHz Дрожание таймера микроконтроллера и предел около 10–15 kHz на Arduino Uno
Одна жёсткая масса Растяжение ремня, люфт и деформируемая рама
Постоянный момент сопротивления Трение, меняющееся вдоль оси, и сопротивление кабеля
Упрощённая модель обмотки Настоящая кривая момента с моментом защёлкивания и резонансом средней полосы
Идеальное регулирование тока Драйвер, который перегревается, если предел задан слишком высоко
Ничто не нагревается 8 W на двигатель постоянно, пока он находится под напряжением

Самое важное отличие — последнее, но в другом смысле: настоящая машина не даёт нижнего графика. Вы не видите угол запаздывания, а значит, не видите и запас, с которым работаете. Практическая замена — намеренно найти точку отказа: увеличивайте скорость и ускорение, пока ось не начнёт пропускать шаги, затем отступите на значение от 30 до 50 процентов и оставайтесь там.

Начните с руководства по соединениям и настройке предела тока, откалибруйте шаги на миллиметр по линейке и соберите всё вместе в проекте перьевого плоттера.

Исходный код

На настоящей машине без разгона обойтись нельзя. Блокирующая версия ниже похожа на большинство первых скетчей и именно она издаёт гул:

// What not to ship: the step rate jumps from zero to full.
void moveBlocking(long steps, unsigned delayUs) {
  for (long i = 0; i < steps; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(2);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(delayUs);      // constant => no acceleration at all
  }
}

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

#include <AccelStepper.h>

const float STEPS_PER_MM = 80.0;          // 20T GT2 pulley at 1/16 stepping
AccelStepper axis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);              // active low: energise

  axis.setMaxSpeed(200 * STEPS_PER_MM);   // 200 mm/s
  axis.setAcceleration(2000 * STEPS_PER_MM);
}

void loop() {
  if (axis.distanceToGo() == 0) {
    axis.moveTo(axis.currentPosition() == 0 ? lround(60 * STEPS_PER_MM) : 0);
  }
  axis.run();                             // returns immediately — call it constantly
  checkEndstops();                        // which is only possible because it does
}

setMaxSpeed и setAcceleration дают трапецеидальный профиль и больше ничего — в AccelStepper нет опции S-кривой. Для профиля с ограничением рывка уставку нужно создавать самостоятельно и передавать в moveTo по таймеру.

Если нужно узнать, насколько ваша машина близка к границе, дешёвый тест — проверка повторяемости:

// Drive a long move out and back, N times, then check whether home moved.
// Anything other than a multiple of four full steps is not step loss.
for (int i = 0; i < 20; i++) { moveTo(LONG_MOVE); runToPosition(); moveTo(0); runToPosition(); }
// now re-home and compare the reported position against zero

Допущения и отличия от реального оборудования

Динамика ротора честна: момент пропорционален sin(δ) — так работает гибридный шаговый двигатель, а соскальзывание является следствием интегрирования этой зависимости, а не правилом, записанным в код. Константы описывают NEMA 17 класса 17HS4401 — 1.8°, 1.7 A, 2.8 Ω, 3.2 mH, 0.44 N·m удержания, с отражённой кареткой массой 300 g на валу.

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

Ничто из этого не меняет, какой параметр следует изменить. Всё это лишь причины проверять настоящую машину, а не доверять числу с этой страницы.

Схема соединений

Физическая установка, которую моделирует лаборатория, состоит из четырёх проводов от двигателя к драйверу, двух проводов от драйвера к микроконтроллеру и одного конденсатора, о котором часто забывают:

Arduino 5V  ──── VDD
Arduino GND ──── GND (logic) ──┬── GND (motor) ──── PSU −
PSU + (12–24 V) ──── VMOT ──┬──┴── 100 µF electrolytic, close to the board
Pin 3 ──── STEP             RESET ──┬── SLEEP
Pin 4 ──── DIR              MS1, MS2, MS3 ──── 5 V   (1/16)
Pin 5 ──── ENABLE (active low)
Coil A ──── 1A, 1B          Coil B ──── 2A, 2B

Страница компонента A4988 содержит полную распиновку, таблицу Vref для обоих вариантов резисторов измерения и объяснение, почему этот конденсатор не является опциональным.

Список оборудования

Компоненты

  • Двухполярный шаговый двигатель — с шагом 1.8°, 200 полных шагов
  • Драйвер с регулированием тока и настраиваемым пределом
  • Источник питания двигателя 12 V или больше, а также средство для измерения
  • Ось с ремнём или винтом, потому что значение steps/mm — половина ответа

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

Где используется этот симулятор

Проекты, учебные пути и руководства, которые опираются на эту лабораторию.

Продолжайте сборку

Материалы для загрузки

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

Частые вопросы

Часто задаваемые вопросы

Почему мой шаговый двигатель теряет шаги?

Ротор отстал слишком далеко от заданного поля. В пределах 90 электрических градусов — одного полного шага — двигатель возвращает себя в линию, поэтому там должна находиться любая постоянная нагрузка. После 90 доступный момент уменьшается по мере дальнейшего отставания, а к 180 направление меняется, и двигатель тянет уже к следующему полюсу, поэтому ротор соскальзывает к следующей устойчивой точке через целый электрический цикл. За предел выталкивают три вещи: нагрузка больше доступного момента, достаточно крутое ускорение, при которого запуск ротора требует больше момента, чем осталось, и скорость, поскольку доступный момент падает с её ростом. Лаборатория позволяет отдельно вызвать каждую из них.

Почему он теряет ровно четыре шага за раз?

Магнитный рисунок повторяется каждые четыре полных шага. Когда ротор выходит из синхронизации, он не останавливается на произвольном угле, а соскальзывает до следующего устойчивого зуба, то есть на целый электрический цикл, а один цикл равен 360 электрических градусов, то есть четырём полным шагам. Лаборатория никогда не принуждает к этому: она интегрирует синусоидальный закон момента, и число потерянных шагов само всегда получается кратным четырём. Если машина когда-либо отклонилась на число, не кратное четырём полным шагам, причина не в потере шагов.

Делают ли микрошаги машину точнее?

Они делают её плавнее, а не точнее. При фиксированной нагрузке переключите селектор микрошагов от 1/1 до 1/16 и следите за двумя числами отдельно: отклонение от заданной траектории уменьшается примерно в три раза, потому что ротор больше не получает толчки по 90 электрических градусов и не звенит. Ошибка установившегося состояния от нагрузки вообще не меняется: 0.044 mm при полном шаге и 0.044 mm при шестнадцатом шаге. Деление шага заставило эту ошибку выглядеть больше в единицах шагов, но ничего не изменило в самой ошибке.

Нужно ли повышать напряжение или ток, чтобы устранить останов?

Зависит от того, где происходит останов, и лаборатория делает разницу очевидной. Ниже переломной скорости драйвер удерживает заданный предел тока, поэтому момент определяется током — повышайте предел. Выше переломной скорости драйвер больше не может направить заданный ток в обмотку против реактивного сопротивления и противоЭДС (EMF), поэтому момент определяется напряжением питания, а повышение предела тока ничего не меняет, кроме нагрева. Загрузите пресет 12 V и посмотрите, как одно и то же перемещение, не удающееся при 12 V, проходит при 24 V без изменения тока.

Почему одно и то же перемещение работает с разгоном и не работает без него?

Для запуска ротора до скорости нужен момент, а в момент начала перемещения ротор ещё стоит, тогда как заданное поле уже несётся вперёд. Переключите управление частотой шагов сразу на полную скорость, не меняя остального, и запаздывание превысит 90 градусов примерно за миллисекунду и исчезнет к трём: драйвер отсчитывает весь ход 60 mm, пока ось достигает 4 mm. Этот предел — максимальная частота шагов, которую можно задать из состояния покоя, и разгон по ускорению удерживает вас ниже неё.

Именно так работает настоящий двигатель?

Динамика ротора точная: момент пропорционален синусу угла запаздывания — так действительно работает гибридный шаговый двигатель, а поведение при соскальзывании следует из интегрирования этой зависимости. Модель обмотки — упрощённая стационарная модель драйвера с широтно-импульсной модуляцией, а не пофазовая симуляция, поэтому она воспроизводит форму кривой момента из технического описания и даёт правильные инженерные ответы, но консервативно работает в конечной части характеристики. Используйте её для формирования интуиции и понимания, какой регулирующий элемент важен; при проектировании машины используйте настоящую кривую момента.

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

Источники

Авторитетные источники, чтобы пойти глубже ограниченной учебной модели этого симулятора.