《基于51单片机的红外避障自动车的实现》技术报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《基于51单片机的红外避障自动车的实现》技术报告
摘要
本小组所设计一个带有红外传感器的小车,基本能实现自动避障的功能。
本小车以STC89C52为其主控单元,以俩个直流减速电机为驱动电机提供基本动力,并依据差速原理实现转向,用红外传感器进行探测,使用分离元件组成的电路去驱动电机,使用PWM波实现变速功能。
小车分为五个模块:STC89C52主控模块,传感模块,电源模块,电机驱动模块,测速模块。
关键词:89C52 红外避障自动车
题目:《基于51单片机的红外避障自动车的实现》
下面是一些基本资料:
——————————————小车参数——————————————障碍检测方式红外探测(探测模块功耗7mA)
车模几何尺寸(mm)149 x 102 x 59
测障精度前方:75 cm 左右:25cm
车模轮距(mm)120
电源系统 4 x 1.5 v干电池4 x 1.2 v充电电池及其稳压输出
电机直流减速电机,1~12V工作电压,传动比:71.2:1
主控芯片STC89C52MCU
其他芯片LM7806 LM7805 STC11F01等
—————————————小组资料———————————————
小组成员:
姓名班级善长项目负责模块
王太杰0804211班擅长于硬件
焊接技术强
硬件知识充足
红外探测部分
驱动调试
孙学军0904211班擅长于编程
C语言功底扎实
思路开阔
程序驱动部分
程序调试
李相华0804211班查阅资料能力强
善于方案选择和优化电源部分
小组优势:
硬件与程序搭配协调,每人负责各自模块,只提供最终模块接口,使对方不必关注自己模块内部结构,只需将接口连接完成即可,减少了每人负责的内容,提高了效率。
————————————制作流程与时间—————————————
2010年5月1日
小组成员对各模块电路进行了选择、优化,并进行了电路搭建、焊接,各模块调试,确定模块交互接口;主控程序思路成型,并编写了测试程序,对软硬件进行了测试。
最后各模块交互,整体调试,主程序确定及细节敲定。
2010年5月2日:
模块交互,整体调试,主控程序细节修改;经布局后各硬件模块转移至车体,最终焊接,整车成型。
主控程序下载,调试,最终成功。
—————————————技术资料——————————————
设计思路:
为节省电机数量和电路复杂程度,红外避障小车(以下简称小车)采用前轮主动,后轮从动原理。
前轮采用双电机驱动,利用差速法实现车身转向。
检测部分利用红外发射管发射红外光,遇障碍物后经反射被红外接受管接收,产生电平转换,利用单片机I/O口检测红外检测模块电平输出,以此判断前方障碍物有无,检测到障碍物后,经单片机I/O口控制电机驱动电路,经由电机驱动电路输出不同电压,产生差速,实现转向,最终以达到避障的目标。
其总体方框图如图所示:
STC89C52 单片机电
机驱
动模块
传
感
器
模
块
电源模块2个
直流
减速电机
主控模块:
方案一:采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力强、可靠性高、功耗低、结构简单、具有语音处理、运算速度快等优点,但考虑到我们小组对这个方案采用的微处理器并不熟悉,使用起来并不是很方便,这对于硬件电路的设计和软件编程增加了难度。
我们决定不再使用此方案,考虑其他方案。
方案二:采用STC 89C52单片机作为主控制器。
STC 89C52是一个超低功耗,和标准51系列单片机相比较具有运算速度快,抗干扰能力强,支持ISP在线编程,片内含8k空间的可反复擦写1000次的Flash只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个I/O口,2个16位可编程定时计数器。
其指令系统和传统的8051系列单片机指令系统兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,在后来的实验中我们发现,STC 89C52精确度和运算速度也都完全符合我们系统的要求。
综合以上方案我们选择比较普通的更为熟悉的方案二使用STC89C52单片机为我们整个系统的控制核心。
其各个引脚如图1所示
图1
探测模块:
方案一:用三极管驱动红外发射管和红外解收管。
在三极管的射级接俩个红外发射管,加大红外线的强度,进儿提高其探测距离。
在红外接收电路中,用电阻和红外接收管串联来调节基极的电位,当接收管接收到红外线时可以改
变基极电位,进儿使三极管工作在截止或饱和状态,即调节了输出电平,实现了高低电平的转换。
其发射和接受电路如图2所示:
图2
优点:电路简单,搭建方便。
缺点:探测精度不高,探测距离比较近。
考虑到小车行驶时对精度的要求,我们最终放弃了这套方案。
方案二:用三极管驱动红外发射管,用LM358来实现接受电路。
发射电路和方案一基本一致,这里就不赘述了。
LM358是包含俩个运算放大器的集成器件,我们用第一个放大器来实现对探测到得信号进行放大,把第二个作为电压比较器(阈值电压Vth=1/2Vcc)。
把处理过的信号和阈值电压进行比较,实现高低电平转换,并把数字信号送给单片机,使小车做出正确动作。
器接收电路如图所示:
优点:探测精度较高,并且通过滑动变阻器可以改变探测距离,可以适应不同环境进行探测。
缺点:电路较为复杂。
综合考虑,最终我们选择了方案二。
测速模块:
方案一:用光电对管实现测速。
光电对管是我们所熟知的器件,用它进行测速数据准确。
我们的电机上面正好有一个光栅,用其测速实现比容易。
但最终由于电机相对光电对管来说比较小,无法很好将二者结合起来,我们不得不放弃这种方案。
方案二:用红外对管实现测速。
由探测模块中的方案一可知,此电路探测距离短,稍作改动可以实现测速。
再小车的一个轮子上贴上黑纸,并在黑纸上贴上一条白纸(黑色可以吸收绝大多数的红外线而白纸却可以反射大部分红外线),当轮子转起来时就会产生高低电平,送给单片机的计数器进行计数。
通过单位时间内的轮子转过的圈数实现了测速.。
其电路如图所示:
通过实验分析可得,此方案基本可以满足我们的需要。
最终选择了此方案。
电源模块:
方案一:交流供电。
实现方式:220V交流电经整流稳压获得。
优点:供电稳定,电压输出灵活。
缺点:须稳压,电源传输线较长,且可能会对车子的避障功能产生干扰。
考虑到小车行驶的灵活性和避障抗干扰性,我们抛弃了采用交流电的方案。
方案二:直流电供电。
实现方式:4接南孚电池串联获得。
优点:无需稳压即可输出稳定电压,无需使用电源线。
缺点:电压输出固定,无法获得灵活的电压输出。
考虑到避障小车工作时各模块需求电压分别为:单片机4.5~5.5V,电机1~12V,红外测障模块5V,灵活性不高,因此可实现5V、6V的电压输出对各模块供电。
因此我们最终采用直流电供电方式。
在制作调试过程中,我们采取了4节5号南孚电池,用电池盒串联。
经测量4节南孚电池串联输出为6.3V稳定电压。
针对各模块电压需求我们产生以下具体实现方案:
单片机电源:单片机工作电压为4.5V~5.5V,且其对工作电压要求比较严格
方案一:
我们设想采取基于LM7805稳压芯片的稳压芯片输出5V恒定电压。
但是由于LM7805对输入输出两端电压要求有2~3V压降,且稳压芯片功耗较大,可能导致电源利用效率不高,故最终舍弃了这种方案。
方案二:
经过在网上查阅相关经验方法,我们最终确定了一种简单易行的方法:在电源处串联一个(两个/可通过跳线帽选择)二极管实现0.7V(1.3V)压降,用来提供单片机工作电压。
如图2所示:
图2 电源模块
驱动电路电源:电机对电压要求不精确,但电压会影响电机功率以及速度。
方案一:
采用模拟CD-DC升压电路获得较高电压供给电机驱动电路已获得较高的功率输出,提高转速。
最终考虑到电路实现的复杂性。
我们最终舍弃了这种方案。
方案二:
采用专门的直流电升压芯片(比如MC34063A)以简化电路。
不过最终由于经济原因放弃了这种方案。
方案三:
直接用电池串联后的电压给驱动电路供电,此方案简单易行,制作成本较低,不过电机功率不大。
最终经测试小车速度能达到我们的需求,最终采取了本种方案。
经分析电源方案的优缺点,我们得出以下方案:考虑到一次性干电池的不可利用性,我们在整车成型时采用了4节可充电电池经电池盒串联的方案,以降低后续制作成本。
考虑到电压输出端的单一性,我们考虑采用10V稳压管另做一路电源输出,为电机提供工作电压,在一定程度上可提高电机功率,提高整车运行速度。
电机驱动模块:
方案一:
采用电机驱动集成芯片(如L9110)来驱动电机。
优点:电路简化,双路输出,可以实现双电机的正反向转动,实现整车的前进后退。
但由于电机驱动集成芯片的价格比较高(18~30元/片),为降低制作成本,最终舍弃了采用电机驱动芯片驱动的方案。
方案二:
采用分立元件模拟电路驱动。
优缺点:制作成本低,电路无法简化,稳定性较驱动芯片(如L9110)差。
经考虑避障小车的控制精度不是很高,运用分立元件模拟电路即可达到系统要求,最终采取了本种方案。
经选择我们最终采取了利用双三极管控制开关电路,利用三极管的反应灵敏性,并将其俩端接在MCU的I/O口上,可以通过控制I/O口输出0、1来控制三极管开关,以达到控制输出电压的目的。
最终驱动电路如图3所示:其控制如表所示:
图3 电机驱动
表1
P0^0 P0^1 P0^2 P0^3 状态
1 0 1 0 前进
0 1 0 1 后退
1 0 0 0 右转
0 0 1 0 左转
—————————————主控程序——————————————
为了降低程序复杂性,我们分析了软件运行原理,尽量简化程序设计。
单片机我们最终选用了10个I/O口。
其中1个用来计数或测速,3个I/O口用来接收红外部分电平转换,检测障碍物,2个I/O口用来控制转向灯,另外4个I/O口端接电机驱动电路,用程序使其产生0、1脉冲数量比来控制驱动电路开关,最终实现速度差以实现转向避障。
主控程序如下:
/* *****************************
程序开发环境Keil uVision3
语言:C
编写者:王太杰
时间:2010/04/04
***************************** */
/* *****************************
主程序及注释如下:
***************************** */
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit x=P2^0; //定义左侧探测器接收端
sbit y=P2^1; //定义中间探测器接收端
sbit z=P2^2; //定义右侧探测器接收端
sbit m1=P1^0;
sbit m2=P1^1; //定义左侧电机控制端
sbit n1=P1^2;
sbit n2=P1^3; //定义右侧电机控制端
sbit l=P1^4; //定义左侧转向灯控制端
sbit r=P1^5; //定义右侧转向灯控制端
uint k,num;
void delays(uint i) //定义一个延时1MS的延时函数{
uint m,n;
for(m=i;m>0;m--)
for(n=110;n>0;n--);
}
input_num(uchar bai,uchar shi, uchar ge) //信号运算函数
{
uint he;
he=4*bai+2*shi+ge;
return(he);
}
void zuo_zhuan() //小车左转函数
{
uint i;
for(i=1;i<=5;i++)
{
m1=0;
m2=0;
n1=1;
n2=0;
l=1; //控制转向灯
r=1;
delays(15);
m1=1;
m2=0;
n1=1;
n2=0;
l=0;
r=1;
delays(5);
}
}
void you_zhuan() //小车右转函数
{
uint i;
for(i=1;i<=5;i++)
{
m1=1;
m2=0;
n1=0;
n2=0;
l=1;
r=1;
delays(15);
m1=1;
m2=0;
n1=1;
n2=0;
l=1;
r=0;
delays(5);
}
}
void hou_tui() //小车倒车函数{
uint i;
for(i=1;i<=50;i++)
{
m1=0;
m2=1;
n1=0;
n2=1;
l=1;
r=1;
delays(15);
m1=0;
m2=1;
n1=0;
n2=1;
l=0;
r=0;
delays(10);
}
for(i=1;i<=50;i++)
{
m1=0;
m2=0;
n1=1;
n2=0;
l=1;
r=1;
delays(20);
m1=1;
m2=0;
n1=1;
n2=0;
l=0;
r=1;
delays(5);
}
}
void qian_jin() //小车前进函数
{
uint i;
for(i=1;i<=5;i++)
{
m1=1;
m2=0;
n1=1;
n2=0;
l=1;
r=1;
delays(20);
}
}
uint read() //小车测速的计数函数{
uchar t1,th1,th2;
uint val;
while(1)
{
th1=TH0;
t1=TL0;
th2=TH0;
if(th1==th2)
break;
}
val=th1*256+t1;
return val;
}
void T1_time() interrupt 3 //定义定时器1 {
TH1=(65535-45872)/256;
TL1=(65535-45872)%256; //定时时间为50ms k++;
if(k==30)
{
num=read();
k=0;
TH0=0;
TL0=0; //计数器清零
}
}
main() //主函数
{
uint grade;
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65535-45872)/256;
TL1=(65535-45872)%256; //在定时器中装入初值EA=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
if(num==0)
hou_tui();
else if(num!=0)
{
grade=input_num(x,y,z);
switch(grade)
{
case 2:qian_jin();break;
case 0:
case 4:
case 6:you_zhuan();break;
case 1:
case 3:zuo_zhuan();break;
case 5:
case 7:hou_tui();break;
}
}
}
}
/* *****************************
程序结束,经测试程序符合硬件,功能达到预期目标。
***************************** */
———————功能扩展————————
1:本车人机交互性不强,车体速度无显示、障碍物有无显示不明显,无转向灯提示
预期可以增加速度测量以及液晶或数码管显示模块,显示模块可以附在车体本身,也可以单独成模块,利用无线传输将数据从车体发送到终端显示。
2:增加自动循迹功能
实现自动循迹
3:增加自动刹车功能
增加路径识别或特定障碍物识别,实现自动刹车功能。
4:遥控功能
增加红外遥控功能,控制车体前进、后退、左转、右转、加速、减速等功能。
注:
附录1:
1. 红外遥控
2.无线遥控
3.自动循迹
4.速度采集模块
5.温度多路采集
6.光电使用电路(如:断电警报,依据外界光照自动调节亮度等)
7.各种数据的显示(如:1602,诺基亚5110显示器等)
8.数字温度计
9.移动闹钟。