元器件 · 驱动器

TB6612FNG 电机驱动板

TB6612FNG 是一颗 MOSFET 双 H 桥驱动芯片,驱动两个直流电机时几乎不浪费电压,是从 L298N 升级过来的高效选择。

它是什么

TB6612FNG 是双 H 桥电机驱动,和 L298N 一样的活——站在单片机逻辑脚和胃口大得多的电机之间——但输出级用 MOSFET 而不是双极晶体管。就这一个差别就是全部故事:MOSFET 开关掉零点几伏,L298N 的输出级掉约两伏。

6 V 电池带 6 V 电机时,这个差值就是大半速度。也是大半热量:L298N 持续电流下要散热片,邮票大的 TB6612FNG 载板只是温热。

框图:QTR-MD-08A 反射阵列经 A0 到 A7 接 Arduino Nano;Nano 用 STBY、PWMA、PWMB 和四个方向脚驱动 TB6612FNG;驱动输出接左右电机,独立电机电池给驱动 VM 脚供电。
线迷宫机器人的完整驱动链。注意电机电池只到 VM——Arduino 的 5 V 只供逻辑,绝不供电机电流。 下载 SVG

怎么控制它

每路电机三个信号,全芯片再加一个共用脚:

  • 两个方向脚(A 电机 AIN1/AIN2,B 电机 BIN1/BIN2)选前进、后退、刹车或滑行。
  • 一个 PWM 脚(PWMA 或 PWMB)定速度。和 L298N 把 PWM 骑在使能脚上不同,TB6612FNG 每通道有专用 PWM 输入,最高 100 kHz——能切到听觉范围之上,让机器人不嗡嗡叫。
  • 一个 STBY 脚,共用。拉 LOW 两路桥全死,不管别的。

STBY 值得重复,因为它坑掉新手一个晚上:接对了但 STBY 悬空或 LOW 的 TB6612FNG 绝对什么都不干,悄无声息,无错可查。

什么时候用它

电机小、电池金贵时拿 TB6612FNG——几乎每个循迹和线迷宫都这样。小车跑 6–7.4 V,正是 L298N 两伏税最疼的区间,电池也不想拿去烧热。

电机电源超 13.5 V(TB6612FNG 吃不下),或单通道持续超约 1.2 A 时留守 L298N。

接线与坑

  • STBY 拉 HIGH。pinMode 之后 setup() 第一件事。
  • **两路电源,一个地。**电机电池接 VM,Arduino 5 V 接 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 后第一行拉 HIGH。

接到 Arduino

TB6612FNG Arduino Uno 说明
VCC 5 V 只供逻辑,几毫安
GND GND 还要连电池负极和每个传感器地
STBY 12 脚 不想禁用就经 10 kΩ 电阻接到 5 V
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,但 Uno 的 analogWrite 多数脚 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 锂) 约 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 脚 Uno 上用 3、5、6、9、10 或 11
跑起来嗡嗡响 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 电池包会显得无力,芯片还需要散热片。TB6612FNG 的 MOSFET 输出级只损失零点几伏,不加散热片也能保持凉爽,个头也小得多。不过,当你需要超过 13.5 V 的电机电源时,L298N 仍然胜出,因为 TB6612FNG 承受不了这么高的电压。

TB6612FNG 怎么接到 Arduino?

电机电池正极接 VM,Arduino 的 5 V 接 VCC,所有的地都连在一起——Arduino、驱动板、传感器和电池负极。然后把 STBY 接到一个数字引脚上,每路电机再接两个方向引脚(AIN1/AIN2 或 BIN1/BIN2)和一个 PWM 引脚(PWMA 或 PWMB)。电机接到 AO1/AO2 和 BO1/BO2 端子上。

TB6612FNG 上的 STBY 引脚有什么用?

STBY 是整颗芯片的待机使能。保持为低电平时,两路 H 桥都被禁用,无论其他引脚是什么状态,电机都处于滑行状态。在任何东西能动之前,你必须先把它拉高——忘了这一步,正是刚接好的 TB6612FNG 完全没反应的最常见原因。

TB6612FNG 能承受多大电流?

每通道持续 1.2 A,短时峰值可达 3.2 A。这足以轻松带动循迹车和迷宫机器人上常用的小黄减速电机和 N20 电机。堵转电流超过 1.2 A 的更大电机会触发它的热关断,所以应该升级到 DRV8871 之类的驱动,或者一个正规的有刷电调。

延伸阅读

参考资料