Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Итак, вы планируете собрать собственного двухколёсного робота? Отлично! Один из самых важных шагов в оживлении вашего робота — это выбор правильного драйвера двигателей.

Если вы уже искали информацию, то наверняка встречали классические драйверы двигателей, такие как `L293D `_ или `L298N `_. Они существуют уже более двух десятилетий и до сих пор широко используются — и не зря. Они просты в использовании, надёжны и очень доступны по цене, что делает их особенно популярными в школах, хобби-проектах и наборах для начинающих.

Но вот в чём дело: и L293D, и L298N используют H-мостовые схемы на биполярных транзисторах (BJT), которые не очень энергоэффективны. Они теряют энергию в виде тепла, требуют более высокого напряжения и не идеальны для проектов с батарейным питанием.

Именно здесь на помощь приходит драйвер двигателей TB6612FNG. Это современный драйвер на основе MOSFET-транзисторов, который обладает рядом преимуществ. Он более эффективен, поэтому меньше нагревается и тратит меньше энергии. Он работает при более низких напряжениях, что делает его идеальным для плат с логикой 3.3В и 5В. Он также имеет компактные размеры, что идеально подходит для ограниченного пространства в роботах, дронах и других компактных проектах.

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

Давайте начнём!

Основы управления двигателями

Прежде чем изучать драйвер двигателей TB6612FNG, важно понять два ключевых понятия:

  • H-мост — позволяет управлять направлением вращения двигателя

  • PWM (Широтно-Импульсная Модуляция) — помогает управлять скоростью двигателя постоянного тока

Управление направлением с помощью H-моста

Двигатели постоянного тока — самые простые в использовании! Если подключить батарею к двигателю постоянного тока, он будет вращаться в одном направлении. Если поменять провода местами, он будет вращаться в другом направлении. Но нельзя каждый раз физически менять провода, когда нужно изменить направление. Именно здесь пригодится H-мост!

H-мост — это специальная схема с четырьмя электронными переключателями, расположенными в форме буквы «H», с двигателем посередине.

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

Анимация ниже показывает, как работает H-мост.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Управление скоростью с помощью PWM (Широтно-Импульсная Модуляция)

Когда на двигатель постоянного тока подаётся фиксированное напряжение, он вращается с постоянной скоростью. Если вы хотите изменить скорость, нужно изменить напряжение. Более высокое напряжение заставляет двигатель вращаться быстрее, а более низкое — медленнее.

Однако постоянно менять напряжение физически не очень практично. Именно здесь на помощь приходит PWM — широтно-импульсная модуляция.

PWM — это умный способ управления средним количеством энергии, подаваемой на двигатель. Вместо подачи фиксированного напряжения, PWM быстро включает и выключает напряжение очень короткими импульсами.

«Ширина» каждого импульса включения, также называемая коэффициентом заполнения (duty cycle), определяет, как долго напряжение находится во включённом состоянии в каждом цикле.

  • Если напряжение включено большую часть времени (более широкий импульс), двигатель получает более высокое среднее напряжение и вращается быстрее.

  • Если напряжение выключено большую часть времени (более узкий импульс), двигатель получает более низкое среднее напряжение и вращается медленнее.

Изображение ниже показывает, как различные коэффициенты заполнения влияют на скорость двигателя.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Микросхема драйвера двигателей TB6612FNG

TB6612FNG в первую очередь предназначен для управления индуктивными нагрузками, такими как двигатели постоянного тока, шаговые двигатели, реле и соленоиды.

Он работает как усилитель тока, то есть принимает слаботочные управляющие сигналы от микроконтроллера (например, Arduino) и усиливает их до более высоких уровней тока и напряжения, необходимых для работы двигателей.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

В основе TB6612FNG лежат две отдельные схемы H-моста. Поэтому он может управлять двумя различными двигателями постоянного тока одновременно. Вы даже можете объединить эти два H-моста для управления биполярным шаговым двигателем.

Питание

TB6612FNG довольно гибок в плане питания. Он может работать с широким диапазоном напряжений от 4.5В до 13.5В и обеспечивать до 1.2А непрерывного (и 3.2А пикового) тока на канал, что означает, что он справится с любыми двигателями — от маленьких хобби-моторов до более крупных и мощных.

Встроенные защитные диоды

Одна из самых важных функций безопасности TB6612FNG — это встроенные защитные диоды (также называемые обратными или демпферными диодами). Они очень важны при работе с индуктивными нагрузками, такими как двигатели.

Когда вы резко выключаете двигатель, его магнитное поле разрушается. Это может вызвать скачок напряжения в цепи. Это обратное напряжение (называемое обратной ЭДС или электродвижущей силой) может повредить ваш микроконтроллер или другие чувствительные компоненты.

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

Термозащита

TB6612FNG также имеет встроенную термозащиту. Это означает, что если микросхема перегреется — например, из-за того, что двигатель потребляет слишком много тока или микросхема недостаточно охлаждается — TB6612FNG автоматически временно отключит свои выходы для предотвращения повреждений. Как только микросхема остынет до безопасной температуры, она автоматически возобновит работу.

Технические характеристики

Вот основные характеристики:

Выходное напряжение двигателя

4.5В – 13.5В

Напряжение логического входа

2.7В – 5.5В

Непрерывный ток на канал

1.2A

Пиковый ток на канал

3.2A

Максимальная частота PWM

100kHz

Максимальная рассеиваемая мощность

0.78Вт

Для получения дополнительной информации обратитесь к техническому описанию ниже.

`TB6612FNG Datasheet `_

Распиновка модуля драйвера TB6612FNG

Модуль TB6612FNG имеет 16 выводов.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

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

Выводы питания

На модуле TB6612FNG есть два вывода питания: VM и VCC.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

VM — это основной вход питания для двигателей. Вы можете подключить любое напряжение от 4.5В до 13.5В, в зависимости от используемого двигателя.

VCC — это вход питания для внутренней логической схемы микросхемы. Допустимый диапазон напряжения для этого вывода составляет от 2.7В до 5.5В, поэтому он хорошо работает как с 3.3В, так и с 5В микроконтроллерами. Просто убедитесь, что напряжение, подаваемое на этот вывод, соответствует логическому уровню используемого микроконтроллера. Например, если вы используете Arduino, который обычно работает с логикой 5В, то подключите VCC к источнику 5В.

GND — общий вывод заземления модуля. И источник питания двигателей, и ваш микроконтроллер (например, Arduino) должны иметь общее заземление через этот вывод.

Выводы подключения двигателей

Это выводы, к которым непосредственно подключаются ваши двигатели постоянного тока.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Выводы A1 и A2 подключаются к первому двигателю (двигатель A), а выводы B1 и B2 — ко второму двигателю (двигатель B). К этим выводам можно подключить любой двигатель постоянного тока, работающий от 5 до 13 вольт.

Выводы управления направлением

Эти выводы управляют направлением вращения двигателей путём включения и выключения внутренних переключателей H-моста:

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Микросхема имеет два вывода управления направлением для каждого двигателя. Выводы AIN1 и AIN2 управляют направлением вращения двигателя A, а выводы BIN1 и BIN2 — направлением вращения двигателя B.

Устанавливая различные комбинации сигналов HIGH или LOW на этих выводах, можно заставить двигатели вращаться вперёд, назад или остановиться. Таблица ниже показывает, как именно это работает:

Input1

Input2

Направление вращения

Low(0)

Low(0)

Торможение

High(1)

Low(0)

Вперёд

Low(0)

High(1)

Назад

High(1)

High(1)

Торможение

Выводы управления скоростью

Выводы PWMA и PWMB управляют скоростью вращения двигателей.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

На самом деле эти выводы работают как простые переключатели включения/выключения. Когда вы устанавливаете один из них в HIGH, соответствующий двигатель включается и вращается на полной скорости. Когда вы устанавливаете его в LOW, двигатель полностью отключается и не вращается.

Но эти выводы могут делать больше, чем просто включать и выключать двигатели. Подавая PWM-сигнал с частотой до 100кГц на PWMA или PWMB, вы можете управлять скоростью каждого двигателя.

PWM работает путём очень быстрого включения и выключения двигателя — много раз в секунду. Скорость зависит от того, как долго двигатель остаётся включённым в каждом цикле (так называемый коэффициент заполнения). Если сигнал включён большую часть времени, двигатель вращается быстрее. Если он включён лишь на короткое время, двигатель вращается медленнее.

Вывод режима ожидания

Вывод STBY позволяет быстро отключить оба двигателя одновременно.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

По умолчанию этот вывод подтянут к низкому уровню внутренним подтягивающим резистором 200КОм, что удерживает двигатели в отключённом состоянии. Чтобы включить двигатели и позволить им работать, необходимо подтянуть этот вывод к HIGH. Это можно сделать, подключив вывод непосредственно к VCC или используя выходной пин микроконтроллера для подачи высокого уровня.

Подключение модуля TB6612FNG к Arduino

Теперь, когда мы знаем, как работает модуль TB6612FNG, можно приступить к его подключению к Arduino!

Начнём с подключения питания к двигателям. В этом эксперименте мы используем TT-моторы, которые обычно применяются в двухколёсных роботах. Эти двигатели обычно хорошо работают при напряжении от 3В до 6В. Поэтому мы подключим внешний источник питания 5В к выводу VM.

Далее нужно подать логическое питание на внутреннюю схему драйвера. Вывод VCC на модуле TB6612FNG принимает входное напряжение 2.7В–5.5В, что соответствует выходу 5В Arduino. Поэтому подключите вывод 5V Arduino к VCC, а GND к GND.

Теперь займёмся выводами управления. Модуль TB6612FNG имеет четыре входных вывода — AIN1, AIN2, BIN1 и BIN2, — которые используются для управления направлением вращения двигателей. Мы подключим их к цифровым выходным пинам 5, 4, 7 и 8 на Arduino.

Для управления скоростью двигателей TB6612FNG имеет входные PWM-выводы PWMA и PWMB. Их следует подключить к PWM-пинам Arduino — 3 для PWMA и 9 для PWMB.

Также необходимо подключить вывод STBY к логическому высокому уровню, чтобы включить драйвер двигателей. В нашей схеме мы просто подключим его напрямую к VCC. Это очень важный шаг — если вы его пропустите, драйвер останется в режиме ожидания, и двигатели не будут работать.

Наконец, подключите двигатели к выходным выводам. Двигатель A подключается к A1 и A2, а двигатель B — к B1 и B2. Не слишком беспокойтесь о том, какой провод двигателя к какому выходу подключать — если двигатель вращается в неправильном направлении, вы можете просто поменять провода местами, так как нет «правильного» или «неправильного» способа подключения.

Вот краткая справочная таблица подключений:

TB6612FNG Motor DriverArduino
VCC5V
STBY5V
GNDGND
PWMA3
AIN24
AIN15
BIN17
BIN28
PWMB9

Изображение ниже показывает полную схему подключения.

Управление двигателями постоянного тока с помощью TB6612FNG и Arduino

Пример кода для Arduino

Вот простой скетч для Arduino, который демонстрирует управление направлением и скоростью двух двигателей постоянного тока с помощью драйвера TB6612FNG и Arduino. Для этого скетча не нужны специальные библиотеки; он использует только базовые встроенные функции Arduino IDE.

Этот пример — отличный способ получить практический опыт использования TB6612FNG для управления скоростью и направлением двигателей. Как только вы это освоите, вы сможете легко создавать более сложные системы управления двигателями, например, используемые в простых роботах или машинках на радиоуправлении.

// Motor A connections
int pwmA = 3;
int Ain1 = 5;
int Ain2 = 4;

// Motor B connections
int pwmB = 9;
int Bin1 = 7;
int Bin2 = 8;

void setup() {
  // Set all the motor control pins to outputs
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(Ain1, OUTPUT);
  pinMode(Ain2, OUTPUT);
  pinMode(Bin1, OUTPUT);
  pinMode(Bin2, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, LOW);
}

void loop() {
  directionControl();
  delay(1000);
  speedControl();
  delay(1000);
}

// This function lets you control spinning direction of motors
void directionControl() {
  // Set motors to maximum speed
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);

  // Turn on motor A & B
  digitalWrite(Ain1, HIGH);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, HIGH);
  digitalWrite(Bin2, LOW);
  delay(2000);

  // Now change motor directions
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, HIGH);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, HIGH);
  delay(2000);

  // Turn off motors
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, LOW);
}

// This function lets you control speed of the motors
void speedControl() {
  // Turn on motors
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, HIGH);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, HIGH);

  // Accelerate from zero to maximum speed
  for (int i = 0; i < 256; i++) {
    analogWrite(pwmA, i);
    analogWrite(pwmB, i);
    delay(20);
  }

  // Decelerate from maximum speed to zero
  for (int i = 255; i >= 0; --i) {
    analogWrite(pwmA, i);
    analogWrite(pwmB, i);
    delay(20);
  }

  // Now turn off motors
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, LOW);
}

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

Объяснение кода:

В начале скетча мы определяем, какие пины Arduino будут использоваться для управления двигателем A и двигателем B.

// Motor A connections
int pwmA = 3;
int Ain1 = 5;
int Ain2 = 4;

// Motor B connections
int pwmB = 9;
int Bin1 = 7;
int Bin2 = 8;

В функции setup() мы настраиваем все шесть выводов управления двигателями как выходы, поскольку мы отправляем сигналы от Arduino к TB6612FNG. Мы также убеждаемся, что оба двигателя выключены, установив все выводы управления направлением в LOW. Это гарантирует, что двигатели не начнут внезапно вращаться при включении Arduino.

void setup() {
  // Set all the motor control pins to outputs
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(Ain1, OUTPUT);
  pinMode(Ain2, OUTPUT);
  pinMode(Bin1, OUTPUT);
  pinMode(Bin2, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, LOW);
}

В функции loop() мы вызываем две пользовательские функции с задержкой в одну секунду между ними. Первая функция — directionControl(), а вторая — speedControl().

void loop() {
  directionControl();
  delay(1000);
  speedControl();
  delay(1000);
}

Давайте разберём, что делает каждая из этих функций.

Функция directionControl() демонстрирует управление направлением вращения обоих двигателей. Сначала мы устанавливаем максимальную скорость обоих двигателей, установив оба PWM-вывода в HIGH. Затем мы подаём необходимые сигналы на выводы управления направлением, чтобы оба двигателя A и B вращались вперёд. После того как они повращаются в этом направлении две секунды, мы меняем сигналы на их выводах направления, что заставляет оба двигателя изменить направление вращения ещё на две секунды. Наконец, мы останавливаем двигатели, установив все выводы управления направлением в LOW.

void directionControl() {
  // Set motors to maximum speed
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);

  // Turn on motor A & B
  digitalWrite(Ain1, HIGH);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, HIGH);
  digitalWrite(Bin2, LOW);
  delay(2000);

  // Now change motor directions
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, HIGH);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, HIGH);
  delay(2000);

  // Turn off motors
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, LOW);
}

Функция speedControl() демонстрирует управление скоростью двигателей с помощью PWM. Мы начинаем с установки выводов управления направлением так, чтобы оба двигателя вращались в одном направлении. Затем мы медленно увеличиваем скорость двигателей, постепенно повышая значение PWM от 0 до 255. Это имитирует эффект ускорения. Когда двигатели достигают полной скорости, мы обращаем процесс — медленно уменьшаем значение PWM с 255 обратно до 0, что заставляет двигатели постепенно замедляться и останавливаться. Наконец, мы останавливаем двигатели, установив все выводы управления направлением в LOW.

void speedControl() {
  // Turn on motors
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, HIGH);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, HIGH);

  // Accelerate from zero to maximum speed
  for (int i = 0; i < 256; i++) {
    analogWrite(pwmA, i);
    analogWrite(pwmB, i);
    delay(20);
  }

  // Decelerate from maximum speed to zero
  for (int i = 255; i >= 0; --i) {
    analogWrite(pwmA, i);
    analogWrite(pwmB, i);
    delay(20);
  }

  // Now turn off motors
  digitalWrite(Ain1, LOW);
  digitalWrite(Ain2, LOW);
  digitalWrite(Bin1, LOW);
  digitalWrite(Bin2, LOW);
}