科技创新3G04设计报告.docx
- 文档编号:25654728
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:27
- 大小:297.66KB
科技创新3G04设计报告.docx
《科技创新3G04设计报告.docx》由会员分享,可在线阅读,更多相关《科技创新3G04设计报告.docx(27页珍藏版)》请在冰豆网上搜索。
科技创新3G04设计报告
科技创新(3)设计报告
小车自动走迷宫
小组编号:
G04
小组成员:
侯阳阳(组长),周鸿斌,金源,祝文鑫
成员信息
班级
学号
分工情况
联系方式
侯阳阳
F0603009
5060309328
组长,负责编写一部分程序和最终调试工作
shuibei@
周鸿斌
F0603009
5060309330
负责小车程序的大部分与最终调试
jackxer@
金源
F0603009
5060309334
参与调试,负责了报告的主要撰写工作
jin_4444@
祝文鑫
F0603009
5060309345
参与调试,负责了报告网页版的主要制作
coolxin@
2008年7月5日
小车自动走迷宫
摘要:
我们本次实验本来采用周立功公司提供的MicroMouse102电脑老鼠,为美国LuminaryMicro公司生产的32位ARMCortexM3处理器LM3S102,后来由于芯片被锁只能求其次,采用芯片LM3S101,来控制和检测红外传感器;主CPU根据检测到的传感信号,控制电机驱动电路调整行走路径;小车在迷宫行进的过程中,会自动蔽障、选择路线,直到到达终点。
关键词:
电脑鼠,走迷宫,迷宫算法
1项目介绍
所谓电脑鼠是指由微控制器、前视距离探测器、车轮编码器和驱动机构等组成的一个综合的系统;其中微控制器加上程序就相当于脑袋,前视距离探测器相当于眼睛,驱动机构(车轮编码器)相当于腿。
本项目要实现的是用电脑鼠找出迷宫中通往终点的最短路径并以最快速度到达迷宫的终点。
由于芯片本身问题,容量有限,我们设计的“电脑鼠自动走迷宫”这一套系统主要是让小车自主的从迷宫的入口走到出口,根据红外线来判断可行进的路线,并根据多次地判断来确定走出迷宫的路线。
在这一过程中,小车通过前、左、右三个红外线模块实现对周围障碍物的实时测距来实现避障功能。
2功能概述
小车的主要功能可以分为电机调速及转向功能,走直线功能,红外传感器测障碍,并且根据所检测的所处情况来控制小车行进。
电脑鼠每走10个脉冲(测速传感器检测黑白码盘的脉冲输出)就做一次同步。
即先走完10个脉冲车轮的等待另一个轮也走完10个脉冲后再一起启动。
如果电老鼠运动轨迹不是一条直线,则有可能是测速传感器漏掉了脉冲,请调节传感器和车轮的安装位置。
Micromouse102共有三对调制反射式红外线传感器,如果在发射和接收正对的方向的一定距离范围内存在障碍物,则有相应的LED点亮,一共有五个LED。
在程序里各个指示灯的含义如下:
D7:
点亮表示左边存在挡板,熄灭表示左边没有检测到挡板;
D5:
点亮表示电老鼠太靠近左边挡板,熄灭表示左边不会碰到挡板;
D4:
点亮表示前方存在挡板,熄灭表示前方不存在挡板;
D2:
点亮表示电老鼠太靠近右边挡板,熄灭表示右边不会碰到挡板;
D1:
点亮表示右边存在挡板,熄灭表示右边没有检测到挡板。
如果要改变传感器的探测距离范围,可以调节可调电阻R11,R17,R21。
他们分别调节左,前,右的测试距离范围。
3具体方案设计
3.1系统总体方案设计
我们将系统分为电机模块、小车控制模块、红外线模块这三大模块。
其中小车控制模块包括小车以及轮胎上的红外对管模块。
MicroMouse102电脑老鼠系统方块图:
驱动机构+车轮编码器
3.2小车系统硬件
3.2.1小车车体
我们采用的电脑鼠是主要由一块上面嵌有芯片和控制电路以及电池盒的圆形电路板,左右两侧各有一只轮子,前方和轮子内侧共有5对红外发射接受器,分别用于障碍判断和行进距离计数。
3.2.2小车控制器模块
控制器模块采用的是采用美国LuminaryMicro公司生产的32位ARMCortexM3处理器LM3S101。
该芯片可以满足我们的基本需要,但片上资源很少,不易扩展性。
3.2.3电源模块
电脑鼠的电源采用4节1.5V的5号电池供电,电源插座为2.54-2T型插座,如图所示。
3.2.4稳压模块
升压芯片采用Sipex公司的低静态电流、高效率的升压芯片SP6641A,升压电路如图所示。
输入电压3.3V,输出电压5V。
3.2.5电机驱动模块
电机采用直流减速电机,最高输出转速为800转/分钟,工作电压为DC3V。
电机驱动电路采用专用的单相直流电动机桥式驱动芯片,如图所示。
TA7291S是TOSHIBA公司生产的单相直流电动机桥式驱动芯片,工作电压4~20伏,最大输出电流400mA。
电动机驱动由输入端IN1和IN2控制,控制方法如表所示。
注:
电机的正转和反转与OUT1和OUT2与直流电机的接线有关,这里主要是相对的。
3.2.6车速检测模块
对于小车的车速检测及距离确定的一般原理是这样的:
小车的行驶过程是一个连续的时间过程,它的时间、路程、速度都是连续的。
我们用t表示时间,S表示路程,υ表示瞬时速度,那么它们的数学定义为:
,
,小车的平均速度为:
。
将上面的式子离散化,假设在一个很短的时间t内小车行驶了S的路程,则小车的即时速度
。
直接得到小车的速度的传感器很难实现,但是小车行驶的距离是容易测量的,因为车轮在行驶的过程中一直在旋转。
假设车轮的周长为L,在时间t内转动了N圈,则小车行驶的距离为:
S=N·L。
在实际过程中,我们需要把车轮的转动信息转换成电信号,就是使用速度传感器得到脉冲信号。
如果小车转动一周得到一个信号,则很显然的,距离测量的最大误差就是车轮的周长。
因此,我们有必要在车轮转动一周的过程中得到尽可能多的计数脉冲。
假设在车轮转动一周的过程中均匀地得到m个脉冲信号,那么距离测量的最大误差就变为L/m,如果在时间t内得到的计数脉冲为N个,那么小车行驶的距离为:
。
因此,在小车的速度和距离的检测过程中最需要知道的就是车轮旋转时产生的脉冲个数。
速度传感器有多种,我们采用的是反射式光电传感器。
原理如下:
由发射管TX发射的红外线经被检测物表面反射,反射光被接收管RX接收,接收管将接收的红外线信号转换成电信号。
被检测物表面的光滑程度和表面颜色影响反射光的强弱,反射面越不光滑,颜色越暗,则反射光越弱。
在这里,我们就是要利用它对颜色敏感的特点,当检测物表面为黑色时,反射光很弱,接收端检测到的光线可以忽略,使接收端呈现一种状态,例如开关管截止;当被检测物表面为白色时,反射光强烈,发射端发射的红外线被接收端全部接收,使接收端呈现另一种相反的状态,例如开关管开通。
这两种相反的状态表现在电路中,就是高低电平组成的脉冲信号。
在我们的系统中,每个轮子外表面涂上了黑白相间的条纹,每个反射式光电传感器由一个IO口来得到脉冲信号。
通过前面叙述的原理,我们就可以算出小车的速度和行走的距离。
当然这个速度和距离存在着误差,这个误差在我们的系统中是允许的。
检测电路中,红外发射与接收管正对着黑色边时,PULSE输出高电平;正对着白色边时,PULSE输出低电平;从黑色边到白色边,PULSE输出一个下降沿信号;从白色边到黑色边,PULSE则输出一个上升沿信号。
LM3S101单片机可以检测输出脉冲的下降沿信号判断车轮转到的角速度,当检测到12个下降沿信号时,轮子转动了一圈。
电路如图所示:
3.3反射式红外线传感器
3.3.1反射式红外线传感器设计方案
反射式红外传感器探测障碍物的原理参见图所示,发射管与接收管平行同向安装,接收管只能接收到发射回来的红外线信号。
发射管向外发射红外线后,如果在有效距离范围内存在反射表面,则反射回来的信号将会被检测到。
如果不存在反射表面或则反射表面距离太远,接收传感器将不能检测到信号。
方案一:
不调制的反射式红外发射-接收器。
由直流电直接驱动红外管发光,这样电路简单,成本较低。
但由于所有物体只要温度高于零摄氏度,都会向外发送红外线,且太阳光和日光灯中最强,所以该很容易受到外界干扰。
驱动电路如图所示。
方案二:
脉冲调制的反射式红外发射-接收传感器。
考虑到环境干扰主要是直流分量,如果采用带有交流分量的调制信号,在平均电流不变的情况下,瞬时电流可以很大,这样也大大提高了信噪比,可以有效避免外界环境变化对系统检测精度的影响。
电路原理图如图2.3所示,由可调电阻R1,红外线发光管D1和三极管Q1构成的电路为红外线发射电路。
R1可以调节红外线发光管的发光强度,Q1起驱动作用。
在接收电路中,U1为一体式红外线接收传感器IRM8601S,,它内部集成自动增益控制电路、带通滤波电路、解码电路及输出驱动电路。
但由于它是开漏输出,所以输出端需接一个上拉电阻,见图中的R3。
其中R2是限流电阻,C1滤出电源高频干扰。
3.3.2一体化红外接收头工作原理
一体式红外线接收传感器IRM8601S,它内部集成自动增益控制电路、带通滤波电路、解码电路及输出驱动电路。
当连续收到38KHz的红外线信号时,将产生脉宽10ms左右的低电平。
如果没有收到信号,便立即输出高电平。
如图所示,Send为发射控制端,高电平时发射38KHz的红外信号。
Out为接收输出端,低电平表示收到信号。
3.3.3检测障碍物的软件设计
根据接收头是否检测到经过反射的红外线信号,就可以判断是否存在障碍物。
由于接收头检测到信号时只产生一个负脉冲,所以只需要在检测时使能红外线发射,一次检测结束后使能无效,程序设计参考流程图如图所示。
3.4迷宫挡板检测
3.4.1原理分析
Micromouse中文名为“电脑鼠”,电脑鼠在迷宫中行进时是靠侦测路面情况前进的。
它的左右传感器不但要检测是否存在支路(没有挡板就是一条支路)还要避免和挡板碰触。
因此电脑鼠每一侧在正常情况就需要两组红外传感器,一组检测稍微远一点的距离,判断是否存在支路,一组检测稍微近一点的距离,判断是否即将碰触挡板。
由此看出,电脑鼠每侧都需要两组传感器,但是如果只用一组传感器来完成两个参数的检测是否可行呢?
我们知道,如果使用非调制的普通红外接收头,就可以根据接收到的信号的强弱来计算距离,可是非调制的抗干扰差,但是如果使用调制的一体化接收头,检测信号输出的是数字信号,这样通过检测传感器输出信号的强弱来计算距离的方法肯定行不通,但还有没有其他方法可以实现距离的测量呢?
答案是肯定的。
把上面测距的原理反过来,我们可以通过改变发射出的接收传感器能够识别的信号强度,当接收头刚好能接收到信号时,记录下此时发射的强度,这样也就可以大致测算出距离。
改变输出接收传感器所能识别信号的强度的方法有两种:
1.改变输出信号的能量,改变输出信号的能量又有两种方法:
改变输出信号的幅度,如图所示,改变Send端的输出电压或调节可调电阻R1的阻值就可以实现
改变输出信号的占空比,如图所示,改变输出的38KHz信号的占空比就可以实现
2.改变输出信号的频率,由于一体化接收头是38KHz的带通滤波器,所以发射信号的频率偏离38KHz越多,能检测到的有效信号就越少。
这样也就可以改变有效发射信号的强度。
如果通过改变输出信号的幅度,就需要还需要一个D/A转换器或手动调节R1,这样要不增加了成本要不不适用于自动控制。
如果通过改变占空比的方式就需要使用PWM功能,但PWM功能已经被驱动小车的电机占用,所以只能通过改变输出信号的频率来实现测距,这样只需要一个定时器就可以完成功能。
3.4.2调制信号产生
本设计中采用定时器1产生38KHz的调制信号,由PB5输出,该端口连接到上图中的Pulse端口。
在中断中翻转PB5输出信号,所以要产生频率为f的脉冲,定时器的频率要为2f。
在本设计中要产生38KHz的频率,定时器中断频率为76KHz。
3.4.3抗干扰处理
红外线在空气中传播和反射受外界的干扰,如果测量距离刚好处在能够检测到信号的临界状态,保持距离不变,传感器输出信号也可能不确定。
这样就需要在软件中进行抗干扰处理,程序将在附录中给出。
下图为抗干扰程序在Micromouse中运行后用逻辑分析仪抓到的波形图,Pulse为38KHz的输出信号,Send高电平有效,有效时发送红外线脉冲,OUT为一体化接收头输出端,该图所示为接收头探测到障碍物,软件在Send信号无效(下降沿)前完成检测OUT输出信号,从图中可以看出,此时正处于OUT有效信号的中间,所以软件里延时参数能保证正确检测到信号。
3.5软件设计及调试过程
3.5.1万事开头难
刚拿到芯片我们十分兴奋,可是刚刚开始尝试自己改动示例程序,就犯了死锁的错误。
上电后多功能引角直接被设为GPIO口,无法改为程序烧入时所需要的JTAG类型。
我们四处查找资料,看看有没有什么方法可以解锁,可是网上说Lm3s102一旦死锁,芯片只能报废。
后来只好向老师求助,张老师给我们找到了一块Lm3S101,大部分引角和102是相同的,内部程序存储空间也同样为8KB。
//防死锁程序
voidprotect_deadlock(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB口外设
GPIODirModeSet(GPIO_PORTB_BASE,KEY2,GPIO_DIR_MODE_IN);//设定按键为输入
if(GPIOPinRead(GPIO_PORTB_BASE,KEY2)==0)//是否恢复JTAG功能判断
{
while
(1);
}
}
3.5.2起步
我们开始了一步步的硬件调试。
先要让两个轮子转起来。
我们试图在已有的DEMO程序基础上进行加工改进。
第一次把程序烧到101芯片里时,小车可以很流畅地走直线,我们无比兴奋,以为只要改变车轮转动函数中控制转动方向的参数,就会反转,这样也就可以实现转弯。
但当我们改变参数进行测试时,车轮却没有听话地反转。
问题在哪里?
同样是转动,只是给了电机再次相反的电平,为什么正转可以反转就不可以呢?
DEMO里是通过PWM模式下给电机引角电平实现车轮转动与速度控制的,经过我们的仔细思考,终于发现原来是101和102硬件上引角不同造成的。
102有两个专门的引角可供这PWM模式下使用,这样两个轮子都可以受到控制;而101只有一个引脚可以供PWM模式使用,也就意味着只有一个轮子可以受PWM模式控制。
我们的101不能用PWM模式工作!
这无疑给我们的进度造成了很大的麻烦。
我们必须通过直接给电机引脚电平来控制轮子是正转还是反转,而要做到速度控制,就需要我们在程序里合适地选择延时长短。
3.5.3速度控制
第一阶段:
思路是在run()函数里控制所有的运动情况,每种case给电机相应的电平后进行空循环延时。
BASE为定义的基数,DUTYCYCLE为占空比,BASE*DUTYCYCLE即为轮子转动的时间,(1-DUTYCYCLE)即为轮子停的时间,函数示意如下:
voidrun(intsel){
intwork=BASE*DUTYCYCLE;//轮子转的时间
intnonwork=BASE*(1-DUTYCYCLE);//轮子不转的时间
switch(sel){
case0:
//向前直走,可以通过调节占空比DUTYCLCLE来调节转速
GPIOPinWrite(GPIO_PORTB_BASE,LWC1,0xff);//左侧正转
GPIOPinWrite(GPIO_PORTA_BASE,LWC2,0x00);
GPIOPinWrite(GPIO_PORTB_BASE,RWC1,0x00);//右侧正转
GPIOPinWrite(GPIO_PORTA_BASE,RWC2,0xff);
for(;work>=0;work--);
break;
case1:
//向后直走
...
case2:
//左转
...
case3:
//右转
...
default:
//刹车
...
}
GPIOPinWrite(GPIO_PORTB_BASE,LWC1,0x00);//左侧停
GPIOPinWrite(GPIO_PORTA_BASE,LWC2,0x00);
GPIOPinWrite(GPIO_PORTB_BASE,RWC1,0x00);//右侧停
GPIOPinWrite(GPIO_PORTA_BASE,RWC2,0x00);
for(;nonwork>=0;nonwork--);
}
在调试时发现这种思路的问题是:
把两个轮的控制函数写在一起的话,运用红外进行直线微调、进行拐弯都不方便单独控制。
应将两个轮的控制分开进行,可以根据需要进行两轮一前前后后配合。
第二阶段:
函数:
LeftRun(intsel,intpercent)
作用:
为了方便地进行两个轮的配合,将左右两轮分开写
0正转、1反转、2刹车、default停
说明:
其中0、1、2都是受占空比控制的,而default只是给LWC1LWC2置0,
没有进行for循环的等待,这是为了保持两轮速度一致时的实时控制
函数:
RightRun(intsel,intpercent)有相似的功能
这样比如在控制后转时就可以调用函数:
LeftRun(1,10);
RightRun(0,10);
第三阶段:
如何保证走直线
保证走直线的思路有两种,一种是不依靠两侧的迷宫,即使在空地上也可以保证走直线;另一种是依靠迷宫挡板,比如检测到太靠近右侧挡板太近时,调整右侧停一小段时间,左侧多走一小段赶上来。
为了保证速度,不能太过依靠两侧挡板进行调整。
设定好车轮运行的任务LeftPulse和RightPulse,每当车轮转动黑白条纹引起的中断函数里的计数器显示完成了一次任务时,车轮停下来。
当两个轮子都停下来才进行下一轮的转动任务。
这次任务哪个轮子多走了,就把多走的补偿到下一次的任务中。
这样两个轮子一边一起走,一边相互等待,保证了直线方向。
LeftPulse=2;//设定电机运行任务
RightPulse=2;
WheelStop_L=0;//清零电机停止标志位
WheelStop_R=0;
//用来调整两侧的速度,都走完设定任务后停,进行下一轮,进行误差补偿
while(!
(WheelStop_L&&WheelStop_R))
{
if(WheelStop_L!
=1)
LeftRun(0,adjust_speed);
if(WheelStop_R!
=1)
RightRun(0,adjust_speed);
}
//走完一轮,多走的开始调整
if(PulCount_L>=PulCount_R){
PulCount_L-=PulCount_R;
PulCount_R=0;
}
else{
PulCount_R-=PulCount_L;
PulCount_L=0;
}
//break;
}
3.5.4中断
中断是一个十分重要的概念。
我们用到中断的地方有:
车速控制和红外频率控制。
左右轮上贴有黑白码盘,红外打到码盘上,有光电二极管接收反射光。
车轮转动时会黑白间隔会产生一个上升或下降沿,由此可以触发中断。
红外检测发射频率,利用定时器的时间溢出中断可控制发射的频率。
//控制发射的频率
voidTimer1A_ISR(void)
{
//清除定时器1中断
TimerIntClear(TIMER1_BASE,TIMER_TIMA_TIMEOUT);
//翻转GPIOB5端口
GPIOPinWrite(GPIO_PORTB_BASE,PULSE,GPIOPinRead(GPIO_PORTB_BASE,PULSE)^PULSE);
}
//车速检测中断处理函数
voidGPIO_Port_A_ISR(void)
{
unsignedcharIntStatus;
IntStatus=GPIOPinIntStatus(GPIO_PORTA_BASE,true);//读PA口中断状态
if(IntStatus&PULSE_R)
{
PulCount_R++;//脉冲计数
if(PulCount_R>=RightPulse)//判断是否达到设定值
{
WheelStop_R=1;//置电机停止标志
}
GPIOPinIntClear(GPIO_PORTA_BASE,PULSE_R);//清中断
}
}
3.5.5路况检测
函数Check_Infrared()实现了路况的检测。
函数名称:
Check_Infrared
函数功能:
红外检测函数
入口参数:
option,选择检测的参数。
0,检测所有参数
1,检测左侧挡板
2,检测前方挡板
3,检测右侧挡板
4,检测左侧安全距离
5,检测右侧安全距离
出口参数:
全部检测时返回State,反应传感器状态。
State每四位代表一个参数状态。
从左至右20位(0xXXXXX)
分别表示五个参数:
左侧远距D7,左侧近距D5,前方D4,右侧近距D2,右侧远距D1。
如值为0x11100表示左侧有挡板,且太靠近左侧挡板,前方有挡板,右方没有挡板。
只检测1--5中的某个时,只返回0或1,表示没有或有
3.5.6路线选择
我们粗略的算法是左手扶墙。
在实现时要特别注意几个问题:
转弯时,由于检测的传感器在车头,不能检测到有弯就转,而是要再向前走一段直线;转弯后同样的道理,也要先走一段直线再进行判断。
voidadjust()
{
switch(check){
case0x00001:
case0x00101:
case0x00111:
case0x00100:
case0x00011:
//turnleftfirst
//goonrunning
gorunning();
Delay(40000);
//turn
PulCount_R=0;
PulCount_L=0;
while(PulCount_R<=9){
LeftRun(1,adjust_speed);
RightRun(0,adjust_speed);
}
Delay(40000);
//goonrunning
gorunning();
break;
case0x10100:
case0x11100:
//turnright
//goonrunning
gorunning();
Delay(40000);
//turn
PulCount_R=0;
PulCount_L=0;
while(PulCo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 科技 创新 G04 设计 报告