综合电子课程设计智能循迹避障小车精品.docx
《综合电子课程设计智能循迹避障小车精品.docx》由会员分享,可在线阅读,更多相关《综合电子课程设计智能循迹避障小车精品.docx(16页珍藏版)》请在冰点文库上搜索。
综合电子课程设计智能循迹避障小车精品
题目名称:
循迹壁障智能小车设计
组员:
班级:
指导老师:
日期:
智能循迹避障小车
摘 要:
利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。
其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。
关键词:
智能小车;STC89C52单片机;L298N;
实验目的:
通过设计进一步掌握5别1单片机的应用,特是在嵌入式系统中的应用。
进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
实现控制小车的循迹和蔽障的功能,
一、方案设计与论证
1.1主控系统
根据设计要求,我认为此设计属于多输入量的复杂程序控制问题。
据此,拟定了以下两种方案并进行了综合的比较论证,具体如下:
方案一:
选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。
CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。
但CPLD在控制上较单片机有较大的劣势。
同时,CPLD的处理速度非常快,而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。
若采用该方案,必将在控制上遇到许许多多不必要增加的难题。
为此,我们不采用该种方案,进而提出了第二种设想。
方案二:
采用51单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。
根据这些分析,我选定了P89C51RA单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。
1.2电机驱动模块
方案一:
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。
方案二:
采用电阻网络或数字电位器调节电动机的分压,从而达到分压的目的。
但电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。
更主要的问题在于一般的电动机电阻很小,但电流很大,分压不仅回降低效率,而且实现很困难。
方案三:
采用功率三极管作为功率放大器的输出控制直流电机。
线性型驱动的电路结构和原理简单,加速能力强,采用由达林顿管组成的H型桥式电路。
用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高,H型桥式电路保证了简单的实现转速和方向的控制,电子管的开关速度很快,稳定性也极强,是一种广泛采用的PWM调速技术。
现市面上有很多此种芯片,我选用了L298N。
这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。
因此决定采用使用功率三极管作为功率放大器的输出控制直流电机。
1.3循迹模块
方案一:
采用简易光电传感器结合外围电路探测,但实际效果并不理想,对行驶过程中的稳定性要求很高,且误测几率较大、易受光线环境和路面介质影响。
在使用过程极易出现问题,而且容易因为该部件造成整个系统的不稳定。
故最终未采用该方案。
方案二:
采用两只红外对管,分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好两只光电开关的位置就可以很好的实现循迹的功能。
方案三:
采用三只红外对管,一只置于轨道中间,两只置于轨道外侧,当小车脱离轨道时,即当置于中间的一只光电开关脱离轨道时,等待外面任一只检测到黑线后,做出相应的转向调整,直到中间的光电开关重新检测到黑线(即回到轨道)再恢复正向行驶。
现场实测表明,小车在寻迹过程中有一定的左右摇摆不定,虽然可以正确的循迹但其成本与稳定性都次与第二种方案。
通过比较,我选取第二种方案来实现循迹。
1.4避障模块
方案一:
采用一只红外对管置于小车中央。
其安装简易,也可以检测到障碍物的存在,但难以确定小车在水平方向上是否会与障碍物相撞,也不易让小车做出精确的转向反应。
方案二:
采用二只红外对管分别置于小车的前端两侧,方向与小车前进方向平行,对小车与障碍物相对距离和方位能作出较为准确的判别和及时反应。
但此方案过于依赖硬件、成本较高、缺乏创造性,而且置于小车左方的红外对管用到的几率很小,所以最终未采用。
方案三:
采用一只红外对管置于小车右侧。
通过测试此种方案就能很好的实现小车避开障碍物,且充分的利用资源而不浪费。
通过比较我们采用方案一。
1.5电源模块
方案一:
采用实验室有线电源通过稳压芯片7805供电,其优点是可稳定的提供5V电压,但占用资源过大。
方案二:
采用4支1.5V电池单电源供电,但6V的电压太小不能同时给单片机与与电机供电。
方案三:
采用8支1.5V电池双电源分别给单片机与电机供电可解决方案二的问题且能让小车完成其功能。
所以,我选择了方案一来实现供电。
二、硬件设计
2.1总体设计
智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,后轮是万象轮,起支撑的作用。
将循迹光电对管分别装在车体下的左右。
当车身下左边的传感器检测到黑线时,主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。
避障的原理和循线一样,在车身中间装一个光电对管,当其检测到障碍物时,主控芯片给出信号报警并控制车子倒退,转向,从而避开障碍物。
2.1.1主板设计框图,所需原件清单。
元件清单
元件
数量
元件
数量
元件
数量
直流电机
4只
电阻
若干
集成电路芯片
若干
单片机
1块
二极管
若干
电容
若干
12M晶振
1只
杜邦线
若干
电动小车
1个
排针
若干
2.2驱动电路
电机驱动一般采用H桥式驱动电路,L298N内部集成了H桥式驱动电路,从而可以采用L298N电路来驱动电机。
通过单片机给予L298N电路PWM信号来控制小车的速度,起停。
电机驱动电路
三、软件设计
3.1
主程序框图:
3.2循迹模块
循迹框图:
循迹框图
3.3避障模块
避障框图:
程序:
#include//器件配置文件
#include
unsignedinttt,i,l;
voidinit();
sbitD1=P1^0;
sbitD2=P1^1;
sbitD3=P1^2;
sbitD4=P1^3;
sbitD5=P0^7;
sbitD7=P1^4;
sbitD8=P1^5;
sbitD9=P1^6;
sbitD10=P1^7;
voiddelay(unsignedintt)
{
while(--t);
}
voidstop()
{
D1=1;D2=1;D3=1;D4=1;
}
voidforward()
{
D1=1;D2=1;D3=1;D4=1;
delay(40);
D1=1;D2=0;D3=1;D4=0;
delay(60);
}
voidbackward()
{
D1=0;D2=1;D3=0;D4=1;
}
voidturnleft()
{
D1=0;D2=1;D3=1;D4=0;
}
voidturnright()
{
D1=1;D2=0;D3=0;D4=1;
}
voidbizhang()
{
while(D5==0)
{
backward();
delay(65535);
turnleft();
delay(65535);
}
}
voidxjbzwx()
{
while(D8==0&&D9==0&&D7==0&&D10==0)
{
bizhang();
forward();
}
if(D8==1&&D9==1&&D7==1&&D10==1)
{
bizhang();
stop();
}
if(D7==1&&D8==0&&D9==0&&D10==0)
{
bizhang();
for(i=400;i>0;i--)
{
turnleft();
}
}
if(D7==0&&D8==0&&D9==0&&D10==1)
{
bizhang();
for(i=400;i>0;i--)
{
turnright();
}
}
if(D7==0&&D8==1&&D9==0&&D10==0)
{
bizhang();
for(i=100;i>0;i--)
{
turnleft();
}
}
if(D7==0&&D8==0&&D9==1&&D10==0)
{
bizhang();
for(i=100;i>0;i--)
{
turnright();
}
}
if((D7==1||D8==1)&&(D9==0&&D10==0))
{
bizhang();
for(i=100;i>0;i--)
{
turnleft();
}
}
if((D7==0&&D8==0)&&(D9==1||D10==1))
{
bizhang();
for(i=100;i>0;i--)
{
turnright();
}
}
}
voidmain(void)
{
while
(1)
{
xjbzwx();
}
}
四、结束语
通过很多天的准备,终于在老师和同学的帮助下,初步完成了对循迹蔽障小车的制作。
在这个过程中,我们又进一步学习了单片机及其外围模块的原理和应用。
对电路的焊接和器件的组合,加强了我们实验上的动手能力,尤其是小车模块的安装,电机的去驱动等等,都让我们学到了很多东西。
软件方面,多个程序的组合以及中断定时的应用,让我们对C51语言的学习有了更多的体会。
在这个过程中,也遇到了很多的困难的和挫折,虽然这个循迹壁障小车看起来很简单,但是我们在实现的过程中总屡屡失败。
开始时对个模块的安装及连接,这个过程还算顺利,在后面的循迹调试时就有很多问题了,首先在软件上,我们结合硬件,不断的调试程序,让其实现该循迹功能,这个过程花费了我们很多的时间,因为小车循迹时总往往不如人愿,一直不能沿着黑线跑,总冲出线外,所以调试有点困难。
但是这个不单单是软件的问题,在循迹模块安装的位置也对其循迹的准确度有很大的影响,在我们的调试过程中发现,同样的程序,左右循迹的程序都一样的,但是在实现过程中发现小车有时能成功循迹,有时却不行,或者一边循迹灵敏,另一边却不灵敏的情况,经过多次的探寻,发现是循迹模块安装的位置以及其自身灵敏度有关,经过不断的软件及硬件的调节,终于实现成功的循迹。
在壁障这块,实现起来就比循迹简单一些了,只需简单对其反馈的电平做出相应的反应就行。
结合两者,壁障优先级大于循迹,我们这设计程序时,每一次循迹都先判断一下壁障,看是否有障碍物,有的话避开,再继续循迹。
其实在这次的课程设计过程中我们能的收获真的很多,我们其实做的不仅只是循迹和壁障这两个功能,我们也尝试加入无线模块,进行无线控制,但是经过多次尝试,发现还是失败,离验收时间越来越近,我们就放下无线这块了。
虽然无线没做成功,但是我们从中也吸取了很多教训,为我们下次的尝试打下了深深的基础。
参考文献
[1]郭惠,吴迅.单片机C语言程序设计完全自学手册[M].电子工业出版社,2008.10:
1-200.
[2]王东锋,王会良,董冠强.单片机C语言应用100例[M].电子工业出版社,2009.3:
145-300.
[3]韩毅,杨天.基于HCS12单片机的智能寻迹模型车的设计与实现[J].学术期刊,2008,29(18):
1535-1955.
[4]王晓明.电动机的单片机控制[J].学术期刊,2002,13(15):
1322-1755.