发热小,尺寸小,便宜,基于MOSFET的TB6612 H桥是L298N的理想替代品,淘宝6元可买到,它有哪些优缺点,如何使用?今天一起探讨下。本文翻译自科普大神DroneBotWorkshop.com. 浅显易懂适合新手译者:DIY百事

目录

1 引言

2 H桥回顾2.1脉宽调制(PWM)

3 TB66121FNG H桥3.1用MOSFET制成3.2 TB6612FNG规格3.3控制TB6612FNG

4 TB6612与L298N

5 TB6612FNG与Arduino5.1 TB6612FNG连接5.2 TB6612FNG Arduino素描

6 TB6612FNG机器人汽车底座6.1适用于TN6612FNG的Sparkfun库6.2机器人汽车连接6.3机器人车代码

7 结论

接下来我们学习如何在您的Arduino项目中使用TB6612FNG H桥。

介绍

对于单片机而言,控制直流电动机的速度和方向都是非常普遍的应用。您可能会想到可以使用这些设备构建的许多项目,从机器人到遥控飞机。

但是,如果您想尝试将直流电动机直接连接到像Arduino这样的单片机上,您会很快发现这是不可行的,因为Arduino无法为电动机提供足够的电流

l298n芯片原理图(还在用L298N驱动马达)(1)

直流电动机所需的电流超过任何单片机直接提供的电流,并且许多直流电动机以不同的电压运行,而这些电压是处理器无法处理的。因此,显然需要某种接口。

控制直流电动机的最常见方法是使用一种称为H桥的设备。这种类型的控制器可以控制直流电动机的速度和方向,一对H桥也可以用于控制双极步进电动机。

我们在许多项目中都使用了H桥。它们相对便宜,并且使用起来非常简单。到目前为止,我们最常用的H桥是L298N。

L298N是一个非常常见的组件,它用于很多Arduino项目的设计中。它很便宜,而且一旦您了解了它的工作原理,就很容易使用。但是它确实有缺陷,我将在稍后讨论。

今天,我们将使用更好的H桥,它可以在许多应用中替代L298N。它被称为TB6612FNG,使用它后,我想您会同意它是一个比旧L298N更好的选择。

H桥回顾

在我们开始之前,回顾一下H桥的工作原理,懂的请略过。

下图是直流电动机和H桥的工作原理:

l298n芯片原理图(还在用L298N驱动马达)(2)

您可以将H桥可视化为四个开关的排列。如您所见,开关的排列方式看起来很像字母“ H”。因此名称为“ H桥”。如图所示,电机位于“ H”的中间。如您所料,在断开开关的情况下,电动机没有电流通过。

l298n芯片原理图(还在用L298N驱动马达)(3)

如上图所示,如果我们闭合了几个开关,则可以看到电流被允许流过电动机,从而使电动机顺时针旋转。显然,您不想一次闭合两个以上的开关,否则可能会导致短路。

l298n芯片原理图(还在用L298N驱动马达)(4)

闭合其他两个开关也会向电动机施加电流,但极性相反。这将导致电动机逆时针旋转。

虽然您可以使用物理开关构造H桥,但这种情况并不常见。在大多数情况下,开关会被半导体替代,例如双极结型晶体管(BJT)和MOSFET。

用半导体代替开关还有一个额外的优势–它也使您可以调节电动机的速度。

脉宽调制(PWM)

脉冲宽度调制(PWM)本质上就是听起来的样子。脉冲被发送到控制H桥的晶体管,该晶体管以非常快的速度关闭和打开电子“开关”。

可以更改脉冲的宽度以设置“开”与“关”的比率。这具有控制电动机速度的效果。

l298n芯片原理图(还在用L298N驱动马达)(5)

与仅改变其电源电压相比,PWM是一种更好的调节直流电动机速度的方法。使用PWM时,电动机在整个速度范围内均以全转矩运行,这与使用电压控制在较低速度下遇到的降低转矩相反。

TB66121FNG H桥

现在,让我们看一下“更好的” H桥模块。

TB6612FNG H桥是一款小型且价格低廉的双通道H桥控制器,它使用MOSFET来实现出色的性能。

用MOSFE驱动

MOSFET具有比双极结型晶体管(BJT)更大的优势。

典型的BJT处于“接通”状态时,其电压降约为0.7伏,并且由于H桥需要电流通过两个BJT,因此总电压降为1.4伏。在低电压下,这确实无关紧要,如果为H桥提供6伏电压,则到电动机的输出将仅为4.6伏电压。在此示例中,H桥中损失了几乎25%的电压。这个能量以热量的形式消耗掉。这就是为什么大多数基于BJT的H桥都需要很大的散热器的原因。

使用MOSFET时,您没有固定的压降。取而代之的是,MOSFET导通时的电阻很小,通常只有几分之一欧姆。即使在H桥设计中两个MOSFET都“导通”时,总电阻也非常低,实际上,如果您在电源中使用的是细长导线,它的电阻可能都会比在H桥中的电阻大。

结果是极低的几乎可以忽略不计的电压降。这意味着几乎所有来自电源的电压都会传递到电动机。热量损失小。

TB6612FNG规格

TB6612FNG具有以下规格(规格适用于模块中的两个H桥):

该设备是一种表面贴装芯片,可用于许多常见模块,

典型的TB6612FNG模块的引脚排列如下图所示:

l298n芯片原理图(还在用L298N驱动马达)(6)

关于模块布局要注意的一件事是,所有输入引脚都在一侧,而所有输出和电源引脚都在另一侧。尽管您可以根据需要将一个小的散热器固定在表面贴装芯片上,但该双H桥模块显然没有散热器。

控制TB6612FNG

TB6612FNG可以在四种模式下运行:

  1. 顺时针旋转
  2. 逆时针旋转
  3. 短刹车
  4. 停止

为了控制H桥,您可以将AI1(或在某些型号上标有“ AIN1”的型号)和AI2(AIN2)引脚用于电机A的输出。B输入控制线以类似的方式用于电机B输出。

下表显示了它是如何工作的:

l298n芯片原理图(还在用L298N驱动马达)(7)

PWMAPWMB输入用于以脉冲宽度调制的方式控制电机速度。

要注意的一件事是,要使TB6612FGH工作,您必须将待机输入(STBY)保持为高电平。您可以将其绑定到VCC或使用Arduino的输出来控制它。

第二个值得注意的观察结果是,正反转控制信号与流行的L298N H桥中使用的信号相同。这使得在许多情况下可以简单地用TB6612FNG作为直接替代品。

TB6612与L298N

最后一段中的关键词是“在许多情况下”。在某些情况下(例如高压电动机),无法使用TB6612FNG。但是对于许多设计,包括使用6伏和12伏电动机的设计,它是提供改进性能的理想替代品。

以下是TB6612FNG和L298N的规格比较:

l298n芯片原理图(还在用L298N驱动马达)(8)

如果您的电动机需要超过13.5伏的电压,则TB6612FNG不适用。但是,如果您的电动机是低压(即3伏)设备,则L298N则可被取代。

尽管L298N可以处理的稳定工作电流几乎是TB6612FNG的两倍,但在达到峰值电流时也差不多。

在适用的范围内,TB6612FNG无疑是赢家。

我认为对于我的新设计,我将切换到TB6612FNG。即使我的抽屉里装满了L298N模块!

TB6612FNG在Arduino的应用

由于TB6612FNG使用与L298N相似的控制方式,因此您可以轻松地重新调整旧代码的用途,以使用新的控制器。实际上,这正是我为第一个演示所做的。

TB6612FNG的接线

对于此实验,您将需要以下组件:

接线如下:

l298n芯片原理图(还在用L298N驱动马达)(9)

使用上图中右边表格所示将TB6612FNG连接到Arduino。并记住将STBY(待机)引线连接到 5伏,否则将无法正常工作。

TB6612FNG用在Arduino上的代码

连接完所有元件后,您可以运行以下代码以使其继续进行:

/* TB6612FNG H-Bridge Demo TB6612-Demo.ino Demonstrates use of TB6612FNG H-Bridge Motor Controller Drives two DC Motors DroneBot Workshop 2019 https://dronebotworkshop.com */ // Motor A int pwmA = 5; int in1A = 3; int in2A = 4; // Motor B int pwmB = 6; int in1B = 7; int in2B = 8; // Speed control potentiometers int SpeedControl1 = A0; int SpeedControl2 = A1; // Motor Speed Values - Start at zero int MotorSpeed1 = 0; int MotorSpeed2 = 0; void setup() { // Set all the motor control pins to outputs pinMode(pwmA, OUTPUT); pinMode(pwmB, OUTPUT); pinMode(in1A, OUTPUT); pinMode(in2A, OUTPUT); pinMode(in1B, OUTPUT); pinMode(in2B, OUTPUT); } void loop() { // Set Motor A forward digitalWrite(in1A, HIGH); digitalWrite(in2A, LOW); // Set Motor B forward digitalWrite(in1B, HIGH); digitalWrite(in2B, LOW); // Read potentiometers and convert to range of 0-255 MotorSpeed1 = map(analogRead(SpeedControl1), 0, 1023, 0, 255); MotorSpeed2 = map(analogRead(SpeedControl2), 0, 1023, 0, 255); // Set the motor speeds analogWrite(pwmA, MotorSpeed1); analogWrite(pwmB, MotorSpeed2); }

我们首先定义代表已连接TB6612FNG电机控制器的Arduino引脚的变量,IN1和IN2引脚以及PWM引脚。

接下来,我们定义变量以表示与电位计的模拟连接以及电动机速度的变量。

在设置中,我们仅将所有引脚定义为输出,然后进入循环。

我们通过设置两个电动机的方向来启动循环。如果愿意,可以使用上表反转一台或两台电机的方向。

接下来,我们从两个电位计读取该值,由于该值的范围是0到1023,因此我们使用Map函数将范围更改为0-255。

最后,我们使用产生PWM的AnalogWrite函数将PWM脉冲写出到电机控制器,从而设置它们的速度。

将代码加载到您的Arduino,连接电机电源,并使用两个电位器。您就能够使用它们控制电动机的速度。

TB6612FNG机器人汽车底座

对于TB6612FNG的最终实验,我将使用TB6612FNG H桥来驱动小型机器人汽车中的电机。

实际上,您可以使用最后一个实验来精确地完成此任务,并使用两个电位计控制电动机。但是这次我想做一些不同的编程。

这次我们将使用一个库。

适用于TN6612FNG的Sparkfun库

Sparkfun发布了专门为TN6612FNG开发的库,您可以从GitHub下载该库。

该库简化了电机控制器的使用。它具有使电动机在任何速度和两个方向上移动的功能,以及制动和停止的功能。

此外,Sparkfun库还附带一个示例代码,非常适合我们的机器人汽车。实际上,我只需要修改一行即可使其工作。

机器人车接线

我使用了其中一种流行的亚克力机器人汽车套件,可以轻松地在淘宝或Amazon上获得套件。这些套件带有一个底座,一对电动机,一些匹配的轮毂,一个电池座以及将它们组合在一起所需的所有硬件。

我们的机器人汽车的电气接线与我们刚刚使用的接线非常相似。Arduino和TB6612FNG之间的连接是相同的,并增加了Arduino与Standby引脚之间的连接。我已经拆下了两个电位器。

l298n芯片原理图(还在用L298N驱动马达)(10)

我们可以用2节锂电池或4节AA电池为电动机供电,及为Arduino提供电源。为Arduino供电的另一个不错的选择是使用USB移动电源。

以我为例,我将布线保持在无焊面包板上,只用一个支架就可以固定Arduino。结果,我相信我创造了世界上最丑陋的机器人汽车!

您可以通过永久布线并正确安装和平衡Arduino和电池座来更好地完成工作。在我的情况下,该装置不平衡,因此我安装了一个小型C型夹,以增加后背的重量!

机器人车代码

在运行机器人代码之前,您需要安装Sparkfun库。最简单的方法是将库下载为zip文件。将其保存在计算机上的某个位置,以后可以找到它,“下载”文件夹是显而易见的位置。

现在打开您的Arduino IDE,然后单击页面顶部的Sketch菜单项。选择包括库,这将打开一个子菜单。

在子菜单中,从顶部开始的第二项将是Add ZIP Library(添加ZIP库)。选择该选项,将打开一个对话框。使用对话框浏览到保存库ZIP文件的位置并选择它。

该库将与示例代码一起安装。

要在Arduino IDE中运行示例代码,您需要从顶部选择File菜单,然后选择Examples。这将弹出一个子菜单。向下滚动子菜单,直到底部附近的“来自自定义库的示例”。在其下,您将看到按字母顺序排列的示例列表。查找Sparkfun TB6612FNG电机库,然后选择它。

库中仅包含一个名为MotorTestRun的示例代码。打开该代码,这是我们将用于机器人车的代码。

如果按照上图连接Arduino和TB6612FNG,则需要对代码进行一次更改,这是因为Sparkfun使用的Arduino引脚与连接时未使用相同的Arduino引脚。

Sparkfun使用引脚2进行AIN1(AI1)连接,而我使用引脚3。因此,您可以通过以下两种方式进行处理:

下面是代码,已修改为使用引脚3。

/****************************************************************************** TestRun.ino TB6612FNG H-Bridge Motor Driver Example code Michelle @ SparkFun Electronics 8/20/16 https://github.com/sparkfun/SparkFun_TB6612FNG_Arduino_Library Uses 2 motors to show examples of the functions in the library.This causes a robot to do a little 'jig'.Each movement has an equal and opposite movement so assuming your motors are balanced the bot should end up at the same place it started. Resources: TB6612 SparkFun Library Development environment specifics: Developed on Arduino 1.6.4 Developed with ROB-9457 ******************************************************************************/ // This is the library for the TB6612 that contains the class Motor and all the // functions #include <SparkFun_TB6612.h> // Pins for all inputs, keep in mind the PWM defines must be on PWM pins // the default pins listed are the ones used on the Redbot (ROB-12097) with // the exception of STBY which the Redbot controls with a physical switch #define AIN1 3 #define BIN1 7 #define AIN2 4 #define BIN2 8 #define PWMA 5 #define PWMB 6 #define STBY 9 // these constants are used to allow you to make your motor configuration // line up with function names like forward.Value can be 1 or -1 const int offsetA = 1; const int offsetB = 1; // Initializing motors.The library will allow you to initialize as many // motors as you have memory for.If you are using functions like forward // that take 2 motors as arguements you can either write new functions or // call the function more than once. Motor motor1 = Motor(AIN1, AIN2, PWMA, offsetA, STBY); Motor motor2 = Motor(BIN1, BIN2, PWMB, offsetB, STBY); void setup() { //Nothing here } void loop() { //Use of the drive function which takes as arguements the speed //and optional duration.A negative speed will cause it to go //backwards.Speed can be from -255 to 255.Also use of the //brake function which takes no arguements. motor1.drive(255,1000); motor1.drive(-255,1000); motor1.brake(); delay(1000); //Use of the drive function which takes as arguements the speed //and optional duration.A negative speed will cause it to go //backwards.Speed can be from -255 to 255.Also use of the //brake function which takes no arguements. motor2.drive(255,1000); motor2.drive(-255,1000); motor2.brake(); delay(1000); //Use of the forward function, which takes as arguements two motors //and optionally a speed.If a negative number is used for speed //it will go backwards forward(motor1, motor2, 150); delay(1000); //Use of the back function, which takes as arguments two motors //and optionally a speed.Either a positive number or a negative //number for speed will cause it to go backwards back(motor1, motor2, -150); delay(1000); //Use of the brake function which takes as arguments two motors. //Note that functions do not stop motors on their own. brake(motor1, motor2); delay(1000); //Use of the left and right functions which take as arguements two //motors and a speed.This function turns both motors to move in //the appropriate direction.For turning a single motor use drive. left(motor1, motor2, 100); delay(1000); right(motor1, motor2, 100); delay(1000); //Use of brake again. brake(motor1, motor2); delay(1000); }

使用Sparkfun库让使用TN6612FNG非常简单。定义所有电机控制器连接之后,我们设置两个对象,每个对象一个,分别命名为motor1motor2。注意创建对象时如何传递所有电机参数。

setup中不需要任何内容​​,因为该库负责将引脚定义为输出。

Loop本质上是库提供的功能的演示。该文档已被很好地记录下来,因此您可以毫无问题地让其适应您的需求。功能包括:

loop中的代码仅使用许多这些功能来练习自动驾驶汽车。实际上,它的设计目的是使汽车停在同一位置,但是我那丑陋的机器人汽车是如此不平衡,以至于再也没有机会这样做。也许您的汽车会做得更好!

l298n芯片原理图(还在用L298N驱动马达)(11)

您可以试验代码并更改或添加更多功能来控制您的汽车。

结论

TB6612FNG是一种廉价的双H桥电机控制器,易于使用,可以在许多应用中直接替代L298N。它体积小,散热低,非常适合小型机器人汽车和其他电池供电的设备。

,