迷宫导航智能车设计报告.docx
《迷宫导航智能车设计报告.docx》由会员分享,可在线阅读,更多相关《迷宫导航智能车设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
![迷宫导航智能车设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/3/20f56bd6-21c7-47ac-a693-5e059d0a7a6a/20f56bd6-21c7-47ac-a693-5e059d0a7a6a1.gif)
迷宫导航智能车设计报告
迷宫导航智能车设计报告
2013-2014学年第2学期
学院:
自动化工程学院
专业:
自动卓越111
学生姓名:
学号:
29
课程设计名称:
计算机控制系统设计
课程设计题目:
迷宫导航智能车设计
起迄日期:
4月21日~5月4日
课程设计地点:
主教418
指导教师:
系主任:
摘要
介绍了一种智能循迹小车的制作方法,给出了控制系统的硬件设计和软件设计。
控制系统的硬件电路部分主要包括控制器、传感器、电机驱动芯片。
控制器和传感器分别采用8位的51系列单片机STC90C51和光电对管。
循迹小车采用的直流电机。
关键词:
STC89C51智能循迹小车黑白对管黑白循迹
第一章题目背景与意义
计算机控制系统是自动控制理论和微型计算机原理和接口等技术在工业生产过程中实现自动控制的专门技术,其以自动控制理论为基础,以电子技术、传感器原理、计算机原理及接口等课程内容为辅助,通过计算机控制系统设计的实践环节培养学生理论应用能力、总结归纳能力以及自我学习能力,从而进一步提高学生工程实践能力和创新意识的培养。
自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。
人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。
随着科学技术的发展,机器人的感觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。
视觉的典型应用领域为自主式智能导航系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。
但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是一种实用有效的方法。
机器人要实现自动导引功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。
避障控制系统是基于自动导引小车(AVG—auto-guidevehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。
使用传感器感知路线和障碍并作出判断和相应的执行动作。
随着生产自动化的发展需要,机器人已经越来越广泛地应用到生产自动化上,随着科学技术的发展,机器人的传感器种类也越来越多,其中红外传感器已经成为自动行走和驾驶的重要部件。
红外的典型应用领域为自主式智能导航系统,机器人要实现自动避障功能就必须要感知障碍物,感知障碍物相当给机器人一个视觉功能。
智能避障是基于红外传感系统,采用红外传感器实现前方障碍物检测,并判断障碍物远近。
由于时间和水平有限,我们暂选最基本的避障功能作为此次设计的目标。
本设计通过小车这个载体再结合由STC90C51RC为核心的控制板可以达到其基本功能,再辅加由漫反射式光电开关组成的避障电路、电源电路、差分驱动电路就可以完善整个设计。
第二章设计题目介绍
2.1设计内容及要求
1)设计并开发能自动循迹和调速的电动小车控制系统,要求以迷宫白色墙壁对小车进行导航,能实现电动小车的速度闭环控制;以实现小车在迷宫内正常行驶.
2)利用红外对管等传感器设计导航、测速电路,设计小车的电源管理电路,完成单片机和各模块的接口电路设计;利用脉宽调制原理实现直流电机的速度控制,完成各模块的控制程序设计。
3)能够在指定迷宫内行驶;
4)在尽量短的时间内到达终点;
5)到达终点后在指定区域内自动停车;
6)智能车行驶全程不得人为干预。
2.2智能车现状介绍
现有的避障小车的传感器大致有微动开关、超声波传感器等,而该小车采用了红外传感器,性能和超声波传感器相当,但成本远低于上述传感。
该避障小车采用单片机为控制核心,可以根据实际情况修改程序,方便灵活,并可实现复杂功能。
电机驱动电路采用普通的直流电机,价格适宜,电路相对简单,经济实用。
整体上来说,采用简单的电路实现了高精度、快速壁障的功能。
第三章系统总体设计
3.1方案设计
我设计的循迹小车处理器使用51单片机,循迹模块使用lm324比较器芯片,4个红外对管,其中三个用于判断障碍物,另外一个用于检测停止线,电机驱动模块使用了L293D驱动芯片。
下图为小车组装图:
2
3
1
4
图3-1小车安装图
3.2原理框图
图3-2原理框图
3.3控制器方案论证与比较
方案采用老师提供的STC90C51RC单片机作为主控制器,STC90C51RC是采用8051核的ISP(InSystemProgramming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8KBytes的可反复擦写1000次的Flash只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。
STC90C51RC系列单片机是单时钟/机器周期(1T)的兼容8051内核单片机,是高速/低功耗的新一代8051单片机,全新的流水线/精简指令集结构,内部集成MAX810专用复位电路。
3.4循迹模块
该智能小车在有白色纸板障碍物的白纸“路面”上行驶,由于白纸对光线的反射系数不同,可根据接收的反射光的强弱来判断道路上的障碍。
在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向四个方向面发射红外光,当红外光遇到白色地面漫反射,反射光被装在小车上的接收管接收;如果遇不到障碍则红外光反射效果几乎为零,则小车上的接收管接收不到信号。
使用电压比较器LM339N,能更好的精确判断。
传感器选择:
使用老师提供的黑白对管。
3.5电机驱动模块
电动车电机的驱动系统的性能在很大程度上决定了电动车的整体运行性能,电动机使用主办方提供的电机。
驱动芯片使用L293D。
L293D是一款单片集成的高电压、高电流、4通道电机驱动,设计用于连接标准DTL或TTL逻辑电平,驱动电感负载(诸如继电线圈、DC和步进电机)和开关功率晶体管等等。
为了简化为双桥应用,L293D每个通道对都配备了一个使能输入端。
L293D逻辑电路具有独立的供电输入,可在更低的电压下工作。
此外,L293D还内置了箝位二极管。
L293D适用于频率达5kHz的开关应用。
第四章系统硬件设计
4.1单片机最小系统设计
最小系统主要有单片机及其必要的外围电路。
其中必要的外围电路包括由11.0592MHZ的晶振和两个30PF的电容与内部的振荡器构成的时钟电路。
换句话说,本最小系统采用的是内部时钟电路提供基本时钟;另外还有由电阻、电容和开关构成的复位电路。
图中开关盒电容并联使系统拥有上电和按键的双重复位功能,电阻R14起到下拉电阻的作用,对电路起到保护作用。
系统资源分配:
P2.3~P2.0用于小车寻迹时4个光电传感器的输入,P0.0~P0.5控制电机的使能和方向。
最小系统框图如下图所示。
图4-1时钟电路
图4-2复位电路
4.2寻迹探测电路设计
自制红外探头工作原理:
当小车在白色地面行驶时,装在车上的红外发射管发射红外信号,经白色障碍物反射后,被接收管接收,一旦接收管接收到信号,那么途中光敏三极管将导通,比较器输出为低电平;当小车行驶没有遇到障碍物时,红外线信号则不能被反射回来,光敏三极管截止,比较其输出高电平,从而实现了通过红外线检测信号的功能。
将检测到的信号送到单片机的I/O口,当I/O口检测到的信号为高电平时,表明小车没有遇到障碍物;同理,当I/O口检测到的信号为低电平时,表明小车遇到障碍物。
小车在正常前进时,三对红外管均不会接触到黑线,当小车遇到正面障碍时时,2号位置的红外对管进行障碍判断,如果已遇到障碍物,则命令小车左转;如果小车左面遇到障碍物,则1号管输出低电平信号,单片机接收信号,控制小车右转;若右面遇到障碍物,则2号管输出低电平,单片机接收信号,控制小车左转;如果前面和左面同时遇到障碍物,小车右转;若前面和左面同时遇到障碍物,小车左转。
图4-3黑白对管传感器图
图4-4LM339N传感器信号放大电路
4.3电机驱动电路设计
在本设计系统中,。
L293D提供双向驱动电流高达600毫安,电压是从4.5V至36V的。
两个设备是专为驱动等感性负载继电器,电磁阀,直流双极步进和马达,也可以给其他高电流高电压提供电源负载。
兼容所有的TTL输入。
每个输出都是推拉式驱动电路,与达林顿三极管和伪达林源。
启用1,2EN驱动器和3,4EN驱动器。
当使能输入为高电平时,相关联的驱动器被启用和他们的输出处于活动状态,并在其输入端的同相。
当使能输入为低,这些驱动器被禁用其输出关闭,在高阻抗状态用适当的数据输入端,每对驱动程序的形式一个完整的H桥可逆驱动器适用于电磁阀或电机应用。
图4-5L293D引脚图
真值表
输入
输出
Y
A
EN
H
H
H
L
H
L
X
L
Z
图4-6电机驱动电路图
4.4测速模块
图4-7测速元件原理图
由于光电传感器对黑色和白色反射系数不同,使用主办方提供的码盘。
将码盘固定在车轮上,当码盘随车轮转动时,光电传感器经过黑色时,发光二极管发出的光被黑色吸收,传感器内部三极管接不到反射信号,经过白色时,发光二极管发出的光被三极管接收到输出端有信号输出,当码盘随车轮转动时光电传感器轮流经过黑色和白色,便产生一个个脉冲。
产生的脉冲经过外部中断再经计数器计数,通过计数值可计算出车轮行走的距离,通过定时计数器来计时间,算出实时速度,即完成了测速。
第五章软件总体设计
5.1电机驱动算法
电机驱动算法在本系统中有着重要的作用,小车在寻迹过程中会根据光电传感器检测到路面状况的输入信号即时调整移动策略,以实现小车的移动。
在移动过程中,小车会遇到几下集中情况:
前进,左转,右转和停止。
小车为双轮驱动,有两个电机控制,每个电机分别可以控制速度和转向。
下面就速度和转向问题分别讨论。
小车速度控制:
电机的转速由使能端输入的平均电压调节,而平均电压可由定时器0产生的PWM信号的占空比来调节。
定时器0工作在具有自动重装初值的工作模式2,初值为0,即每256us定时器0产生一次中断。
在定时器0的中断服务子程序里面有一个对中断次数进行计数的变量,每次中断时计数变量的值会做加1处理,当计数变量的值大于等于50时清零。
一个周期的PWM信号就在计数变量从0变到50的过程中产生,也即PWM信号的周期是50*256us,相应的PWM信号的频率约为78Hz。
为了控制电机1和电机2PWM信号的占空比,设置了两个变量a,和b,这两个变量的值可以作为控制电机移动函数的参数控制电机的速度。
规定当a的值小于技术变量时电机的使能端输出1,反之输出0,这样就可以改变PWM信号占空比,控制电机的转速了。
小车转向控制:
小车移动中前进比较容易控制,只要让两个电机同时正转就可以了。
控制小车转向时有两种策略,第一种是一个电机正转而另一个不转,第二种是一个电机正转而另一个反转。
在测试中我们发现采用第一种方法当小车运动时,运动一侧的轮子会带动不运动一侧的轮子迫使小车继续运动。
所以我们采用了第二种控制小车转向的方法。
经过设计比对后,编出小车行驶时的子程序:
前进子程序:
voidqianjin(void){P1=0x55;}
左转子程序:
voidzz(void){P1=0x5a;}
右转子程序:
voidyz(void){P1=0xa5;}
停止子程序:
voidtz(void){P1=0x00;}
因此在主函数判断后直接调用子程序就可以控制小车行驶。
5.2寻迹算法
本系统中在小车的前方安装了4个黑白对管,具体安装位置如图3-1所示。
光电传感器当检测到黑线时会返回数字信号1,当检测到白线或颜色较浅时会返回数字信号0,系统中根据4个光电传感器返回的数字信息就可以知道小车当前运行的位置,信号经过单片机处理后会控制两个电机进行速度和方向的调整从而控制小车在既定轨道上前行。
4个光电传感器的输出端分别接在单片机的P2.3~P2.0。
,然后在根据具体状态决定下一步小车的移动策略。
移动策略见第四章第2节。
循迹左管5定义的端口为P2.0,右管为P2.1。
定义一个变量pan代表P2口,令zhangai=0x03&pan,则会有以下逻辑:
zhangai
0x00
0x01
0x02
0x03
方向
前进
右转
左转
停止
5.3测速算法
在小车的右侧后轮旁安装有一个光电传感器,车轮内侧有一个孔洞的光电码盘。
光电传感器的输出接到了外部中断P3.5端,车轮转动带动光电码盘转动,使光电传感器状态产生变化,使P3.5端电平变化,产生中断。
黑白之间的转换会使光电传感器状态发生0/1变化,测速时记录下在一秒内车轮转过的圈数,因为车轮的周长已经事先求得,由此就可以求得小车的速度。
第六章感想
经过9天的努力,我的终于完成了这个作品,虽然还存在不足,但是我也非常高兴,因为我们通过自己的动手努力做出了品。
对系统最初的知之甚少的茫然状态到现在基本把握系统各模块功能和运转情况的状态,学到了很多知识,这与老师和学长指导师分不开的。
此次通过做小车让我知道了,做任何事之前都要做好充分的准备,对事件的整体有个充分的认识,做事要戒骄戒躁,不能急于求成,要细心的做好每个细节,当你把整件事的各个模块做好了之后,那你就已经成功了。
最后感谢老师和学长的帮助,让我更加有信心,还要感谢此次课程设计的机会,为我们提供了一个实验的平台,给我们提供一个自己动手的机会,通过此次智能小车的设计,我们从中学到了很多东西,尤其对我们这些对硬件知识了解很少的人来说更是获益良多。
通过这此动手实践为我的以后做电子设计积累了经验,相信我们会在电子设计之路上走的越来越远。
附件:
#include
#defineucharunsignedchar
#defineuintunsignedint
#definepanP2
sbitzuo1=P1^1;
sbitzuo2=P1^6;
sbityou1=P1^2;
sbityou2=P1^3;
sbiten=P1^7;
sbitp3_5=P2^0;
sbitp3_6=P2^1;
sbitp3_7=P2^2;
sbittz=P2^4;
uchari,j,zhangai;
uinta,b;
///////////////////子函数声明//////////////
voidqianjin();//前进
voidzz();//左转
voidyz();//右转
voidht();
voiddelay();//延时
voidzhuan();
voidtingzhi();
//ucharzuai();
voidmain(void)
{
P2=1;
while
(1)
{
zhangai=0x07&pan;
switch(zhangai)
{
case0x00:
ht();
break;
case0x01:
zz();
break;
case0x02:
qianjin();
break;
case0x03:
zz();
break;
case0x04:
yz();
break;
case0x05:
zz();
break;
case0x06:
yz();
break;
case0x07:
qianjin();
break;
default:
break;
}
if(tz==1)
{
tingzhi();
}
en=1;
delay();
tingzhi();
delay();
}
}
voidtingzhi(void)
{
zuo1=0;
zuo2=0;
you1=0;
you2=0;
}
voidqianjin(void)
{
zuo1=0;
zuo2=1;
you1=1;
you2=0;
}
voidzz(void)
{
zuo1=0;
zuo2=0;
you1=1;
you2=0;
}
voidyz(void)
{
zuo1=0;
zuo2=1;
you1=0;
you2=0;
}
voidht(void)
{
zuo1=1;
zuo2=0;
you1=0;
you2=1;
}
voidzhuan(void)
{
zuo1=0;
zuo2=1;
you1=0;
you2=1;
}
/*ucharzuai(void)
{
zhangai=0xE0&pan;
returnzhangai;
}*/
voiddelay(void)
{
for(i=0;i<=30;i++)
{
for(j=0;j<=100;j++)
{}
}
}
voidTimer0Cofig(void)
{
TMOD=0x01;//定时器0选择工作方式1
TH0=0xFC;//设置初始值,定时1MS
TL0=0x17;
EA=1;//打开总中断
ET0=1;//打开定时器0中断
TR0=1;//启动定时器0
}
voidTimer0()interrupt1
{
TH0=0xFC;//设置初始值
TL0=0x17;
Time++;
Time1++;
if(Time1==10)
{
Time1=0;
}
}