基于51单片机的红外避障自动车的实现
下面是一些基本资料:
—————————————————————小车参数——————————————————————————
障碍检测方式:红外探测(探测模块功耗7mA)
车模几何尺寸:149 x 102 x 59 (mm)
车 模 轮 距:120 (mm)
测 障 精 度:75 cm
电 源 系 统:4 x 1.5 v 干电池/4 x 1.2 v 充电电池及其稳压输出
电机:直流减速电机,1~12V工作电压,传动比:71.2:1
主 控 芯 片:STC89C52MCU
其 他 芯 片:LM7806 LM7805 STC11F01等
—————————————————————小组资料——————————————————————————
小组成员:
王太杰:0804211班,擅长于硬件,焊接技术强,硬件知识充足,在本次制作中负责电机驱动部分建与调试。
孙学军:0904211班,擅长于编程,C语言功底扎实,思路开阔,在本次制作中负责程序驱动部分程序调试。
李相华:0804211班,在本次制作中负责电源部分。
小组优势:
硬件与程序搭配协调,每人负责各自模块,只提供最终模块接口,使队友不必关注对方模块内部结构,只需将接口连接完成即可,大大减少了每人负责的内容,提高了效率。
—————————————————————制作流程与时间———————————————————————
2010年4月3日(周六):
小组成员对各模块电路进行了选择、优化,并进行了电路搭建、焊接,各模块调试,确定模块交互接口;主控程序思路成型,并编写了测试程序,对软硬件进行了测试。最后各模块交互,整体调试,主程序确定及细节敲定。
2010年4月4日(周日):
模块交互,整体调试,主控程序细节修改;经布局后各硬件模块转移至车体,最终焊接,整车成型。主控程序下载,调试,最终成功。
—————————————技术资料———————————————————
设计思路:
为便节省电机数量和电路复杂程度,红外避障小车(以下简称小车)采用前轮主动,后轮从动原理。前轮采用双电机驱动,利用差速法实现车身转向。
检测部分利用红外发射管发射红外光,遇障碍物后经反射被红外接受管接收,产生电平转换,利用单片机I/O口检测红外检测模块电平输出,以此判断前方障碍物有无,检测到障碍物后,经单片机I/O口控制电机驱动电路,经由电机驱动电路输出不同电压,产生差速,实现转向,最终以达到避障的目标。
电源模块:
考虑到小车行驶的灵活性,我们抛弃了采用交流电的方案。在制作调试过程中,我们采取了4节1.5V5号南孚电池,经电池盒串联后可获得5.9~6.5V稳定电压输出,直接给电机驱动电路供电。但考虑到51单片机工作电压为4.5V~5.5V,且其对工作电压要求比较严格。对此,我们设想采取基于LM7805稳压芯片的稳压芯片输出5V恒定电压。电源电路图见附件,由于在制作中手头只有一片LM7806,于是我们在输出端串联了一个IN4007二极管,产生0.7V压降,最终获得5.2V~5.3V稳定电压输出,给单片机供电。以提高系统稳定性。
在最终整车成型时我们采用了5V稳压二极管稳定电压,原因有二:一是降低了电源电路功耗,二是降低了制作成本。考虑到一次性干电池的不可利用性,我们在整车成型时采用了4节可充电电池经电池盒串联的方案,以降低后续制作成本。考虑到电压输出端的单一性,我们考虑采用10V稳压管另做一路电源输出,为电机提供工作电压,在一定程度上可提高电机功率,提高整车运行速度。
电机驱动模块:
考虑到电机驱动集成芯片的价格比较高(18~30元/片),我们舍弃了采用电机驱动芯片驱动的方案,转而寻求分立元件模拟电路驱动,经最终选择我们采取了利用双三极管控制开关电路,利用三极管的反应灵敏性,并将其一端接在MCU的I/O口上,可以通过控制I/O口输出0、1脉冲数量比来控制三极管开关,以达到控制输出电压的目的。驱动电路图见附件。
主控程序:
为了降低程序复杂性,我们使用了3个I/O口,一个I/O口用来接收红外部分电平转换,检测障碍物,另外两个I/O口端接电机驱动电路,用程序使其产生0、1脉冲数量比来控制驱动电路开关。最终实现速度差以实现转向避障。
主控程序如下:
/* *****************************
程序开发环境Keil uVision3
语言:C
编写者:孙学军
时间:2010/04/04
***************************** */
/* *****************************
主程序及注释如下:
***************************** */
#includereg52.h> //添加函数库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit s=P3^5; //定义红外避障检测端口
sbit m1=P3^4; //定义电机M1电平输出端口
sbit m2=P3^6; //定义电机M2电平输出端口
void delay_ms(uint z); //声明延时函数
main() //主函数
{
uint i=0; //初始值设定
m1=1;
m2=1;
while(1) //无限循环
{
if(s==0) //S=0表示前方有障碍物 进行转向
{
for(i=0;i5;i++)
{
m1=0;
m2=1;
delay_ms(15); //状态保持15ms
m1=1;
m2=1;
delay_ms(5); //状态保持5ms
}
}
if(s==1) //S=1表示前方无障碍物 直线行驶
{
m1=1;
m2=1;
delay_ms(10); //状态保持10ms
}
}
}
void delay_ms(uint z) //延时函数 循环嵌套原理
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)