毕业设计+智能循迹避障小车设计之欧阳地创编Word格式文档下载.docx
《毕业设计+智能循迹避障小车设计之欧阳地创编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《毕业设计+智能循迹避障小车设计之欧阳地创编Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
3.3驱动电路12
3.4信号检测模块13
3.5主控电路14
第四章软件设计15
4.1主程序框图15
4.2电机驱动程序15
4.3循迹模块16
4.4避障模块20
结束语25
致谢26
附录一循迹加红外避障综合程序28
附录二实物图32
摘要
随着计算机、微电子、信息技术的快速进步,智能化技术的开发速度越来越快,智能度越来越高,应用范围也得到了极大的扩展。
智能作为现代的新发明,是以后的发展方向,它可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等用途。
智能电动小车就是其中的一个体现。
设计者可以通过软件编程实现它的行进、循迹、停止的精确控制以及检测数据的存储、显示,无需人工干预。
因此,智能电动小车具有再编程的特性,是机器人的一种。
本设计采用AT89S52单片机加电机驱动电路和红外遥控及循迹模块还有红外接收一体化传感器设计而成,采用模块化的设计方案,运用红外遥控器控制小车的前进、后退、左转、右转、启动和停止。
关键词:
智能小车;
STC89C52单片机;
L9110;
红外对管
Intelligenttrackingandobstacle-avoidcar
Abstract:
Basedinfrareddetectionofblacklinesandtheroadobstacles,anduseaSTC89C52MCUasthecontrollingcoreforthespeedanddirection,Aelectronicdrived,whichcanautomatictrackandavoidtheobstacle,wasdesignedandfabricated.Inwhich,thecarisdrivedbytheL298Ncircuit,itsspeediscontrolledbytheoutputPWMsignalfromtheSTC89C52.
Keywords:
SmartCar;
STC89C52MCU;
L298N;
InfraredEmittingDiode
第一章绪论
1.1智能小车的意义和作用
自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。
人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。
随着科学技术的发展,机器人的感觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。
视觉的典型应用领域为自主式智能导航系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。
但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是一种实用有效的方法。
机器人要实现自动导引功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。
避障控制系统是基于自动导引小车(AVG—auto-guidevehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。
使用传感器感知路线和障碍并作出判断和相应的执行动作。
该智能小车可以作为机器人的典型代表。
它可以分为三大组成部分:
传感器检测部分、执行部分、CPU。
机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。
可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。
基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。
智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。
单片机驱动直流电机一般有两种方案:
第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;
第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。
考虑到实际情况,本文选择第二种方案。
CPU使用STC89C52单片机,配合软件编程实现。
1.2智能小车的现状
现智能小车发展很快,从智能玩具到其它各行业都有实质成果。
其基本可实现循迹、避障、检测贴片、寻光入库、避崖等基本功能,这几节的电子设计大赛智能小车又在向声控系统发展。
比较出名的飞思卡尔智能小车更是走在前列。
我此次的设计主要实现循迹避障这两个功能。
第二章方案设计与论证
2.1主控系统
根据设计要求,我认为此设计属于多输入量的复杂程序控制问题。
据此,拟定了以下两种方案并进行了综合的比较论证,具体如下:
方案一:
选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。
CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。
但CPLD在控制上较单片机有较大的劣势。
同时,CPLD的处理速度非常快,而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。
若采用该方案,必将在控制上遇到许许多多不必要增加的难题。
为此,我们不采用该种方案,进而提出了第二种设想。
方案二:
采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。
根据这些分析,我选定了P89C51RA单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。
2.2电机驱动模块
采用分立元件组成的平衡式驱动电路,这种电路可以由单片机直接对其进行操作,但由于分立元件占用空间比较大,还要配上两个继电器,考虑到小车的空间问题,此方案不够理想。
采用L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片IC之中,使外围器件成本降低,整机可靠性提高。
该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;
两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过800mA的持续电流,峰值电流能力可达1.5A;
同时它具有较低的输出饱和压降;
内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。
L9110被广泛应用于玩具汽车电机驱动、脉冲电磁阀门驱动,步进电机驱动和开关功率管等电路上。
图2.2L9110
2.3循迹模块
采用简易光电传感器结合外围电路探测,但实际效果并不理想,对行驶过程中的稳定性要求很高,且误测几率较大、易受光线环境和路面介质影响。
在使用过程极易出现问题,而且容易因为该部件造成整个系统的不稳定。
故最终未采用该方案。
采用两只红外对管,分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好两只光电开关的位置就可以很好的实现循迹的功能。
图2.3红外对管
2.4避障模块
采用超声波避障,超声波受环境影响较大,电路复杂,而且地面对超声波的反射,会影响系统对障碍物的判断。
采用红外线避障,利用单片机产生38KHz信号对红外线发射管进行调制发射,发射出去的红外线遇到避障物的时候发射回来,红外线接收管对反射回来信号进行解调,输出TTL电平。
外界对红外信号的干扰比较小,而且易于实现,价格比较便宜,故采用方案二。
红外线接受电路原理图
2.5机械系统
本题目要求小车的机械系统稳定、灵活、简单,而三轮运动系统具备以上特点。
驱动部分:
由于玩具汽车的直流电机功率较小,而小车上装有电池、电机、电子器件等,使得电机负担较重。
为使小车能够顺利启动,且运动平稳,在直流电机和轮车轴之间加装了三级减速齿轮。
电池的安装:
将电池放置在车体的电机前后位置,降低车体重心,提高稳定性,同时可增加驱动轮的抓地力,减小轮子空转所引起的误差。
简单,而三轮运动系统具备以上特点。
2.6电源模块
采用有线电源通过USB接口供电,其优点是可稳定的提供5V电压,但占用资源比较大。
采用4支1.5V电池单电源供电,但6V的电压太小不能同时给单片机与与电机供电。
方案三:
采用8支1.5V电池双电源分别给单片机与电机供电可解决方案二的问题且能让小车完成其功能。
但是占用空间过大没有采取。
所以,我选择了方案一来实现供电。
第三章硬件设计
3.1AT89S52单片机的简介
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
下图为AT89S52引脚图。
图3-1AT89S52引脚图
(1)主要特性:
●与MCS-51兼容
●8K字节可编程闪烁存储器
●寿命:
1000写/擦循环
●数据保留时间:
10年
●全静态工作:
0Hz-24MHz
●三级程序存储器锁定
●256*8位内部RAM
●32可编程I/O线
●两个16位定时器/计数器
●5个中断源
●可编程串行通道
●低功耗的闲置和掉电模式
●片内振荡器和时钟电路
(2)管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89S52的一些特殊功能口,如下表3-1所示:
表3-1特殊功能引脚对照表
引脚号
特殊功能
P3.0
RXD串行通信输入
P3.1
TXD串行通信输出
P3.2
INT0外部中断0输入,低电平有效
P3.3
INT1外部中断1输入,低电平有效
P3.4
T0计数器0外部事件计数输入端
P3.5
T1计数器1外部事件计数输入端
P3.6
WR外部随机存储器的写选通,低电平有效
P3.7
RD外部随机存储器的读选通,低电平有效
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
AT89S52的复位信号输入引脚,高电位工作,当要对芯片复位时,只要将此引脚电位提升到高电位,并持续两个机器周期以上的时间,AT89S52便能完成系统复位的各项工作,使得内部特殊功能寄存器的内容均被设成已知状态。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
该引脚为低电平时,则读取外部的程序代码(存于外部EPROM中)来执行程序。
因此在8031中,EA引脚必须接低电位,因为其内部无程序存储器空间。
如果是使用AT89S52或其它内部有程序空间的单片机时,此引脚接成高电平使程序运行时访问内部程序存储器,当程序指针PC值超过片内程序存储器地址(如8051/8751/89C51的PC超过0FFFH)时,将自动转向外部程序存储器继续运行。
此外,在将程序代码烧录至8751内部EPROM、89C51内部FALSH时,可以利用此引脚来输入提供编程电压(8751为2lV、AT89S52为12V、8051是由生产厂方一次性加工好)。
XTAL1:
接外部晶振的一个引脚。
在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡器。
它采用外部振荡器时,此引脚应接地。
XTAL2:
在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端。
当采用外部振荡器时,则此引脚接外部振荡信号的输入。
(3)振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
(4)芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89S52设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.2总体设计
智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,后轮是万象轮,起支撑的作用。
将循迹光电对管分别装在车体下的左右。
当车身下左边的传感器检测到黑线时,主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。
避障的原理和循线一样,在车身右边装一个光电对管,当其检测到障碍物时,主控芯片给出信号报警并控制车子倒退,转向,从而避开障碍物。
3.2主板设计框图如图3.2,所需原件清单如表3.2。
图3.2主板设计框图
元件
数量
直流电机
2只
电阻
若干
集成电路芯片
单片机
1块
二极管
电容
红外对管
蜂鸣器
1只
电位器
12M晶振
杜邦线
玩具小车
1个
排针
液晶屏
一体化红外接收头
表3.2元件清单
3.3驱动电路
电机驱动一般采用H桥式驱动电路,L9110内部集成了H桥式驱动电路,从而可以采用L9110电路来驱动电机。
其引脚图如3.3.1,驱动原理图如图3.3.2。
图3.3.1L9110引脚图
图3.3.2电机驱动电路
3.4信号检测模块
小车循迹原理是小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;
如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号,再通过LM393作比较器来采集高低电平,从而实现信号的检测。
避障亦是此原理。
电路图如图3.4。
市面上有很多红外传感器,在这里我选用94型光电对管。
图3.4循迹原理图
3.5主控电路
本模块主要是对采集信号进行分析,同时给出PWM波控制电机速度,起停。
以及再检测到障碍报警等作用。
其电路图如图3.5。
图3.5主控电路
第四章软件设计
4.1主程序框图:
4.1主程序图
4.2电机驱动程序
voidgoahead()
{
s1=1;
s2=0;
s3=1;
s4=0;
}
voidgoback()
s1=0;
s2=1;
s3=0;
s4=1;
voidturnleft()
voidturnright()
voidstop()
en1=0;
en2=0;
4.3循迹模块
循迹框图:
图4.3循迹框图
循迹程序:
#include<
at89x51.h>
//包含51相关的头文件
typedefunsignedcharuchar;
//重定义char数据类型
typedefunsignedintuint;
//重定义int数据类型
#defineShowPortP2//定义数码管显示端口
ucharcodeLedShowData[]={0x03,0x9F,0x25,0x0D,0x99,
0x49,0x41,0x1F,0x01,0x19};
//0,1,2,3,4,5,6,7,8,9//定义数码管显示数据
staticunsignedintRecvData;
//定义接收红外数据变量
staticunsignedcharCountData;
//定义红外个数计数变量
staticunsignedcharAddData;
//定义自增变量
staticunsignedintLedFlash;
//定义闪动频率计数变量
unsignedcharHeardData;
//定义接收到数据的高位变量
bitRunFlag=0;
//定义运行标志位
bitEnableLight=0;
//定义指示灯使能位
/***********完成基本数据变量定义**************/
sbitS1State=P1^0;
//定义S1状态标志位
sbitS2State=P1^1;
//定义S2状态标志位
sbitB1State=P1^2;
//定义B1状态标志位
sbitIRState=P1^3;
//定义IR状态标志位
sbitRunStopState=P1^4;
//定义运行停止标志位
sbitFontIRState=P1^5;
//定义FontIR状态标志位
sbitLeftIRState=P1^6;
//定义LeftIR状态标志位
sbitRightIRState=P1^7;
//定义RightIRState状态标志位
/*************完成状态指示灯定义*************/
sbitS1=P3^2;
//定义S1按键端口
sbitS2=P3^4;
//定义S2按键端口
/*************完成按键端口的定义*************/
sbitLeftLed=P2^0;
//定义前方左侧指示灯端口
sbitRightLed=P0^7;
//定义前方右侧指示灯端口
/*************完成前方指示灯端口定义*********/
sbitLeftIR=P3^5;
//定义前方左侧红外探头
sbitRightIR=P3^6;
//定义前主右侧红外探头
sbitFontIR=P3^7;
//定义正前方红外探头
/*************完成红外探头端口定义***********/
sbitM1A=P0^0;
//定义电机1正向端口
sbitM1B=P0^1;
//定义电机1反向端口
sbitM2A=P0^2;
//定义电机2正向端口
sbitM2B=P0^3;
//定义电机2反向端口
/*************完成电机端口定义***************/
sbitB1=P0^4;
//定义话筒传感器端口
sbitRL1=P0^5;
//定义光敏电阻端口
sbitSB1=P0^6;
//定义蜂鸣端口
/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/
sbitIR1=P3^3;
//定义红外接收端口
/*********完成红外接收端口的定义*************/
voidDelay()//定义延时子程序
{uintDelayTime=30000;
//定