发热小,尺寸小,便宜,基于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无法为电动机提供足够的电流
直流电动机所需的电流超过任何单片机直接提供的电流,并且许多直流电动机以不同的电压运行,而这些电压是处理器无法处理的。因此,显然需要某种接口。
控制直流电动机的最常见方法是使用一种称为H桥的设备。这种类型的控制器可以控制直流电动机的速度和方向,一对H桥也可以用于控制双极步进电动机。
我们在许多项目中都使用了H桥。它们相对便宜,并且使用起来非常简单。到目前为止,我们最常用的H桥是L298N。
L298N是一个非常常见的组件,它用于很多Arduino项目的设计中。它很便宜,而且一旦您了解了它的工作原理,就很容易使用。但是它确实有缺陷,我将在稍后讨论。
今天,我们将使用更好的H桥,它可以在许多应用中替代L298N。它被称为TB6612FNG,使用它后,我想您会同意它是一个比旧L298N更好的选择。
H桥回顾在我们开始之前,回顾一下H桥的工作原理,懂的请略过。
下图是直流电动机和H桥的工作原理:
您可以将H桥可视化为四个开关的排列。如您所见,开关的排列方式看起来很像字母“ H”。因此名称为“ H桥”。如图所示,电机位于“ H”的中间。如您所料,在断开开关的情况下,电动机没有电流通过。
如上图所示,如果我们闭合了几个开关,则可以看到电流被允许流过电动机,从而使电动机顺时针旋转。显然,您不想一次闭合两个以上的开关,否则可能会导致短路。
闭合其他两个开关也会向电动机施加电流,但极性相反。这将导致电动机逆时针旋转。
虽然您可以使用物理开关构造H桥,但这种情况并不常见。在大多数情况下,开关会被半导体替代,例如双极结型晶体管(BJT)和MOSFET。
用半导体代替开关还有一个额外的优势–它也使您可以调节电动机的速度。
脉宽调制(PWM)脉冲宽度调制(PWM)本质上就是听起来的样子。脉冲被发送到控制H桥的晶体管,该晶体管以非常快的速度关闭和打开电子“开关”。
可以更改脉冲的宽度以设置“开”与“关”的比率。这具有控制电动机速度的效果。
与仅改变其电源电压相比,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桥):
- 电机电源电压为2.5到13.5伏DC。
- 逻辑电源电压为2.7至5.5伏DC。
- 连续输出电流为1.2安培,峰值电流为3.2安培。
- 内置过热关机。
- 待机电源模式。
该设备是一种表面贴装芯片,可用于许多常见模块,
典型的TB6612FNG模块的引脚排列如下图所示:
关于模块布局要注意的一件事是,所有输入引脚都在一侧,而所有输出和电源引脚都在另一侧。尽管您可以根据需要将一个小的散热器固定在表面贴装芯片上,但该双H桥模块显然没有散热器。
控制TB6612FNGTB6612FNG可以在四种模式下运行:
- 顺时针旋转
- 逆时针旋转
- 短刹车
- 停止
为了控制H桥,您可以将AI1(或在某些型号上标有“ AIN1”的型号)和AI2(AIN2)引脚用于电机A的输出。B输入控制线以类似的方式用于电机B输出。
下表显示了它是如何工作的:
PWMA和PWMB输入用于以脉冲宽度调制的方式控制电机速度。
要注意的一件事是,要使TB6612FGH工作,您必须将待机输入(STBY)保持为高电平。您可以将其绑定到VCC或使用Arduino的输出来控制它。
第二个值得注意的观察结果是,正反转控制信号与流行的L298N H桥中使用的信号相同。这使得在许多情况下可以简单地用TB6612FNG作为直接替代品。
TB6612与L298N最后一段中的关键词是“在许多情况下”。在某些情况下(例如高压电动机),无法使用TB6612FNG。但是对于许多设计,包括使用6伏和12伏电动机的设计,它是提供改进性能的理想替代品。
以下是TB6612FNG和L298N的规格比较:
如果您的电动机需要超过13.5伏的电压,则TB6612FNG不适用。但是,如果您的电动机是低压(即3伏)设备,则L298N则可被取代。
尽管L298N可以处理的稳定工作电流几乎是TB6612FNG的两倍,但在达到峰值电流时也差不多。
在适用的范围内,TB6612FNG无疑是赢家。
- 它要小得多,实际上,大多数TB6612FNG模块都不到L298N模块尺寸的四分之一。
- 没有散热器,使其更小。但是,最好让设备周围有一些气流。
- 效率是TB6612FNG的亮点。在构建电池供电的设备时重点推荐。
- 使用TB6612FNG时,几乎所有的电动机电源电压都将到达电动机。而L298N则有1.4伏压降。
- TB6612FNG具有L298N没有的低电流待机模式。
我认为对于我的新设计,我将切换到TB6612FNG。即使我的抽屉里装满了L298N模块!
TB6612FNG在Arduino的应用由于TB6612FNG使用与L298N相似的控制方式,因此您可以轻松地重新调整旧代码的用途,以使用新的控制器。实际上,这正是我为第一个演示所做的。
TB6612FNG的接线对于此实验,您将需要以下组件:
- Arduino,我使用了Arduino Uno,但是任何Arduino都可以使用。
- 两个电位器来控制速度。我使用了10K线性电位器,任何超过5K的线性电位器就足够了。
- TB6612FNG双H桥电机控制器。
- 两个小型直流电动机。我使用了两个6伏电动机,黄色是那些小型机器人车载套件所带的电动机。
- 电动机的电源。当我使用6伏电动机时,我的电源是6伏,由4节AA型电池组成。
接线如下:
使用上图中右边表格所示将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引脚之间的连接。我已经拆下了两个电位器。
我们可以用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。因此,您可以通过以下两种方式进行处理:
- 将代码的第28行更改为#define AIN13。这就是我处理差异的方法。
- 保持代码不变,只需将引脚3的连接更改为引脚2。
下面是代码,已修改为使用引脚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非常简单。定义所有电机控制器连接之后,我们设置两个对象,每个对象一个,分别命名为motor1和motor2。注意创建对象时如何传递所有电机参数。
setup中不需要任何内容,因为该库负责将引脚定义为输出。
Loop本质上是库提供的功能的演示。该文档已被很好地记录下来,因此您可以毫无问题地让其适应您的需求。功能包括:
- 驱动器–此功能设置电动机的速度和方向(您将其分别应用于每个电动机)。您将速度传递为正数或负数,负数会使电动机反向旋转。您还可以指定希望电动机运行的持续时间(以毫秒为单位)。
- 前进–此功能使您可以向前驱动两个电动机。它以速度作为可选参数。再次可以使用负速度,这将导致电动机后退。
- 后退。
- 制动–这将停止电动机。如果您没有为之前的命令指定持续时间,则需要使用该时间来使机器人停止运行。
- 左–这将两个电动机都作为参数,并使机器人向左转。它还将速度用作参数。
- 右–向右转
loop中的代码仅使用许多这些功能来练习自动驾驶汽车。实际上,它的设计目的是使汽车停在同一位置,但是我那丑陋的机器人汽车是如此不平衡,以至于再也没有机会这样做。也许您的汽车会做得更好!
您可以试验代码并更改或添加更多功能来控制您的汽车。
结论TB6612FNG是一种廉价的双H桥电机控制器,易于使用,可以在许多应用中直接替代L298N。它体积小,散热低,非常适合小型机器人汽车和其他电池供电的设备。
,