单片机-控制-直流电机-基于L9110S-、L298N、TB6612FNG驱动[通俗易懂]

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

大家好,又见面了,我是你们的朋友全栈君。


直流电机控制


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而言,具备:输出电压稳定、输入电压范围广、有待机功能、体积小、散热量低等明显优点。

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

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

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

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

                禾灮,感谢有你。

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

                                        禾灮·小楊
                                       2018.07.19

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129272.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • strtok()函数的使用以及注意事项

    strtok()函数的使用以及注意事项一、函数的简介        函数原型:char*strtok(char*s,char*delim)       功能:作用于字符串s,以delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。        返回值:分隔符匹配到的第一个子串二、主要内容       1、函数的作用

  • Field XXX in XXXX required a bean of type XXXX that could not be found

    Field XXX in XXXX required a bean of type XXXX that could not be found

  • Hibernate官网下载最新版jar包[通俗易懂]

    Hibernate官网下载最新版jar包[通俗易懂]官网地址:http://hibernate.org/1、点击HibernateORM的More2、点击下载最新版3、向下滚动,下载自己所需要的版本,点击Download4、等待几秒后弹出下载5、如果下载其他旧版本,可以在第一步后,点解页面中的otherseries.6、更老的版本点击seeolderseries7、下载4.2版本,点击Moreinfo8…

    2022年10月31日
  • MySQL允许root远程登录[通俗易懂]

    MySQL允许root远程登录[通俗易懂]新安装的数据库只能localhost访问??是不是很苦逼下面介绍如何允许远程访问root1.“试一下”能否远程登录&gt;mysql-uroot-p-h10.0.42.180答案是否定的。那就开始进行设置吧2.登录数据库,默认本地访问&gt;mysql-uroot-p3.切换mysql数据库mysql&gt;usem…

  • Node.js异步处理CPU密集型任务

    Node.js异步处理CPU密集型任务

    2021年11月29日
  • Oracle-帝国的崛起![通俗易懂]

    Oracle-帝国的崛起![通俗易懂][编者本段]Oracle的起源  oracle是瓦砾(YinXu)出土的甲骨文(oracleboneinscriptions)的英文通译的第一个单纯词,在英语里是“神谕”的意义。  [编者本段]Oracle市场份额  在二零零七年Oracle在数据库市场仍然保持着强劲的大势,盘踞了数据库领域48.6%的市场份额。作为数据库软件市场的领跑者,Oracle数据库从上年推出了11g版本以来,在整个

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号