В этой статье мы рассмотрим TMC2208, популярный модуль драйвера, используемый для управления двухфазными биполярными шаговыми двигателями. Известный своей высокой эффективностью и бесшумной работой, TMC2208 разработан немецкой компанией Trinamic, которая специализируется на продуктах управления движением. Этот модуль драйвера широко используется в различных приложениях благодаря своей способности обеспечивать плавную и бесшумную работу.
Близкой альтернативой TMC2208 является драйвер шагового двигателя A4800, и мы уже рассматривали, как использовать драйвер шагового двигателя A4988 с Arduino, вы также можете проверить это, если вам интересно.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Шаговый двигатель NEMA 17 (купить на AliExpress).
- Модуль драйвера шагового двигателя TMC2208.
- Макетная плата
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Драйвер шагового двигателя TMC2208
К особенностям модуля драйвера шагового двигателя TMC2208 можно отнести следующие.
Бесшумная работа
Одной из выдающихся особенностей TMC2208 является его способность работать практически бесшумно. Это достигается с помощью StealthChop2 от Trinamic, бесшумного, высокоточного алгоритма прерывателя для бесшумного движения и бесшумной остановки двигателя.
Плавный ход
TMC2208 имеет микрошаговый интерполятор, который обеспечивает до 256 микрошагов, что позволяет очень точно контролировать движения двигателя. Это обеспечивает более плавное движение и более высокую точность позиционирования.
Простое подключение
TMC2208 разработан для легкой интеграции с существующими системами. Он поддерживает стандартный интерфейс step/dir и может быть настроен через UART для расширенных функций и тонкой настройки.
Текущий контроль
С TMC2208 вы можете легко регулировать ток двигателя через встроенный потенциометр или UART-коммуникацию. Это обеспечивает оптимальную производительность и эффективность за счет минимизации тепловыделения и энергопотребления.
Автоматическое отключение питания при остановке
Эта функция обнаружения нагрузки без датчика позволяет TMC2208 обнаруживать остановку двигателя и обеспечивать обратную связь без необходимости использования дополнительных датчиков. Она повышает надежность и защищает двигатель от чрезмерного тока.
Меры предосторожности и безопасности
Драйверы двигателей TRINAMIC предлагают защитные функции для обнаружения и защиты от закороченных выходов, разомкнутой цепи выхода, перегрева и пониженного напряжения. Эти функции повышают безопасность и обеспечивают восстановление после неисправностей оборудования.
Распиновка TMC2208
Для новичка 16 контактов этого модуля могут показаться сложными, но поверьте мне, их легко понять и использовать. Ниже вы можете увидеть маркировку выводов модуля шагового драйвера TMC2208 с использованием фактического изображения драйвера. В данный момент я хотел бы упомянуть, что модуль, который мы используем в этом руководстве, — это TMC2208 V2.0, поэтому, пожалуйста, обращайтесь к нему соответствующим образом.
В следующей таблица приведено краткое описание контактов модуля.
Номер контакта | Обозначение контакта | Тип контакта | Назначение контакта |
1 | EN | Цифровой вход | Разъем включения драйвера |
2 | MS1 | Цифровой вход (pd) | Конфигурация микрошагового разрешения Pins |
3 | MS2 | Цифровой вход (pd) | Конфигурация микрошагового разрешения Pins |
4 | NC | - | Нет подключений |
5 | PDN | Цифровой вход и выход | Контакт отвечает за автоматическое отключение питания при низком уровне. Может также использоваться для связи UART. |
6 | CLK | Цифровой вход | Вход часов для подключения внешних часов при необходимости. |
7 | STEP | Цифровой вход | Шаг ввода |
8 | DIR | Цифровой вход (pd) | Вход направления, активный низкий уровень |
9 | GND | Питание | земля (общий провод) |
10 | VIO | Питание | Напряжение питания 3,3 В - 5 В для всех цифровых выводов |
11 | M2A | Аналоговый выход | Катушка двигателя А Выход 2 |
12 | M1A | Аналоговый выход | Катушка двигателя А Выход 1 |
13 | M1B | Аналоговый выход | Катушка двигателя B Выход 1 |
14 | M2B | Аналоговый выход | Катушка двигателя B Выход 2 |
15 | GND | Питание | Контакт заземления |
16 | VM | Питание | Напряжение питания двигателя Pin |
(pd) - Active Pull-Down |
Давайте более подробно рассмотрим назначение некоторых контактов.
EN: Это контакт включения питания для питания двигателя. Поддержание его в состоянии HIGH отключает двигатель, а поддержание его в состоянии LOW включает двигатель.
MS1 и MS2: Это цифровые входные контакты, используемые для настройки разрешения микрошага. Ниже вы можете увидеть таблицу, которая определяет соответствующее разрешение микрошага для предоставленного шаблона ввода.
MS1 | MS2 | Разрешение микрошага |
LOW | LOW | 1/8 |
LOW | HIGH | 1/2 |
HIGH | LOW | 1/4 |
HIGH | HIGH | 1/16 |
NC: Это означает отсутствие контакта подключения, так что не обращайте на это внимания.
PDN: Этот контакт немного сбивает с толку, поскольку он может действовать как вход и выход. Если этот контакт удерживается на низком уровне, происходит автоматическое снижение тока покоя, что снижает потери мощности и вероятность перегрева. В качестве альтернативы этот контакт можно напрямую использовать как вход и выход UART, что является дополнительной функцией. Помните, что в этом модуле этот контакт подключен к джамперу. Если вам нужно его использовать, вы должны сначала подключить джампер; в противном случае контакт внутренне настроен как PullDown.
CLK: Это входной контакт синхронизации. Если этот контакт подтянут к LOW, используется внутренний тактовый сигнал. В противном случае вы можете предоставить внешний тактовый сигнал. Это рекомендуется для расширенных вариантов использования. Например, использование более низкого тактового импульса, например 4 МГц, может снизить энергопотребление и электромагнитные излучения, но это может привести к некоторому снижению производительности.
STEP: Этот контакт используется для управления шагом шагового двигателя. Каждый восходящий фронт может повернуть вал на один шаг.
DIR: Этот контакт используется для управления направлением вращения двигателя. Он определяет, вращается ли двигатель по часовой стрелке или против часовой стрелки. Факторы, такие как проводка двигателя, влияют на фактическое направление. Если упростить, то при сохранении НИЗКОГО уровня двигатель вращается в одном направлении, а при сохранении ВЫСОКОГО уровня — в противоположном направлении.
M2A, M1A, M1B, M2B: Эти контакты используются для подключения двигателя. Найти правильную конфигурацию проводов просто. Для упрощения вы можете использовать измеритель непрерывности, чтобы определить конечные клеммы каждой катушки. Эти две отдельные катушки известны как катушка A и катушка B. Подключите клеммы катушки A к M1A и M2A, а клеммы катушки B к M1B и M2B соответственно. Вот и все.
VIO, VM, GND: Это входы питания для модуля драйвера. Обычно каждая клемма заземления является общей. VIO питает вход и выход драйвера, а VM питает только двигатель. VIO работает при напряжении около 3–5,5 вольт, в то время как VM должен соответствовать требованиям напряжения самого двигателя.
Схема модуля TMC2208
Чтобы узнать больше об этом модуле, давайте взглянем на его схему. На следующем рисунке показаны основные компоненты модуля драйвера шагового двигателя TMC2208 V2.0.
А на следующем рисунке представлена схема модуля, которую мы реверсировали. Это поможет людям, которые заинтересованы в интеграции микросхемы TMC2208 непосредственно в свой проект. Также это будет полезно для энтузиастов электроники, чтобы больше узнать о внутреннем устройстве модуля и о том, как он работает.
Что мне хотелось бы отметить в этой схеме:
- Модуль TMC2208 V2.0 точно соответствует схеме применения, приведенной в официальном техническом описании.
- Большинство требуемых контактов напрямую подключены к контактам разъема модуля, за исключением PDN и CLK. Эти два контакта электрически изолированы с помощью резистора-перемычки. Вы можете найти резистор-перемычку на изображении маркировки деталей выше. Чтобы обойти перемычку, просто припаяйте две имеющиеся там контактные площадки, убедившись, что никакие другие компоненты не будут нарушены.
- Для расширенных вариантов использования доступны три тестовых контакта.
- Здесь все земли соединены, чтобы поддерживать общую землю.
- Для обеспечения максимального тока, обеспечиваемого модулем, используется чувствительный резистор на 110 миллиом. Согласно техническому описанию, сопротивление 110 миллиом подходит для двигателей с номинальным током до 1,5 А.
Схема проекта
Схема подключения драйвера шагового двигателя TMC2208 к плате Arduino представлена на следующем рисунке.
В данной схеме мы используем источник питания 5 В как для цифровых входов/выходов, так и для двигателя, поступающий с платы Arduino UNO. Это подходит для нашего демонстрационного проекта, но обычно мы используем отдельный источник питания для управления двигателями. Для управления TMC2208 мы будем использовать три цифровых контакта на Arduino (8, 9 и 10), которые соответствуют контактам EN, STEP и DIR на TMC2208. Для этой цели можно использовать любые цифровые выходные контакты. Мы не используем связь UART, чтобы упростить задачу.
Далее мы подключим двигатель к драйверу. Двигатель имеет четыре провода, которые являются концами двух отдельных катушек. Вы можете найти нужные провода катушки, проверив их с помощью тестера наличия соединения. Подключите провода катушки A к M1A и M2A, а провода катушки B к M1B и M2B. Это просто, и вам не нужно беспокоиться о полярности катушек — это просто изменит направление двигателя, не вызывая никаких проблем. Подробные инструкции по подключению см. на схеме выше.
Собранная конструкция проекта показана на следующем рисунке. Как уже упоминалось, мы просто используем шину питания Arduino 5V для питания всей схемы проекта.
Объяснение работы кода
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Поскольку мы не используем UART для управления двигателем, код будет выглядеть проще. Здесь мы собираемся выполнять такие функции, как вращение двигателя с фиксированной скоростью и изменение направления вращения двигателя. Итак, давайте перейдем к коду.
Вначале вы можете увидеть определения контактов. Как уже обсуждалось, я использую контакты 8, 9 и 10 Arduino UNO, которые подключаются к EN, STEP и DIR модуля TMC2208.
1 2 3 4 |
// Определения контактов #define EN_PIN 8 // LOW: Драйвер включен, HIGH: Драйвер отключен #define STEP_PIN 9 // Шаг по восходящему фронту #define DIR_PIN 10 // Установить направление шага |
Далее объявляются две переменные. «noOfSteps» управляет количеством шагов, которые необходимо переместить, а «microSecondsDelay» устанавливает задержку между каждым шагом в микросекундах.
1 2 |
int noOfSteps = 250; // Количество шагов для перемещения в каждом направлении int microSecondsDelay = 1000; // Задержка в микросекундах между каждым шагом |
В функции void setup() выводы 8, 9 и 10 устанавливаются как ВЫХОД. Изначально контакт направления вращения (DIR_PIN) устанавливается в НИЗКИЙ уровень для установки начального направления. Контакт включения (EN_PIN) также устанавливается в НИЗКИЙ уровень, что активирует драйвер и питает двигатель. Поддержание EN_PIN в ВЫСОКОМ уровне отключит двигатель независимо от состояния драйвера. Такая настройка гарантирует, что двигатель включен и готов к работе при запуске программы.
1 2 3 4 5 6 7 8 9 10 |
void setup() { // Настроить режимы вывода pinMode (EN_PIN, ВЫХОД); pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); // Инициализация состояний выводов digitalWrite(DIR_PIN, LOW); // Установить начальное направление digitalWrite(EN_PIN, LOW); // Включить драйвер } |
В функции void loop()
есть два идентичных цикла for
, которые управляют шаговым двигателем. Каждый цикл переключает направление двигателя, изменяя состояние DIR_PIN
. Двигатель попеременно движется вперед и назад, в зависимости от того, установлен ли DIR_PIN
на низкий или высокий уровень.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void loop() { // Переместить мотор в одном направлении digitalWrite(DIR_PIN, LOW); // Установить направление LOW for(int i = 0; i < noOfSteps * 2; i++) { digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Переключить шаговый контакт delayMicroseconds(microSecondsDelay); // Ждать указанную задержку } // Переместить мотор в противоположном направлении digitalWrite(DIR_PIN, HIGH); // Установить направление HIGH for(int i = 0; i < noOfSteps * 2; i++) { digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Переключить шаговый контакт delayMicroseconds(microSecondsDelay); // Ждать указанную задержку } } |
Во время каждой итерации цикла двигатель делает указанное количество шагов (noOfSteps * 2
) и делает короткую паузу между шагами (delayMicroseconds(microSecondsDelay)
) для регулирования скорости. Этот процесс повторяется непрерывно, демонстрируя базовое управление двигателем с использованием цифровых сигналов и задержек.
Двигатель перемещается на один шаг за переход STEP_PIN
с низкого на высокий, что имеет решающее значение для его вращения. Изменение направления осуществляется просто: сохранение DIR_PIN
на низком уровне увеличивает шаги, а установка на высоком уровне уменьшает шаги. Эта установка иллюстрирует основные принципы управления двигателем с использованием простых методов цифрового управления.
Тестирование работы проекта
После загрузки кода в Arduino Uno и выполнения всех необходимых подключений вы можете протестировать работу двигателя. Мы уже знаем, что есть три фактора, которые влияют на вращение двигателя: разрешение MicroStep, синхронизация между каждым шагом и конфигурация направления. Вы можете изменить эти факторы, чтобы изучить и узнать больше об управлении двигателем с помощью модуля TMC2208.
Демонстрацию работы нашего проекта вы можете посмотреть на следующей gif картинке.
Часто задаваемые вопросы
TMC2208 против TMC2209
На самом деле, TMC2209 — это более новая модель по сравнению с TMC2208, которая поставляется с множеством дополнительных функций. Давайте сравним их, взглянув на таблицу ниже.
Функция | ТМС2208 | ТМС2209 |
Интерфейс Шаг/Направление | Да | Да |
Интерфейс UART | Да | Да |
Интерполяция MicroPlyer (плавный ход) | Да | Да |
Разрешение микрошага | 256 | 256 |
StallGuard (бессенсорное обнаружение нагрузки и остановки) | Нет | Да |
CoolStep (управление током для экономии энергии) | Нет | Да |
StealthChop (Бесшумная работа двигателя) | Да | Да |
Сопротивление сток-исток - низкое состояние | 280мОм | 170мОм |
Сопротивление сток-исток - высокое состояние | 290мОм | 170мОм |
Максимальный ток | 2А | 2,8А |
Диапазон напряжения | 4,75–36 В | 4,75В - 29В |
Модуль TMC2209 предлагает улучшенные функции, такие как пониженное сопротивление драйвера, StallGuard и CoolStep, что делает его более продвинутым и универсальным по сравнению с TMC2208.
Модуль TMC2208 v3.0
Модуль, который мы использовали в этой статье, — это TMC2208 v2.0. Однако есть более новый модуль, который называется BIGTREETECH TMC2208-V3.0 Stepper Motor Driver. Этот модуль v3.0 создан BIGTREETECH, популярной компанией, известной производством 3D-принтеров.
Особенности TMC2208 V3.0
Универсальность в термических характеристиках: модуль TMC2208 V3.0 разработан с улучшенным тепловым управлением.
Компоновка компонентов: большинство компонентов спрятаны под печатной платой, за исключением потенциометра, используемого для настройки тока tmc2208.
Документация: BIGTREETECH предоставляет полную документацию для этого модуля, что упрощает его использование и интеграцию.
Заключение
Если вы можете себе это позволить, то TMC2208 V3.0 — лучший выбор из-за его расширенных функций и лучшей конструкции для управления температурой. Однако, если бюджет имеет значение, то TMC2208 v2.0 также является хорошим вариантом и работает хорошо.
Исходный код программы
Схему проекта и код программы вы также можете скачать по следующей ссылке на github.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// Определения контактов #define EN_PIN 8 // LOW: Драйвер включен, HIGH: Драйвер выключен #define STEP_PIN 9 // Шаг по переднему фронту #define DIR_PIN 10 // Установка направления шага int noOfSteps = 250; // Количество шагов для перемещения в каждом направлении int microSecondsDelay = 1000; // Задержка в микросекундах между каждым шагом void setup() { // Настройка режимов выводов pinMode(EN_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); // Инициализация состояний выводов digitalWrite(DIR_PIN, LOW); // Установка начального направления digitalWrite(EN_PIN, LOW); // Включение драйвера } void loop() { // Переместить двигатель в одном направлении digitalWrite(DIR_PIN, LOW); // Установить направление LOW for (int i = 0; i < noOfSteps * 2; i++) { digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Переключить шаговый вывод delayMicroseconds(microSecondsDelay); // Ожидание указанной задержки } // Переместить двигатель в противоположном направлении digitalWrite(DIR_PIN, HIGH); // Установить направление HIGH for (int i = 0; i < noOfSteps * 2; i++) { digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); // Переключить шаговый вывод delayMicroseconds(microSecondsDelay); // Ожидание указанной задержки } } |