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


单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第1张图片


单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第2张图片


直流电机(direct current machine)

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


直流电动机

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

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

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

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


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

  • L9110S

  • L298N

  • 说明
    单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第3张图片
    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,支持待机状态。
    单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第4张图片
    引脚说明

功能 引脚 引脚 功能
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 接模拟地

单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第5张图片
单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第6张图片
工作温度:-20~85℃
单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第7张图片


单片机对驱动芯片的编程控制方法

  • 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。

单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动_第8张图片
老套路,发烟测试。
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而言,具备:输出电压稳定、输入电压范围广、有待机功能、体积小、散热量低等明显优点。

    文中不足之处还请诸位批评指正、不吝赐教。    

    感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。

    感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。

    感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。

                禾灮,感谢有你。

    未来,我们将一如既往,砥砺前行。

                                        禾灮·小楊
                                       2018.07.19

你可能感兴趣的:(Arduino,Basic)