直流电机(direct current machine)
能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
直流电动机
将直流电能转换为机械能的转动装置。电动机定子提供磁场,直流电源向转子的绕组提供电流,换向器使转子电流与磁场产生的转矩保持方向不变。根据是否是否配置有常用的电刷-换向器可以将直流电动机分为两类,包括有刷直流电动机和无刷直流电动机。
无刷直流电机是近几年来随着微处理器技术的发展和高开关频率、低功耗新型电力电子器件的应用,以及控制方法的优化和低成本、高磁能级的永磁材料的出现而发展起来的一种新型直流电动机。
无刷直流电机既保持了传统直流电机良好的调速性能又具有无滑动接触和换向火花、可靠性高、使用寿命长及噪声低等优点,因而在航空航天、数控机床、机器人、电动汽车、计算机外围设备和家用电器等方面都获得了广泛应用。
当然,下文中仍旧要使用有刷电机,毕竟成本低廉。下文中所述的直流电机均指有刷直流电动机。
单片机实验中常见的直流电机驱动芯片介绍
L9110S
L298N
说明
L298N有两个供电,一个是逻辑控制部分的5伏供电,一个是电机的供电。
实物图中标注的12伏是给电机供电的,不接的话电机不转。
板上有一个5伏稳压管,如果板上5伏使能有效的话,L298N的逻辑部分供电就从这个稳压管获得,这样就不用外接5伏,此时还可以将得到的5v稳压跟别的模块供电。如果外接5伏的话,板上5伏使能就要断开无效了。
稳压管的输入和输出有个压差,如果给电机的供电太低的话(比方说只有5v),通过压差后可能会降低太多,那么逻辑控制部分所要求的5v电压可能就达不到了,此时需要将板上5伏使能断开,然后外接5v的电源来给逻辑控制部分供电。
TB6612FNG
TB6612FNG相对于传统的L298N效率上提高很多,体积上也大幅度减少,在额定范围内,芯片基本不发热。
TB6612FNG每通道输出最高1.2 A的连续驱动电流,启动峰值电流达2A/3.2 A(连续脉冲/单脉冲);片内集成低压检测电路与热停机保护电路;PWM支持频率高达100 kHz,支持待机状态。
引脚说明
功能 | 引脚 | 引脚 | 功能 | |
---|---|---|---|---|
A控制信号输入 | PWMA | VM | 电机驱动电压输入端(4.5V-13.5V) | |
A电机输入端2 | AIN2 | VCC | 逻辑电平输入端(2.7V-5.5V) | |
A电机输入端1 | AIN1 | GND | 接数字地 | |
正常工作\待机状态控制端 | STBY | AO1 | A电机输出端1 | |
B电机输入端1 | BIN1 | AO2 | A电机输出端2 | |
B电机输入端2 | BIN2 | BO2 | B电机输出端2 | |
B控制信号输入端 | PWMB | BO1 | B电机输出端1 | |
接模拟地 | PGND1 | PGND2 | 接模拟地 |
工作温度:-20~85℃
单片机对驱动芯片的编程控制方法
L9110S
L298N
发烟测试,Arduino源码:
//Motor A
int IN1 = 1; // IN1 connected to pin 1
int IN2 = 2;
int ENA = 3;
unsigned long time = 1200;
int value = 128;
void setup(){
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
void loop(){
analogWrite(ENA, value);
delay(time);
}
AVR单片机C语言控制源码:
int main()
{
unsigned char pd=1; //用于控制脉冲信号正反
//配置PORTA所有端口为输出模式
DDRA=0xff;
//PORTA第6 7位置为1 使能电机驱动板B口
PORTA |= (1<<6);
PORTA |= (1<<7);
//控制电机B口 使反转
PORTA |= (1<<4);
PORTA &= ~(1<<5);
//此处只测试电机B口 电机B口输出占空比为50%的脉冲
while(1)
{
delay20ms();
if(pd)
{
pd=0;
PORTA &= ~(1<<6); //B口使能位清0
PORTA &= ~(1<<7); //B口使能位清0
}else
{
pd=1;
PORTA |= (1<<6); //B口使能位置1
PORTA |= (1<<7); //B口使能位置1
}
}
}
TB6612FNG
手边没有TB6612FNG模块,今天就用自己工作室最近开发的一款兼容ArduinoIDE编程控制的智能机器人控制板进行TB6612FNG测试实验。板子上已经集成了TB6612FNG。
老套路,发烟测试。
Arduino源码:
// Visual Micro is in vMicro>General>Tutorial Mode
//
/*
Name: TB6612FNG.ino
Created: 2018/7/21 10:58:18
Author: 禾灮\HeGuang
*/
/************************************************************************/
/* 初始化 */
/************************************************************************/
// 直流电机A接 A01、 A02
// 直流电机B接 B01、 B02
int STBY = 14; //正常工作\待机状态控制端
//Motor A
int PWMA = 9; //速度调节
int AIN1 = 4; //A电机接口
int AIN2 = 5;
//Motor B
int PWMB = 10;
int BIN1 = 6; //B电机接口
int BIN2 = 7;
void Move(char Motor, int Speed, int XYZ){ //Move()功能:控制电机进退、转向、及调速
/************************************************************************/
/* 参数说明 */
/************************************************************************/
/*char Motor 电机选择: A | B */
/************************************************************************/
/*int XYZ 行进方位角 0-359 ,0为前进,180后退, 90右转 , 135左转 。 */
/************************************************************************/
/*int Speed 调速: 0 代表停止~~ 255为全速 */
/************************************************************************/
digitalWrite(STBY, HIGH); //跳出待机状态,开始工作
// boolean inPin0 = LOW;
// boolean inPin1 = HIGH;
if(Motor == 'A' && XYZ == 0){
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
analogWrite(PWMA, Speed);
}else if(Motor == 'B' && XYZ == 0){
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, HIGH);
analogWrite(PWMB, Speed);
}else if(Motor == 'A' && XYZ == 90){
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, Speed);
}else if(Motor == 'B' && XYZ == 90){
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, Speed);
}
}
void Stop(){ //Stop(); 功能:制动 停止电机 ——>函数内容可以简化为:analogWrite(PWMA, 0); analogWrite(PWMB, 0);digitalWrite(STBY, LOW);
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
analogWrite(PWMA, 0);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, LOW);
analogWrite(PWMB, 0);
digitalWrite(STBY, LOW); //芯片待机
}
void setup(){ // 初始化设置
pinMode(STBY, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
Stop();
}
void loop(){
Move('A', 255, 0); //电机A,全速,方位角0,前进
Move('B', 255, 0); //电机B, 全速,方位角0,前进
delay(3000); //前进 3 second
Stop(); //制动
delay(300);
Move('A', 128, 90); //电机A,半速,方位角90,后退
Move('B', 128, 90); //电机B, 半速,方位角90,后退
delay(2000); //后退 2 second
Stop(); //制动
delay(300);
}
AVR单片机C语言控制源码:
实例效果
通电,并测量马达A与B的输出电压,基本相同,电压差在正负0.03V,输出稳定。
亲测可以使机器人按照直线行进,一定程度上完美解决了L9110S 和 L298N因两路电机输出电压误差大而导致的不能直线行进问题。
当然,和L298N一样,TB6612FNG也可以应用于步进电机驱动电路,代码与驱动直流电机代码相仿,此处不再赘述,(具体可参考我们的另一篇关于步进电机控制的文章)感兴趣的朋友可以自己试试。
上文中小楊就单片机实验中常用的几款直流电动机驱动芯片进行了简单的测试分析。从实验结果不难看出,TB6612FNG较L9110S与L298N而言,具备:输出电压稳定、输入电压范围广、有待机功能、体积小、散热量低等明显优点。
文中不足之处还请诸位批评指正、不吝赐教。
实验中多次用到的——兼容Arduino型智能机器人控制板,选购链接如下:
禾灮智能机器人控制系统 支持AVR STM32编程 兼容Arduino 送底盘
(https://item.taobao.com/item.htm?spm=a230r.1.14.16.229a3322CiUE8p&id=573225661665&ns=1&abbucket=6#detail)
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。
感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。
感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。
禾灮,感谢有你。
未来,我们将一如既往,砥砺前行。
禾灮·小楊
2018.07.19