单片机 控制 直流电机 基于L9110S 、L298N、TB6612FNG驱动


直流电机控制

TB6612FNG电机控制电路与Arduino连接图

直流电机(direct current machine)

能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。


直流电动机

将直流电能转换为机械能的转动装置。电动机定子提供磁场,直流电源向转子的绕组提供电流,换向器使转子电流与磁场产生的转矩保持方向不变。根据是否是否配置有常用的电刷-换向器可以将直流电动机分为两类,包括有刷直流电动机和无刷直流电动机。

无刷直流电机是近几年来随着微处理器技术的发展和高开关频率、低功耗新型电力电子器件的应用,以及控制方法的优化和低成本、高磁能级的永磁材料的出现而发展起来的一种新型直流电动机。

无刷直流电机既保持了传统直流电机良好的调速性能又具有无滑动接触和换向火花、可靠性高、使用寿命长及噪声低等优点,因而在航空航天、数控机床、机器人、电动汽车、计算机外围设备和家用电器等方面都获得了广泛应用。

当然,下文中仍旧要使用有刷电机,毕竟成本低廉。下文中所述的直流电机均指有刷直流电动机。


单片机实验中常见的直流电机驱动芯片介绍

  • L9110S

  • L298N

  • 说明


    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 接模拟地
支持4种电机控制模式:正转/反转/制动/停止

支持4种电机控制模式:正转/反转/制动/停止

工作温度:-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智能机器人控制板

开发软件:Atmel Studio

老套路,发烟测试。
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 送底盘

禾灮智能机器人控制系统 支持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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容