Руководство · Начальный · 30 min

Подключение A4988 и Vref: задание предела тока шагового двигателя

Подключите A4988 к Arduino и NEMA 17, затем задайте предел тока мультиметром. Формула Vref, типичная ошибка с резистором измерения тока и цена её пропуска.

Для чего на самом деле нужен драйвер

A4988 — это не переключатель. Это регулятор тока, который заодно выполняет переключение.

Различие важно, потому что обмотка шагового двигателя — это катушка индуктивности с малым сопротивлением, обычно 2–4 Ом. Подключите обмотку 2.8 Ω непосредственно к 24 V, и по закону Ома получится 8.6 A, что за секунды уничтожит двигатель. Работа драйвера — включать и выключать питание тысячи раз в секунду, чтобы средний ток установился на выбранном значении, а затем переключать этот ток между двумя обмотками по схеме, вращающей поле.

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

Плата-носитель A4988, вид сверху, с восемью позолоченными площадками с каждой стороны. Левая колонка площадок: ENABLE, MS1, MS2, MS3, RESET, SLEEP, STEP и DIR, причём STEP и DIR выделены. Правая колонка: VMOT, GND, 2B, 2A, 1A, 1B, VDD и GND, причём VMOT выделен красным. Подстроечный резистор сверху обозначен как VREF для измерения мультиметром, а радиатор закрывает кристалл драйвера. Два маленьких резистора измерения тока внизу обозначены как R100, равный 0.1 Ом, или R050, равный 0.05 Ом, с предупреждением прочитать ваш перед расчётом.
Шестнадцать площадок, один подстроечный резистор и два крошечных резистора, от которых меняется арифметика. STEP и DIR — единственные выводы, к которым ваш скетч обращается во время работы; всё остальное — конфигурация. Скачать SVG

Подключение

Вывод A4988 Куда подключать Примечание
VMOT Питание двигателя 8–35 V Не 5 V Arduino. Никогда.
GND (рядом с VMOT) Земля питания двигателя Обратный путь силового тока
VDD 5 V Arduino Питание логики, несколько миллиампер
GND (рядом с VDD) GND Arduino Должна быть общей с питанием двигателя
1A, 1B Одна обмотка двигателя Любая полярность — меняется только направление
2A, 2B Другая обмотка двигателя Неверное сочетание — фатальная ошибка
STEP Любой выход Arduino Один импульс, один микрошаг
DIR Любой выход Arduino Высокий или низкий уровень задаёт направление
ENABLE GND или вывод Arduino Активен низким уровнем: заземлите для включения
RESET, SLEEP Соединить между собой Оба должны быть на высоком уровне; перемычка соединяет их
MS1, MS2, MS3 Смотреть таблицу ниже Плавающее состояние означает полный шаг

Почти весь риск несут два правила подключения:

  • Электролитический конденсатор 100 µF между VMOT и GND, рядом с платой. Это обязательно. Так говорят техническое описание и документация каждого производителя платы-носителя, потому что ШИМ-преобразователь потребляет ток резкими импульсами; без близкой объёмной ёмкости индуктивность проводов питания превращает эти импульсы в выбросы напряжения, превышающие номинал 35 V кристалла. Платы выходят из строя при включении питания, а не во время работы, и обычно именно по этой причине.
  • Никогда не отключайте двигатель, пока драйвер под питанием. Разрыв энергизированной обмотки создаёт большой индуктивный выброс, которому некуда деваться. Сначала всегда отключайте питание.

Если четыре провода двигателя не промаркированы, найдите пары мультиметром: внутри обмотки вы увидите несколько Ом, а между обмотками — разомкнутую цепь. Соедините пары по сопротивлению, затем одну пару подключите к 1A/1B, а другую — к 2A/2B.

Установка предела тока

На плате есть подстроечный резистор, и его поворот меняет опорное напряжение, с которым кристалл сравнивает напряжение на резисторах измерения тока. Это опорное напряжение — Vref — измеряют между движком резистора и землёй.

Формула A4988:

Vref = I_phase × R_sense × 8

Вот типичная ошибка, из-за которой люди портят двигатели. R_sense не одинаков на всех платах. Платы-носители поставляются с резисторами измерения тока 0.1 Ω или 0.05 Ω, и ответ формулы отличается в два раза:

Резистор измерения Обозначение на плате Vref для 1.0 A Vref для 1.2 A Vref для 1.5 A
0.1 Ω R100 0.80 V 0.96 V 1.20 V
0.05 Ω R050 0.40 V 0.48 V 0.60 V
0.068 Ω R068 0.54 V 0.65 V 0.82 V

Прочитайте обозначение двух чёрных SMD-резисторов рядом с нижним краем платы до любых расчётов. Установив 1.2 V на плате с резисторами 0.05 Ω, вы фактически потребуете 3 A через двигатель на 1.7 A.

Порядок действий:

  1. Подайте питание на плату — VMOT подключён, двигатель отключён. Кристаллу нужно напряжение питания двигателя для регулирования, но вращать двигатель не требуется.
  2. Найдите номинальный ток фазы двигателя. У обычного NEMA 17 это 1.5 A или 1.7 A.
  3. Назначьте целевым 70–85% этого значения. Номинальный ток предполагает охлаждение из технического описания, которого у вас нет, а последние 20% тока дают очень малый момент при большом количестве тепла.
  4. Рассчитайте Vref по формуле и фактическому резистору измерения тока.
  5. Подключите чёрный щуп к выводу земли, а красный — к металлическому винту подстроечного резистора. Вращайте медленно — четверть оборота даёт большое изменение — до значения, которое покажет мультиметр.

Стоит использовать маленькую керамическую отвёртку. Металлическая, которая при включённой плате соединит подстроечный резистор с чем-то ещё, — распространённый способ уничтожить драйвер.

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

Выводы микрошагов

У MS1, MS2 и MS3 есть внутренние подтяжки вниз, поэтому всё, что оставлено плавающим, считывается как низкий уровень:

MS1 MS2 MS3 Разрешение Шагов на оборот
low low low Полный шаг 200
high low low Половинный шаг 400
low high low Четвертной шаг 800
high high low Восьмой шаг 1600
high high high Шестнадцатый шаг 3200

В большинстве конструкций все три вывода соединяют перемычками с высоким уровнем и оставляют так. Причина не в точности — микрошаги не дают точности под нагрузкой — а в том, что при шестнадцатом шаге двигатель перестаёт звенеть на каждом шаге, становясь тише и устраняя пульсации в заготовке. Цена — микроконтроллер теперь должен выдавать в шестнадцать раз больше импульсов на миллиметр, что на Arduino Uno выше примерно 10 000 шагов в секунду становится реальным ограничением.

Управление

Минимальный полезный скетч. Здесь нет библиотеки: шаг — это импульс, и это действительно всё.

const int STEP_PIN = 3;
const int DIR_PIN  = 4;
const int EN_PIN   = 5;   // active LOW

void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);      // energise the coils
  digitalWrite(DIR_PIN, HIGH);
}

void loop() {
  // One revolution at 1/16 stepping = 3200 pulses.
  for (int i = 0; i < 3200; i++) {
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(2);         // datasheet minimum is 1 us
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(300);       // this delay IS the speed
  }
  delay(1000);
}

Этот код работает, но в реальной конструкции его использовать не стоит.

Первая — частота шагов сразу меняется с нуля на полную. Если запросить частоту выше предела запуска двигателя, он загудит и не сдвинется: при настройках по умолчанию в симуляторе шагового двигателя команда полной скорости из состояния покоя приводит к потере 280 полных шагов на перемещении 60 mm и оставляет ось на 4 mm. То же перемещение с разгоном попадает точно в цель. Именно это даёт профиль ускорения, и это не уточнение.

Вторая — delayMicroseconds блокирует. Пока цикл делает шаги, на микроконтроллере ничего другого не выполняется: ни проверки концевого выключателя, ни последовательного порта, ни второй оси. Для любого реального применения используйте шаблон неблокирующего измерения времени или передайте задачу AccelStepper, который реализует разгон и планирование:

#include <AccelStepper.h>
AccelStepper axis(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  pinMode(EN_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);
  axis.setMaxSpeed(8000);        // steps/s  -> 100 mm/s at 80 steps/mm
  axis.setAcceleration(16000);   // steps/s2 -> 200 mm/s2
  axis.moveTo(80 * 50);          // 50 mm
}

void loop() {
  axis.run();                    // returns immediately; call it constantly
}

setMaxSpeed и setAcceleration дают только трапецеидальный профиль, больше ничего: варианта с S-кривой нет. Если нужен профиль с ограничением рывка, формируйте уставку сами.

A4988 или одна из альтернатив?

Драйвер Ток Микрошаги Шум Выбирайте, когда
A4988 1 A без охлаждения, ~1.5 A с охлаждением до 1/16 Слышимый Недорогой, доступен везде, хорошо документирован
DRV8825 1.5 A без охлаждения, ~2.2 A с охлаждением до 1/32 Слышимый Нужен больший ток или более мелкие шаги
TMC2208 ~1.2 A до 1/256 Почти бесшумный Шум важен; именно поэтому принтеры перешли на такие драйверы
TMC2209 ~1.7 A до 1/256 Почти бесшумный Как выше, плюс определение исходного положения без датчиков
ULN2003 + 28BYJ-48 ~0.3 A Половинный шаг Гудящий Демонстрация игрушечного масштаба, а не станок

DRV8825 совместим по выводам, но формула Vref у него другая — Vref = I × 0.5 — и подстроечный резистор вращается в противоположную сторону. Замена без повторного чтения формулы — классический способ испортить двигатель.

Драйверы TMC стоят своих денег, как только станок оказывается в месте, где его слышно. Они выполняют ту же работу с более плавной формой тока, поэтому принтер с ними издаёт шум вентилятора, а не двигателя.

Когда всё идёт не так

Симптом Причина Исправление
Двигатель вибрирует, но не вращается Неверно соединены пары обмоток Найдите пары по сопротивлению и переподключите
Ничего не происходит ENABLE плавает или находится на высоком уровне, либо RESET/SLEEP на низком Заземлите ENABLE; соедините RESET с SLEEP
Драйвер нагревается так, что к нему нельзя притронуться, затем отключается Слишком высокий предел тока Переизмерьте Vref; добавьте радиатор и поток воздуха
Двигатель горячий, а драйвер в порядке Нормально 60–80 °C на корпусе — ожидаемо
Потеря шагов только при быстрых перемещениях Слишком низкое напряжение питания для этой скорости Увеличьте VMOT — больший ток не поможет
Потеря шагов при резких ускорениях Слишком агрессивный разгон или слишком малый ток Уменьшите ускорение или увеличьте Vref к номиналу
Плата умирает сразу после включения питания Нет объёмного конденсатора на VMOT Электролитический конденсатор 100 µF рядом с выводами
Двигатель удерживает позицию, но поворачивается рывками Полный шаг Соедините MS1–MS3 с высоким уровнем для 1/16
Сопротивление «пары» показывает разомкнутую цепь Эти два провода относятся к разным обмоткам Соедините их заново

Далее

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

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

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

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

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

Источники