Компонент · Драйвер

Драйвер двигателей TB6612FNG

TB6612FNG — два MOSFET H-моста, которые управляют двумя двигателями постоянного тока (DC), с почти нулевыми потерями напряжения. Эффективная замена L298N.

Что это такое

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

При батарее 6 V и двигателях 6 V эта разница составляет большую часть скорости. Она же определяет и нагрев: L298N требует радиатора при длительном токе, а плата TB6612FNG размером с почтовую марку лишь слегка теплеет.

Блок-схема: массив датчиков отражения QTR-MD-08A подключается к Arduino Nano через выводы A0–A7; Nano управляет TB6612FNG с помощью STBY, PWMA, PWMB и четырёх выводов направления; выходы драйвера идут к левому и правому двигателям, а отдельная батарея двигателей питает вывод VM драйвера.
Вся цепь привода робота, проходящего лабиринт по линии. Обратите внимание: батарея двигателей подключается только к VM — логику питает 5 V Arduino, но ток двигателей по этой шине не проходит. Скачать SVG

Как им управлять

Каждый двигатель получает три сигнала, а вся микросхема — ещё один общий вывод:

  • Два вывода направления (AIN1/AIN2 для двигателя A, BIN1/BIN2 для двигателя B) задают движение вперёд, назад, торможение или вращение по инерции.
  • Один вывод PWM (PWMA или PWMB) задаёт скорость. В отличие от L298N, где PWM подаётся на разрешающий вывод, у TB6612FNG есть отдельный вход PWM для каждого канала с частотой до 100 kHz — достаточно высокой, чтобы переключение происходило выше слышимого диапазона и робот перестал издавать высокий звук.
  • Один общий вывод STBY. При низком уровне оба моста отключены независимо от остальных сигналов.

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

Когда его следует использовать

Выбирайте TB6612FNG, когда двигатели небольшие, а каждый вольт батареи дорог, — именно таковы почти все роботы, следующие по линии, и роботы, проходящие лабиринт по линии. Маленькие роботы питаются от 6–7.4 V, то есть работают именно в диапазоне, где потеря 2 V на L298N особенно болезненна, и не хочят превращать заряд батареи в нагрев.

Оставайтесь с L298N, если питание двигателей выше 13.5 V, что TB6612FNG не принимает, либо требуется более 1.2 A непрерывно на канал.

Подключение и важные нюансы

  • Подавайте на STBY высокий уровень. Это должно быть первым действием setup() после pinMode.
  • Два источника питания, одна земля. Батарея двигателей — к VM, 5 V Arduino — к VCC, а все земли соедините между собой: Arduino, драйвер, массив датчиков и минус батареи. Без общей земли сигналы управления не имеют опорного напряжения, а отказ возникает без сообщения.
  • Соблюдайте предел 13.5 V. На плате нет встроенного регулятора и запаса выше максимального питания двигателей. Литиевый блок 3S с номиналом 12.6 V превысит предел сразу после зарядки.
  • Если двигатель вращается не туда, исправление занимает две секунды. Поменяйте местами два выходных провода этого двигателя или измените логику направления в прошивке. Сделайте это до любой настройки, иначе будете искать ошибку регулирования, вызванную подключением.

Расположение выводов

На распространённой плате в стиле SparkFun расположены два ряда: логика с одной стороны, питание и двигатели с другой.

Сторона Вывод Назначение
Логика VCC Логическое питание 2.7–5.5 V от микроконтроллера
Логика GND Земля. Все земли робота соединяются здесь
Логика STBY Ожидание, активный низкий уровень. LOW = оба моста молча отключены
Логика AIN1, AIN2 Направление двигателя A
Логика PWMA Скорость двигателя A. Допускает до 100 kHz
Логика BIN1, BIN2 Направление двигателя B
Логика PWMB Скорость двигателя B
Питание VM Питание двигателей 2.5–13.5 V. Без регулятора и запаса
Питание GND Земля двигателей
Двигатели AO1, AO2 Клеммы двигателя A
Двигатели AO1, AO2 Клеммы двигателя B (BO1, BO2)

Таблица истинности

STBY IN1 IN2 PWM Результат
LOW × × × Ничего. Оба моста выключены, ошибки и подсказки нет
HIGH HIGH LOW PWM Вперёд с заданной скважностью
HIGH LOW HIGH PWM Назад с заданной скважностью
HIGH HIGH HIGH × Короткое торможение
HIGH LOW LOW HIGH Вращение по инерции

Первая строка стоит людям целого вечера. Идеально подключённая плата с STBY, оставленным в плавающем состоянии, абсолютно ничего не делает, а именно таким является неуправляемый вывод. Подавайте на него высокий уровень в setup(), первой строкой после pinMode.

Подключение к Arduino

TB6612FNG Arduino Uno Примечание
VCC 5 V Только логика, несколько миллиампер
GND GND Также к минусу батареи и земле каждого датчика
STBY Вывод 12 Либо соединить с 5 V через 10 kΩ, если отключение не требуется
PWMA Вывод 9 Должен поддерживать PWM
AIN1 Вывод 8
AIN2 Вывод 7
PWMB Вывод 3 Должен поддерживать PWM
BIN1 Вывод 5
BIN2 Вывод 4
VM Плюс батареи двигателей 2.5–13.5 V — проверьте реальное напряжение свежего блока

Минимальный рабочий код

const int STBY = 12;
const int PWMA = 9, AIN1 = 8, AIN2 = 7;
const int PWMB = 3, BIN1 = 5, BIN2 = 4;

void setup() {
  for (int p : {STBY, PWMA, AIN1, AIN2, PWMB, BIN1, BIN2}) pinMode(p, OUTPUT);
  digitalWrite(STBY, HIGH);          // without this, nothing happens at all
}

// speed: -255..255
void driveA(int speed) {
  speed = constrain(speed, -255, 255);
  digitalWrite(AIN1, speed > 0);
  digitalWrite(AIN2, speed < 0);
  analogWrite(PWMA, abs(speed));
}

void brakeA() {                       // short brake: both direction pins high
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, HIGH);
}

void loop() {
  driveA(200); delay(1000);
  brakeA();    delay(300);
  driveA(-200); delay(1000);
  brakeA();    delay(300);
}

Как избавиться от высокого звука

Это тихая сверхспособность TB6612FNG, которой почти никто не пользуется. Драйвер принимает PWM до 100 kHz, но analogWrite Arduino Uno на большинстве выводов работает на 490 Hz, а на выводах 5 и 6 — на 980 Hz. Это прямо в слышимом диапазоне, поэтому во время движения робот «поёт».

Человеческое слуховое восприятие заканчивается около 20 kHz. Поднимите частоту PWM выше этого значения, и шум полностью исчезнет. На Uno выводы 9 и 10 управляются Timer 1, который можно перенастроить:

void setup() {
  // Timer1 (pins 9, 10): phase-correct PWM, no prescaler -> ~31.4 kHz
  TCCR1B = (TCCR1B & 0b11111000) | 0x01;
}

Одна эта строка переносит частоту переключения примерно на 31 kHz — неслышимую и всё ещё намного ниже допустимой для драйвера. Цена состоит в том, что Timer 1 также использует библиотека Servo, поэтому оба режима нельзя совместить на одном таймере.

L298N не позволяет подняться так высоко: его биполярный каскад переключается слишком медленно, а потери резко растут с частотой. Это реальное практическое преимущество MOSFET-каскада помимо числовой эффективности.

Что дают 0.5 V вместо 2 V

Источник питания L298N подаёт двигателю TB6612FNG подаёт двигателю Дополнительно доступно
6 V (4×AA) ~4.0 V ~5.5 V +38%
7.4 V (2S Li-ion) ~5.4 V ~6.9 V +28%
12 V ~10.0 V ~11.5 V +15%

Чем ниже напряжение питания, тем важнее разница — полностью противоположно ожиданиям людей и именно поэтому замена так сильно меняет впечатление от маленьких роботов.

Есть и тепловое следствие. При 1 A на канал L298N рассеивает примерно 2 W на канал; TB6612FNG рассеивает около 0.5 W суммарно на обоих каналах. Это разница между деталью, которой нужны радиатор и воздушный поток, и деталью, которую можно спрятать под платформой.

Диагностика

Симптом Вероятная причина Исправление
Совсем ничего не происходит STBY не задействован или имеет LOW Подать HIGH — это первое, что нужно проверить каждый раз
Ничего не происходит, STBY имеет высокий уровень Нет общей земли Соединить драйвер, плату, датчики и минус батареи
Один двигатель вращается назад Обратные провода или логика Поменять два выходных провода двигателя или инвертировать логику
Скорость только включается и выключается Вывод PWM не поддерживает PWM Использовать 3, 5, 6, 9, 10 или 11 на Uno
Громкий высокий звук при движении PWM в слышимом диапазоне Поднять частоту таймера выше ~20 kHz
Драйвер перегрелся и вышел из строя VM выше 13.5 V Свежий блок 3S имеет 12.6 V и растёт; проверить под зарядкой
Двигатели прерывисто вращаются под нагрузкой Просадка питания или более 1.2 A непрерывно Более ёмкий блок или параллельно соединить два канала для одного двигателя
Работает на стенде, но не на ковре Непрерывный ток выше номинала Ковёр увеличивает нагрузку; измерить ток мультиметром в реальных условиях

Два канала можно параллельно подключить к одному двигателю: соединить AIN1 с BIN1, AIN2 с BIN2, PWMA с PWMB и выходы между собой, получив примерно 2.4 A непрерывно. Техническое описание это поддерживает, и это стандартное решение, когда мощности одного двигателя немного не хватает.

Когда TB6612FNG — неверный выбор

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

Выше 13.5 V. Нет запаса и регулятора. Блок 4S исключён, а блок 3S требует проверки сразу после зарядки.

Выше ~1.2 A непрерывно на канал, причём параллельного соединения каналов недостаточно. L298N обеспечивает 2 A на канал с радиатором, а BTS7960 рассчитан на 43 A для действительно крупных двигателей.

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

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

Используется в этих сборках

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

Сравнение

Альтернативы

Вопросы

Драйвер двигателей TB6612FNG: частые вопросы

Что такое драйвер двигателей TB6612FNG?

TB6612FNG — двойной H-мост на MOSFET вместо более старых биполярных транзисторов. Он принимает маломощные сигналы направления и PWM от микроконтроллера и переключает отдельное питание двигателей, независимо управляя двумя двигателями постоянного тока; обеспечивает 1.2 A непрерывно на канал с пиками 3.2 A.

TB6612FNG лучше L298N?

Для небольших двигателей робота — да. Транзисторный выходной каскад L298N теряет примерно 2 V до того, как двигатель увидит напряжение, поэтому двигатель 6 V от блока 6 V работает вяло, а микросхеме нужен радиатор. MOSFET-каскад TB6612FNG теряет несколько десятых долей вольта, работает без радиатора и значительно меньше. L298N остаётся лучше, когда нужно питание двигателей выше 13.5 V, которое TB6612FNG не принимает.

Как подключить TB6612FNG к Arduino?

Плюс батареи двигателей подключите к VM, 5 V Arduino — к VCC, а все земли соедините между собой: Arduino, драйвер, датчики и минус батареи. Затем подключите STBY к цифровому выводу, а для каждого двигателя — два вывода направления (AIN1/AIN2 или BIN1/BIN2) и один вывод PWM (PWMA или PWMB). Двигатели подключаются к клеммам AO1/AO2 и BO1/BO2.

Для чего на TB6612FNG нужен вывод STBY?

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

Какой ток выдерживает TB6612FNG?

1.2 A непрерывно на канал и кратковременно до 3.2 A. Это с запасом покрывает небольшие жёлтые редукторные двигатели и двигатели N20, применяемые в роботах, следующих по линии, и проходящих лабиринт. Более крупные двигатели, у которых ток останова превышает 1.2 A, вызовут тепловую защиту, поэтому переходите на DRV8871 или полноценный коллекторный ESC.

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

Источники