轨道检测并测角度智能车设计报告.docx
《轨道检测并测角度智能车设计报告.docx》由会员分享,可在线阅读,更多相关《轨道检测并测角度智能车设计报告.docx(41页珍藏版)》请在冰豆网上搜索。
轨道检测并测角度智能车设计报告
轨道检测车设计报告
Rasingstargroup
严若亚、胡云鹏、刘炜炘
小车总体效果
1智能小车的设计分析
1.1设计要求
本次比赛的要求是:
制作一辆循迹功能的小车,在一个2MX2M的白色场地上以最快的速度沿1CM宽的黑色轨迹由起点行走到终点。
在行走过程中,要对轨迹上的弯角的角度进行测量记录,对圆弧型轨迹的半径、弧度进行测量记录,并将所有测量结果显示在液晶屏幕上。
1.2设计方案及论证
1.2.1总体的设计思路
总体可以分为以下模块:
(1)信号采集模块:
此模块主要由传感器和运算放大器组成,负责循迹检测和测角度的任务,其中通过红外传感器来实现循迹功能,通过电子指南针进行角度和半径弧长的测量。
(2)控制模块:
此模块的核心是单片机STC89C52。
单片机将采集到的信号进行判断和处理后,将处理好的信号送入下面的执行模块,使之做相应的动作。
(3)执行模块:
此模块主要包括电机驱动和液晶显示部分,他们分别从控制模块中得到结果,通过液晶屏显示出来,通过电机驱动小车做相应的动作。
1.2.2各部分设计方案
1小车主体的设计方案
1)方案一:
使用四驱玩具车。
此方案优点在于节省了时间,将更多的精力放在了小车控制方面的制作,此外玩具车的结构合理,组装较为简单容易,其缺点在于质量各有差别,价格偏高,电路布局受小车结构的限制。
2)方案二:
自己设计小车的主体结构。
使用自己设计主体结构的小车,可以很好地解决主体结构带给电路带来的局限,可以安放各个器件,使其能够协调工作,此外通过自制小车可以提高我们的动手能力,更加全面了解各部分电路的布局。
综合以上考虑我们选择方案二。
2电源的设计方案
1)供电:
外接电源和电池组
采用电池组:
采用电池组需要五节电池串联,其优点在于方便易行,但是在调试的过程中将会多次使用电池,这样会很费电量。
外接电源12v:
采用外加电源的方法可以避免电量不足的缺点,而且环保。
综合二者考虑我们采用外加12V电源的方案。
2)稳压:
采用7805+7805,2576+2576,2576+7805。
2576为单片式开关稳压芯片,具有电流大,带负载能力强,转化效率高,稳压效果好等优点。
7805为线性稳压芯片,其稳压效果好,外围电路简单,应用电路成熟可靠等优点,但是其带负载能力差,电流输出差,效率低,根据其自身性能特点,有以下三个方案。
1)方案一:
7805+7805
其优点是电路设计简单,成本低廉,缺点是带负载能力差,效率低,在动力电机受阻的情况下以被烧毁。
2)方案二:
2576+2576
其优点是转化效率高,输出电流能力强,缺点是外围电路复杂,成本较高,PWM开关稳压电容对单片机等逻辑电路造成影响。
3)方案三:
2576+7805
用7805为单片机以及其他逻辑电路提供稳定电压,用2576为电机提供动力驱动。
综合以上方案,我们决定采用方案三,各取两个芯片的优点,将它们合理的搭配起来。
3电机驱动模块
1)方案一:
自己构建
根据需要分析,可以用功率三极管来搭建。
采用自己搭建的方法主要是有助于提高我们的动手能力和对知识灵活使用能力。
但是要是想得到两个独立驱动,必须选择两个参数尽量一致管子才可以,而市面上购买的三极管只能将参数满足在一定范围内,会出现一定的误差,因此给调试带来了一定的困难,而且电路抗外界干扰能力差,复杂化了电路设计。
2)方案二:
购买专用的电机驱动芯片
可以购买到专门的双电机驱动芯片L298,可以满足小车的电机控制要求,而且外围电路比较简单,稳定性较好,驱动能力较强,能够很好地保证电机的同步性。
为了通过此次实践充分得锻炼自己的动手能力,我们决定使用L298芯片,并自己搭建驱动模块。
4循迹所用传感器的设计
1)方案一:
采用CCD传感器,可以获取大量的图像信息,可以全面完整的掌握路径信息,可以进行远程距离的预测和识别图像的复杂路面,抗干扰能力强,但对于本项目来说它也有缺点,它需要大量的图像处理工作,需要进行大量的数据存储和计算,因为是以实现小车视觉为目的,此方案实现起来工作量较大,过于繁琐。
2)方案二:
采用光电传感器,其优点在于结构简明,实现起来容易,成本低,免于大量的数据处理工作,反应灵敏,响应时间低。
但其缺点在于获取信息的完整性差,只能对简单的路面状况进行判定,抗干扰能力差,背景光源、各个传感器间的差异以及据测试路面高度的差异都会对测试结果造成一定的干扰。
由于本次路面只有黑白两种颜色,路面简单,小车只需要区分黑白两色即可采集到准确的路面信息。
经过综合考虑,我们决定使用红外光电传感器。
5角度测量和圆弧形轨道半径测量的设计
1)轨道半径的测量:
红外对管
用光电反射管接收发射信号计算,在车轮边缘用黑白相间的弧线将车轮内边缘圆周平均分为6等分进行计算,测量时码盘会随车轮转动,每转一周传感器采集六次信号,送给单片机进行计算,分为六等分的好处在于增加测量精确度。
2)测量转角:
电子指南针
电子指南针代替旧的磁指南针,精度高,稳定性好,对角度的测量更为精准。
使用电子指南针应注意减少外界磁场的干扰。
6显示模块的设计
1)LED数码管显示
数码管显示具有亮度高,色彩选择多的优点,但是数码管占I/O资源多,控制复杂,功耗较大,显示信息量少且单一。
2)1602液晶显示
液晶显示驱动简单,易于控制,功耗小,且信息量大,可以直观地观测到小车经过圆弧轨道时的圆弧弧度及半径。
综合考虑,我们决定用1602液晶显示作为本次设计的显示模板。
7超声波测距
在本次比赛要求之外我们为小车装上了测距功能,超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。
利用它可以测量据前方障碍的距离。
2循迹小车的硬件设计
2.1机械设计
小车的机械设计不容忽视,它有以下几点需要注意的:
符合机械力学性能,能够完成各机械动作;易于组装和拆卸,便于对小车的检查和维修;总体布局要有一定的电气隔离性,尽可能减少器件间的相互干扰。
2.1.1各模块的分布
各模块分布应该以尽量减少相互干扰为原则,并且要排布整齐,易于检查。
尽量防止电机磁对电信号的干扰。
2.1.2传感器的位置分布
循迹所用的七个红外光电传感器分布在小车的前面,测速的两个非一体红外传感器分布在轮子的两边,电子指南针放在显示屏的板上。
2.2电路设计
2.2.1电机驱动模块
驱动部分采用的是L298芯片,该芯片是专门的双全桥步进电机驱动芯片,也可以作为直流电机的驱动。
该芯片的驱动能力较强,完全可以驱动本次设计所使用的电机。
芯片上的ENA与ENB为高电平时有效,只有当ENA与ENB为高电平时,电机才旋转,否则电机不转。
ENA为IN1和IN2的使能端,ENB为IN3和IN4的使能端。
当ENA=1,IN1=1,IN2=0是电机1正转,ENA=1,IN1=0,IN2=1电机1反转。
同理ENB=1,IN3=1,IN4=0是电机2正转,ENB=1,IN3=0,IN4=1电机2反转。
OUT1、OUT2接电机1,OUT3、OUT4接电机2。
L298的应用电路如图所示:
2.2.2显示模块
液晶由单片机控制,实时显示小车行驶时圆弧型轨迹的半径、弧度,由于其内部集成了显示处理,所以外围电路简单。
电路图如下:
2.2.3电源模块
电源模块使用LM2576和LM7805两片稳压芯片分别作为动力供电和逻辑供电。
LM2576是一个高性能的开关稳压芯片,具有52KHZ的内部固有开关频率,TTL关断功能,低功耗待机模块等特点。
本次电机为6V电机,在电源模块的制作中由于经过开关芯片稳压后的电压带有较高的杂波,所以要对输出信号进行滤波,在输出端加大电容。
LM7805是一片三段线性稳压芯片,具有较好的现行稳压效果,外围电路简单。
为了得到理想的电压,在输出端用大的滤波电容和小电容并联的方式进行整波。
电路图如下:
2.2.4传感器模块
小车共放置九个红外光电传感器,其中七个用来来循迹,将采集到的信号通过P1口传给单片机,循迹传感器将采集到的信号经LM324放大整形后传送给单片机,最终达到控制小车循迹的目的。
另用两个非一体的红外对管实现测弧长功能。
使用电子指南针进行角度测量,将写好的程序送入单片机,将从电子指南针采集到的信号进行处理,最终实现角度的测量。
因为每个光电传感器的信号处理过程相同,其电路图如下:
2.2.5核心控制模块
单片机采用了STC89C52,该芯片的应用电路与其他的51单片机完全相同。
介于小车各部分功能均为模块实现,所以,将单片机最小系统布置好后,其余各I/O口用指针引出。
STC单片机支持串口下载功能,所以省去了调时插拔芯片的麻烦,也保证了芯片的完好。
单片机引脚分布图及最小系统图如下:
2.2.6超声波测距模块
该模块放小车对前面,超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:
s=340t/2。
3智能小车的软件设计
软件编程是循迹小车的灵魂,它给予了小车精确的循迹和测量合理的编程算法。
为了便于调试结构明朗,小车的软件编程分为主函数、检测循迹函数、角度测量函数和控制函数。
其中主函数合理的分配条用各个模块函数,主要负责各模块的总体协调。
循迹检测函数和角度测量函数负责稳定地判断各种信息,将信息之返回,以便主函数或别的函数调用处理。
控制函数主要负责小车的状态控制,根据传感器返回的信息准确的判定小车的位置,并作相应的响应。
函数见附录。
4总结与心得
4.1开发与调试过程
此次我们本着做出最轻最快的小车的宗旨,认真地实施每一步计划。
在整个开发过程中我们以总—分—总的思想进行,分为以下几个部分。
4.1.1总体方案的论证与确立
在开发初期我们的主要任务就是对本次比赛的题目进行确立和研究。
主要分为以下几个步骤:
1)根据小组成员的兴趣和想法,确定设计循迹小车题目。
2)对设计要求进行认真的阅读,明确设计方向和各部分的要求。
3)对设计方案进行确立,此过程我们是通过到图书馆查阅相关图书和利用网络资源等渠道,做好前期资料的准备工作。
4)确立总体方案,将整体分为各个模块,列出全程计划。
5)购买所需要的元器件,为下一部分做好准备。
4.1.2分立模块的制作调试及遇到的问题
在此阶段中我们主要的任务就是完成搭建各分立模块,并将其调试到预期的参数指标。
在驱动模块的制作中,我们首先决定用四轮驱动,使用一个驱动芯片驱动四个电机,但在开始调试的时候小车运转约一分钟后停止工作,经过检查发现是驱动芯片烧坏,所以我们改用两个驱动芯片,每个驱动芯片需要驱动两个电机。
开始时将一个驱动芯片焊在另外一个板上,在按下开关的一瞬间小车轮子转动,待稳定后轮子不转,循迹功能出现异常,驱动芯片过热,猜想是驱动芯片的问题,所以将驱动芯片换个新的,并将两个驱动芯片焊接在同一个板上,小车正常工作。
在焊接循迹模块时,其中一个自己焊接的循迹模块出现差错,查找原因后发现是一个红外对管不工作,又将该模块重新焊接。
此外在单片机开始下程序时工作正常,但经过一段时间单片机模块坏了,循迹出现了混乱,后来进过检查,单片机的两个I/O扣坏了,发现程序下载异常,现在是通过将单片机拆下放到单片机实验板上下载程序,再按上来实现程序的下载。
4.1.3总体装配调试
此部分的任务是务必使车完全达到大赛的性能指标,使各个模块间协调可靠,互不影响,按预期完成任务。
在调试的过程中我们才发现,所有的情况并不是想象中的那么符合常理,每一次的循迹和位置信息的获取都在反复的调试中完成。
我们要对之前的方案不断地改进并查找问题,使之慢慢变得更加符合要求,对函数进行优化。
4.2心得与展望
在本次设计中,我们初步完成了小车的制作,基本上达到了比赛的要求,但是由于时间有限,知识积累程度不够,还有很多地方需要学习,使得开发进展的没有想象中的那么顺利。
小车的很多性能还有待于提高和改进,设计方案还可以进一步扩展,一些地方可以进一步大胆创新,不仅仅局限于比赛的基本要求,这些都是需要我们今后进一步完善的地方。
参加本次比赛的目的并不在于要拿到名次,而是为自己找到了一个动手实践的好机会。
作为大学生的我们不得不承认在四年时光即将过半的时候还没有真正的做过与本专业相关的实物,缺乏实践的我们更应该给自己找多一些的机会实践,将理论付诸于实践,这样即可以锻炼动手能力,又可以更好地理解理论知识。
在制作初期我们遇到了很多困难,比如开始元器件不会挑选,才发现买元件是需要各种指标。
再如制作时的各种无法预料的状况需要我们耐心地查找问题,还有临近比赛时电子指南针不工作等问题。
这些困难会让我们很苦恼,但是在解决的过程中我们收获的不仅仅是将问题解决,更多的是解决问题的方法和解决问题的心态,这些都将是我们未来实践的经验。
通过本次比赛的设计,我们获得了不小的收获,不光是知识和经验上的收获,更多的是态度上的收获。
首先让我们自主学习了单片机以及驱动显示等相关知识。
再者在我们学会了一种生活态度,凡事不可能像想象中那么完美,我们会在前进的过程中不断地面对阻碍,然后不断地努力将它们解决。
在面对查找麻烦的问题时我们应有面对挫折的勇气和克服困难的韧性。
在实践中我们有好几次因为元器件短缺而不得不放慢节拍,而这些本应该在规划过程中避免的,所以我们认识到做事要有系统的规划和合理的预算,要积极培养自己的远见。
通过此次比赛让我们明白,一件事情的执行并不能总是一帆风顺,遇到难题时我们不需要抱怨和气馁,而是一种不怕阻碍,耐心解决的精神。
参考文献:
1
2《C51单片机高效入门》第二版
3
附录
一、所用所有零件清单
元器件
数量
元器件
数量
元器件
数量
STC89C52
1
L298
2
芯片底座14
若干
12M晶振
1
电感100µH
1
芯片底座16
若干
电容2200
1
LM324
3
TCRT5000
7
LM2576
1
LED1602
1
非一体红外
2
7805
1
减速电机
4
按键开关
2
电阻5.1K
若干
车轮
4
电阻3K
若干
电阻1K
若干
万能板
2
电阻150K
若干
电位器10K
10
电解电容100µF
6个
ln400716
16个
电位器50K
1
稳压管ln5822
1个
杜邦线
若干
二、循迹程序
//***************************************
//HMC5883IIC测试程序
//使用单片机STC89C51
//晶振:
11.0592M
//显示:
LCD1602
//编译环境KeiluVision2
//参考宏晶网站24c04通信程序
//时间:
2011年3月1日
//****************************************
#include
#include//Keillibrary
#include//Keillibrary
#include
#defineucharunsignedchar
#defineuintunsignedint
//使用的端口,请按照以下接线
#defineDataPortP1//LCD1602数据端口
sbitSCL=P2^0;//IIC时钟引脚定义
sbitSDA=P2^1;//IIC数据引脚定义
sbitLCM_RS=P2^6;//LCD1602命令端口
sbitLCM_RW=P2^7;//LCD1602命令端口
sbitLCM_EN=P0^7;//LCD1602命令端口
#defineS_CIRCLE100
#definePWM_CHUZHI100
#defineMM22
#definezuoyou100
sbitSEN1=P3^7;
sbitSEN2=P3^6;
sbitSEN3=P3^5;
sbitSEN4=P3^4;
sbitSEN5=P3^0;
sbitSEN6=P2^3;
sbitSEN7=P3^1;
sbitinl_1=P0^0;
sbitinl_2=P0^1;
sbitenl=P0^2;
sbitinl_3=P0^0;
sbitinl_4=P0^1;
sbitinr_1=P2^4;
sbitinr_2=P2^5;
sbitenr=P2^2;
sbitinr_3=P2^4;
sbitinr_4=P2^5;
sbitzuo_cesu=P3^2;
sbityou_cesu=P3^3;
ucharx,y;
ucharSpeed_L_Now;
ucharSpeed_R_Now;
ucharSpeed_Deser=100;
ucharcount;
uintsec=0,min=0,s_left=0,s_right=0,r=0,p=0,j=0;
ucharcodetable[]="R:
0000mm";
doubleangle3;
doubleangle2;
doubleangle4;
doublett,ttt;
#defineSlaveAddress0x3C//定义器件在IIC总线中的从地址
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
BYTEBUF[8];//接收数据缓存区
ucharge,shi,bai,qian,wan;//显示变量
intdis_data;//变量
voiddelay(unsignedintk);
voidInitLcd();
voidInit_HMC5883(void);//初始化5883
voidWriteDataLCM(uchardataW);
voidWriteCommandLCM(ucharCMD,ucharAttribc);
voidDisplayOneChar(ucharX,ucharY,ucharDData);
voidconversion(uinttemp_data);
voidSingle_Write_HMC5883(ucharREG_Address,ucharREG_data);//单个写入数据
ucharSingle_Read_HMC5883(ucharREG_Address);//单个读取内部寄存器数据
voidMultiple_Read_HMC5883();//连续的读取内部寄存器数据
//以下是模拟iic使用函数-------------
voidDelay5us();
voidDelay5ms();
voidHMC5883_Start();
voidHMC5883_Stop();
voidHMC5883_SendACK(bitack);
bitHMC5883_RecvACK();
voidHMC5883_SendByte(BYTEdat);
BYTEHMC5883_RecvByte();
voidHMC5883_ReadPage();
voidHMC5883_WritePage();
//-----------------------------------
//*********************************************************
voiddelay1(uintz)
{for(x=200;x>0;x--)
for(y=z;y>0;y--);
}
voidinit()
{
TMOD=0x11;
TH1=0;
TL1=0;
TH0=0;
TL0=0;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
IT0=1;
IT1=1;
EX0=0;
EX1=0;
}
voidconversion(uinttemp_data)
{
wan=temp_data/10000+0x30;
temp_data=temp_data%10000;//取余运算
qian=temp_data/1000+0x30;
temp_data=temp_data%1000;//取余运算
bai=temp_data/100+0x30;
temp_data=temp_data%100;//取余运算
shi=temp_data/10+0x30;
temp_data=temp_data%10;//取余运算
ge=temp_data+0x30;
}
/*******************************/
voiddelay(unsignedintk)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<121;j++)
{;}}
}
/*******************************/
voidWaitForEnable(void)
{
DataPort=0xff;
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);
LCM_EN=0;
}
/*******************************/
voidWriteCommandLCM(ucharCMD,ucharAttribc)
{
if(Attribc)WaitForEnable();
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/*******************************/
voidWriteDataLCM(uchardataW)
{
WaitForEnable();
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/***********************************/
voidInitLcd()
{ucharnum;
WriteCommandLCM(0x38,1);
WriteCommandLCM