L9110S电机驱动模块demo

0.资料

项目工程文件夹

分文件原理


1.认识L9110S

1、概述:

一个L9110S驱动可以控制一个电机,图中左右两个黑色芯片就是L9110S驱动。当然如果会硬件也可以直接把它们设计到单片机开发板上。

一个电机由两个针脚控制,我们用杜邦线让L9110S和单片机连接,两个针脚的电平高低会决定电机正转还是反转。

2、引脚说明:

  • L9110S模块有6根引脚,如下:
    编号 符号 说明
    1 VCC 供电,3~5,5V,DC
    2 GND 接地,电源负极
    3 A-1A 如上图中,与MotorA左侧端子相连。
    4 A-1B 如上图中,与MotorA右侧端子相连。
    5 B-1A 如上图中,与MotorB左侧端子相连。
    6 B-2A 如上图中,与MotorB右侧端子相连。
  • 值得注意的是,最好不要直接由开发板来给模块供电,因为L9110S模块可能会因为需求的驱动功率太高而导致板子上的供电不平衡。

2.L9110s驱动测试

1、和单片机的接线方式:注意一开始把电池电源切断,防止接线的时候出错烧毁L9110S模块。

  • 为了适配接下来的代码:以车头方向超前为准,小车上L9110S驱动模块和两个电机的连接方式如下:
    • 驱动模块上motor A的白色线锡焊在左边电机的上面、黑色线锡焊在左边电机的下面
    • 驱动模块上motor B的褐色线锡焊在右边电机的上面、红色线锡焊在右边电机的下面。
  1. 电源线
    1. L9110S上的VCC——电源VCC
    2. L9110S上的GND——电源GND
    3. 单片机GND——电源GND。原因:要想实现单片机和L9110S驱动模块的信号传输,不仅需要连接好相应的I/O口,还需要将两者共地。
  2. 控制线
    1. L9110S上的B-1A——P3.2。此时单片机这个引脚间接连接到右电机下触点,作用是通过电平切换控制右电机正反转。
    2. L9110S上的B-1B——P3.3。此时单片机这个引脚间接连接到右电机上触点,作用是通过电平切换控制右电机正反转。
    3. L9110S上的A-1A——P3.4。此时单片机这个引脚间接连接到左电机下触点,作用是通过电平切换控制左电机正反转。
    4. L9110S上的A-1B——P3.5。此时单片机这个引脚间接连接到左电机上触点,作用是通过电平切换控制左电机正反转。

L9110S电机驱动模块demo_第1张图片

L9110S电机驱动模块demo_第2张图片

2、电机正反转测试:

  1. 说明:网上给的说明和L9110S的引脚编号对不上,自己测试一下即可。电机的上下接触点的电平可高可低,所以一个电机最多共有4种转动情况,依次验证即可。
  2. 测试代码
    /* 公共代码 */
    #include "reg52.h"
    
    sbit RightCon_1A = P3^2;   //L9110S的MotorB_1A--右轮电机下接触点
    sbit RightCon_1B = P3^3;   //L9110S的MotorB_1B--右轮电机上接触点
    sbit LeftCon_1A  = P3^4;   //L9110S的MotorA_1A--左轮电机下接触点
    sbit LeftCon_1B  = P3^5;   //L9110S的MotorA_1B--左轮电机上接触点
    
    /* 情形一: */
    void main(void)
    {
        /* 右轮测试:不转 */
        RightCon_1A = 0;
        RightCon_1B = 0;
        /* 左轮测试:不转 */
        LeftCon_1A = 0;
        LeftCon_1B = 0;
    }
    
    /* 情形二: */
    void main(void)
    {
        /* 右轮测试:前进 */
        RightCon_1A = 0;
        RightCon_1B = 1;
        /* 左轮测试:前进 */
        LeftCon_1A = 0;
        LeftCon_1B = 1;
    }
    
    /* 情形三: */
    void main(void)
    {
        /* 右轮测试:倒退 */
        RightCon_1A = 1;
        RightCon_1B = 0;
        /* 左轮测试:倒退 */
        LeftCon_1A = 1;
        LeftCon_1B = 0;
    }
    
    /* 情形四: */
    void main(void)
    {
        /* 右轮测试:不转 */
        RightCon_1A = 1;
        RightCon_1B = 1;
        /* 左轮测试:不转 */
        LeftCon_1A = 1;
        LeftCon_1B = 1;
    }

  3. 测试结果
    1. 电机正转(向前):下接触点为高电平、上接触点为低电平。
    2. 电机反转(向后):下接触点为低电平、上接触点为高电平。
    3. 其余两种电平情况电机均不转动。

3.前后左右控制小车

1、小车前进函数封装 :

  • 逻辑:左轮和右轮都正转
    void goForward()
    {
        /* 右轮:前进 */
        RightCon_1A = 0;
        RightCon_1B = 1;
        /* 左轮:前进 */
        LeftCon_1A = 0;
        LeftCon_1B = 1;
    }

2、小车后退函数封装:

  • 逻辑:左轮和右轮都反转
    void goBack()
    {
        /* 右轮:倒退 */
        RightCon_1A = 1;
        RightCon_1B = 0;
        /* 左轮:倒退 */
        LeftCon_1A = 1;
        LeftCon_1B = 0;
    }

3、小车向前左转函数封装:

  • 逻辑:左轮停止、右轮正转
    void goForward_left()
    {
        /* 右轮:前进 */
        RightCon_1A = 0;
        RightCon_1B = 1;
        /* 左轮:不转 */
        LeftCon_1A = 0;
        LeftCon_1B = 0;
    }

4、小车向前右转函数封装:

  • 逻辑:右轮停止、左轮正转
    void goForward_right()
    {
        /* 右轮:不转 */
        RightCon_1A = 0;
        RightCon_1B = 0;
        /* 左轮:前进 */
        LeftCon_1A = 0;
        LeftCon_1B = 1;
    }

5、小车向后左转函数封装:

  • 逻辑:左轮停止、右轮反转
    void goBack_left()
    {
        /* 右轮:倒退 */
        RightCon_1A = 1;
        RightCon_1B = 0;
        /* 左轮:不转 */
        LeftCon_1A = 0;
        LeftCon_1B = 0;
    }

6、小车向后右转函数封装:

  • 逻辑:右轮停止、左轮反转
    void goBack_right()
    {
        /* 右轮:不转 */
        RightCon_1A = 0;
        RightCon_1B = 0;
        /* 左轮:倒退 */
        LeftCon_1A = 1;
        LeftCon_1B = 0;
    }

4.电机转动测试demo_分文件

1、主程序“main”:

  • 代码:
    #include "reg52.h"
    #include "motor.h"
    #include "delay.h"
    
    void main(void)
    {
        goForward();        //测试:前进
        Delay1000ms();
        Delay1000ms();
        goBack();           //测试:后退
        Delay1000ms();
        Delay1000ms();      
        goForward_left();   //测试:向前左转
        Delay1000ms();
        Delay1000ms();
        goForward_right();  //测试:向前右转    
        Delay1000ms();
        Delay1000ms();
        goBack_left();      //测试:向后左转
        Delay1000ms();
        Delay1000ms();
        goBack_right();     //测试:向后右转
        Delay1000ms();
        Delay1000ms();
    }

2、“电机”模块:

  • 代码:
    #include "reg52.h"
    
    sbit RightCon_1A = P3^2;   //L9110S的MotorB_1A--右轮电机下接触点
    sbit RightCon_1B = P3^3;   //L9110S的MotorB_1B--右轮电机上接触点
    sbit LeftCon_1A  = P3^4;   //L9110S的MotorA_1A--左轮电机下接触点
    sbit LeftCon_1B  = P3^5;   //L9110S的MotorA_1B--左轮电机上接触点
    
    void goForward()
    {
        /* 右轮:前进 */
        RightCon_1A = 0;
        RightCon_1B = 1;
        /* 左轮:前进 */
        LeftCon_1A = 0;
        LeftCon_1B = 1;
    }
    
    void goBack()
    {
        /* 右轮:倒退 */
        RightCon_1A = 1;
        RightCon_1B = 0;
        /* 左轮:倒退 */
        LeftCon_1A = 1;
        LeftCon_1B = 0;
    }
    
    void goForward_left()
    {
        /* 右轮:前进 */
        RightCon_1A = 0;
        RightCon_1B = 1;
        /* 左轮:不转 */
        LeftCon_1A = 0;
        LeftCon_1B = 0;
    }
    
    void goForward_right()
    {
        /* 右轮:不转 */
        RightCon_1A = 0;
        RightCon_1B = 0;
        /* 左轮:前进 */
        LeftCon_1A = 0;
        LeftCon_1B = 1;
    }
    
    void goBack_left()
    {
        /* 右轮:倒退 */
        RightCon_1A = 1;
        RightCon_1B = 0;
        /* 左轮:不转 */
        LeftCon_1A = 0;
        LeftCon_1B = 0;
    }
    
    void goBack_right()
    {
        /* 右轮:不转 */
        RightCon_1A = 0;
        RightCon_1B = 0;
        /* 左轮:倒退 */
        LeftCon_1A = 1;
        LeftCon_1B = 0;
    }

3、“软件延时”模块:

  • 代码:
    #include "intrins.h"
    
    void Delay1000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	i = 8;
    	j = 1;
    	k = 243;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }

你可能感兴趣的:(单片机)