TMC2208: подключение к Arduino, Vref и замена A4988
Принтер или слайдер на A4988 выдаёт себя ночью: свист обмоток пробирается через закрытую дверь, и первое, что советуют на форумах, — взять TMC2208. Модуль куплен, и тут же гуглится вопрос, на котором спотыкается каждый второй: встанет ли он в колодку A4988 и придётся ли переписывать скетч. Встанет — ENABLE, STEP и DIR сидят на тех же ногах, код работает без правок. Но три вещи после замены меняются незаметно: таблица микрошага у перемычек другая, формула Vref — тоже, а тихий режим имеет свою верхнюю границу скорости.
Ниже — сравнение TMC2208 с A4988 и DRV8825 по пяти критериям, скетч подключения к Arduino на голых digitalWrite, таблица Vref для шунтов 0,11 и 0,1 Ом, разбор UART-режима с библиотекой TMCStepper и список граблей, в которые я наступил сам. Плавный разгон поверх этих же пинов разобран в лендинге про AccelStepper, а поведение TMC2208 в колодке A4988 по шагам — в уроке про тишину TMC2208. Пока модуль едет с маркетплейса, скетч обкатывается в симуляторе.
TMC2208 против A4988 и DRV8825: где разница на самом деле
Все три драйвера живут на плате-степстике одного формата, но роднят их только ноги и общая идея: Arduino отдаёт импульсы STEP и направление DIR, а делением шага и током занимается железо. A4988 — чоппер тока: винт Vref задаёт пиковый ток обмотки, и на средних оборотах обмотка звучит, как пьезоизлучатель. DRV8825 при том же напряжении на винте берёт вдвое больший ток и делит шаг до 1/32, но свист остаётся. TMC2208 решает проблему со стороны звука: его чоппер StealthChop сглаживает пульсации тока до почти синуса — пропадает сам источник свиста, — а интерполяция добивает каждый входной импульс до 1/256 микрошага, так что ротор между командами Arduino проходит 51200 позиций на оборот вместо двухсот.
| Критерий | A4988 | DRV8825 | TMC2208 |
|---|---|---|---|
| Шум на средних оборотах | Свист и стрёкот слышны через стол | Тот же свист, тон выше | StealthChop: тишина до верхней трети скорости |
| Микрошаг | 1/1-1/16 перемычками MS1-MS3 | 1/1-1/32 | MS1-MS2: 1/8-1/64, интерполяция до 1/256 |
| Ток без радиатора | Около 1 А RMS | До 1,5 А RMS | 1,2 А RMS; даташитные 2 А — только с охлаждением |
| Vref задаёт | Пиковый ток: I = Vref × 1,25 при R100 | Пиковый ток: I = Vref × 2 при R100 | Ток RMS: Irms = Vref × 0,71 при R110 |
| Охлаждение | Радиатор сверху | Радиатор сверху | Радиатор сверху плюс обдув при токе выше ампера |
Моё правило после трёх переделок: берите 2208 на оси, которые крутятся медленно и живут рядом со спящими людьми — шторы, слайдер, кормушка, первые слои принтера. Для каретки на пределе механики тишина превращается в минус: на верхней трети скорости StealthChop держит момент хуже SpreadCycle, и ось срывает шаги там, где A4988 доезжал. И ещё одна граница, о которой молчат описания модулей: перемычкой SpreadCycle на 2208 не включается — в standalone драйвер живёт в StealthChop, а выбор чоппера появляется только вместе с UART.
Подключение к Arduino: STEP и DIR, как у A4988
Схема минимальна: VM и GND — силовое питание, пары обмоток 1A/1B и 2A/2B — на мотор, общий GND с Arduino обязателен, а полная карта колодки с конденсатором вплотную к клеммам — та же, что у A4988: она разобрана в уроке про подключение A4988. Сигнальная часть — три любых цифровых пина, здесь EN на D4, DIR на D3 и STEP на D2. EN притяните к LOW явно, а не «пусть повисит»: модули разных партий ведут себя по-разному, и вал, который крутится рукой без сопротивления, всегда выдаёт спящий драйвер раньше Serial-лога.
// TMC2208 в standalone: STEP=D2, DIR=D3, EN=D4.// Перемычки MS1-MS2 задают 1/8: 200 шагов NEMA17 x 8 = 1600 импульсов на оборот.const int PIN_STEP = 2;const int PIN_DIR = 3;const int PIN_EN = 4;const int PULSES_REV = 1600; void stepPulses(int count, bool forward) { digitalWrite(PIN_DIR, forward ? HIGH : LOW); delayMicroseconds(10); // DIR устаканить до первой серии for (int i = 0; i < count; i++) { digitalWrite(PIN_STEP, HIGH); delayMicroseconds(500); digitalWrite(PIN_STEP, LOW); delayMicroseconds(500); // 1 мс на импульс — около 37 об/мин }} void setup() { pinMode(PIN_STEP, OUTPUT); pinMode(PIN_DIR, OUTPUT); pinMode(PIN_EN, OUTPUT); digitalWrite(PIN_EN, LOW); // LOW — драйвер активен} void loop() { stepPulses(PULSES_REV, true); // оборот вправо delay(500); stepPulses(PULSES_REV / 2, false); // пол-оборота назад delay(500);}Число 1600 в PULSES_REV — это двести полных шагов NEMA17, умноженные на деление 1/8 с перемычек: переставите мостик на MS1-MS2 — пересчитайте константу, потому что таблица у 2208 начинается с 1/8 и уровни не совпадают с A4988. Период в 1 мс даёт тысячу импульсов в секунду и около 37 об/мин на холостом валу — с грузом не гоните: у STEP-входа нет буфера движений, и без разгона вал на старте срывается. Для плавного старта оберните те же пины в AccelStepper в режиме DRIVER — механика разгона разобрана в лендинге про AccelStepper, а чем микрошаг отличается от полушага по моменту и точности — в уроке про 16 микрошагов.
Vref и ток: формула и щуп
Главная ловушка перехода с A4988 — единицы. Винт A4988 задаёт пиковый ток: I = Vref × 1,25 на типовых шунтах 0,1 Ом. У TMC2208 винт задаёт сразу действующий (RMS) ток, и множитель другой: Irms = Vref × 0,71 на шунтах 0,11 Ом — «вольт на винте» означает примерно 0,7 ампера. Кто выставил по привычке 0,8 В под ампер, получит 0,57 А RMS и мотор, который тихо сдаёт момент под нагрузкой — без ошибок и запаха. После замены перемерьте ток с нуля: красный щуп мультиметра на винт подстроечника, чёрный на GND, моторы отключены.
| Ток RMS | Vref при шунтах 0,11 Ом | Vref при шунтах 0,1 Ом |
|---|---|---|
| 0,5 А | 0,71 В | 0,64 В |
| 0,8 А | 1,13 В | 1,03 В |
| 1,0 А | 1,41 В | 1,28 В |
| 1,2 А | 1,69 В | 1,54 В |
Практическая цель — 70-80% паспортного тока фазы: мотор 17HS4401 с номиналом 1,7 А живёт при 1,2-1,35 А RMS, то есть винт на 1,69-1,92 В при шунтах 0,11 Ом. Выше момент не растёт — тепло уходит в обмотку и корпус драйвера. Методика замера и перепроверка винта на прогретом модуле совпадают с A4988 — они разобраны в уроке про Vref на A4988, множители там свои. И проверьте винт до покупки ожиданий: часть дешёвых модулей вместо подстроечника несёт фиксированный делитель — такой экземпляр не настраивается вовсе.
UART-режим: один пин вместо отвёртки
PDN_UART — единственный пин, который отличает TMC2208 от A4988 в колодке: через него драйвер слушает и отвечает по однопроводному UART на 115200 бод. TX платы уходит в PDN_UART через резистор 1 кОм, RX подключается напрямую — и одна линия заменяет всё: ток фазы, деление шага вплоть до родного 1/256 без интерполяции и режим чоппера задаются числами из скетча, менять их можно на лету из прошивки. Для базового подключения UART не нужен — перемычек и винта хватает; его смысл появляется, когда осей становится больше двух и ток хочется крутить из меню, а не щупом. И честная граница: детекции заклинившего вала у 2208 нет — DIAG-выход и StallGuard живут на TMC2209, про который написано в уроке про DRV8825 и TMC2209.
#include <TMCStepper.h> // RX платы - напрямую в PDN_UART, TX - через резистор 1 кОм.// Библиотека: TMCStepper (автор teemuatlut) из менеджера библиотек.// Скетч сокращён из примеров библиотеки до трёх рабочих команд.TMC2208Stepper driver(&Serial, 0.11); // шунты 0,11 Ом - как на типовых модулях void setup() { Serial.begin(115200); driver.begin(); // UART-связь и базовые регистры driver.rms_current(800); // 0,8 А RMS вместо отвёртки driver.microsteps(256); // родное деление 1/256 driver.en_spreadCycle(false); // StealthChop: тихий режим} void loop() {} // настройка задана, шагают обычные STEP/DIR с D2/D3- Воткнули TMC2208 в колодку с A4988-перемычками 1/16 — деление вышло другим: таблица MS1-MS2 у 2208 начинается с 1/8, пересчитайте импульсы на оборот
- Мотор стоит, вал крутится рукой без сопротивления — EN не притянут к LOW или пропал общий GND между Arduino и силовым питанием
- Момент пропал после замены — Vref выставлен по формуле A4988: те же 0,8 В на 2208 дают 0,57 А RMS вместо ампера
- Шаги срываются через полчаса работы — ток выше ампера без радиатора и обдува: драйвер прогрелся и сдал
- Свист вернулся на быстром перегоне — StealthChop на верхней трети скорости держит момент хуже SpreadCycle: снизьте скорость или настройте чоппер через UART