单片机-控制-直流电机-基于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)
blank

相关推荐

  • Python-random函数用法

    Python-random函数用法Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。random中的一些重要函数的用法:random.random()random.random()函数是这个模块中最常用的方法了,它会生成一个随机的浮点数,范围是在0.0~1.0之间。importrandomprint(random.random())&…

  • 图像语义分割之FCN和CRF

    图像语义分割之FCN和CRF前言(呕血制作啊!)前几天刚好做了个图像语义分割的汇报,把最近看的论文和一些想法讲了一下。所以今天就把它总结成文章啦,方便大家一起讨论讨论。本文只是展示了一些比较经典和自己觉得比较不错的结构,毕竟这方面还是有挺多的结构方法了。介绍图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类从图像上来看,就是我们需要将实际的场景图分割成下面的分割图:不同颜色代表不同类别。经过我阅读“

  • vscode 前端常用插件推荐「建议收藏」

    1.vscode简介vscode是微软开发的的一款代码编辑器,就如官网上说的一样,vscode重新定义(redefined)了代码编辑器。 当前市面上常用的轻型代码编辑器主要是:sublime,notepad++,editplus,atom这几种。 比起notepad++、editplus,vscode集成了许多IDE才具有的功能,比起它们更像一个代码编辑器; 比起sublime,…

  • Python – 实现矩阵转置

    Python – 实现矩阵转置有个朋友提出了一个问题:手头上现在有一个二维列表,比如[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],现在要把该二维列表变成为[[1,4,7,10],[2,5,8,11],[3,6,9,12]]。其实不动脑筋的话,用二重循环很容易写出来:#!/usr/bin/envpython3#-*-coding:utf-8-…

  • Android toArray

    Android toArrayArrayList提供了一个将List转为数组的一个非常方便的方法toArray。toArray有两个重载的方法:1.list.toArray();2.list.toArray(T[]a);对于第一个重载方法,是将list直接转为Object[]数组;第二种方法是将list转化为你所需要类型的数组,当然我们用的时候会转化为与list内容相同的类型。不明真像的同学喜欢用第

  • navicat15永久激活码最新【2021.7最新】「建议收藏」

    (navicat15永久激活码最新)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

发表回复

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

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