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的褐色线锡焊在右边电机的上面、红色线锡焊在右边电机的下面。
- 电源线:
- L9110S上的VCC——电源VCC
- L9110S上的GND——电源GND
- 单片机GND——电源GND。原因:要想实现单片机和L9110S驱动模块的信号传输,不仅需要连接好相应的I/O口,还需要将两者共地。
- 控制线:
- L9110S上的B-1A——P3.2。此时单片机这个引脚间接连接到右电机下触点,作用是通过电平切换控制右电机正反转。
- L9110S上的B-1B——P3.3。此时单片机这个引脚间接连接到右电机上触点,作用是通过电平切换控制右电机正反转。
- L9110S上的A-1A——P3.4。此时单片机这个引脚间接连接到左电机下触点,作用是通过电平切换控制左电机正反转。
- L9110S上的A-1B——P3.5。此时单片机这个引脚间接连接到左电机上触点,作用是通过电平切换控制左电机正反转。
2、电机正反转测试:
- 说明:网上给的说明和L9110S的引脚编号对不上,自己测试一下即可。电机的上下接触点的电平可高可低,所以一个电机最多共有4种转动情况,依次验证即可。
- 测试代码:
/* 公共代码 */ #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、小车前进函数封装 :
- 逻辑:左轮和右轮都正转
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); }