超声避障小车设计报告.docx
《超声避障小车设计报告.docx》由会员分享,可在线阅读,更多相关《超声避障小车设计报告.docx(9页珍藏版)》请在冰豆网上搜索。
超声避障小车设计报告
综合能力实训项目设计报告
1避障小车设计说明
该设计利用单片机STC89C52RC作为主控芯片,该芯片是一种高速、低功耗、抗干扰能力强的芯片,其最高时钟工作频率为48MHz,用户应用程序空间为8K。
能够满足程序空间需要。
驱动采用L298N驱动芯片,它是一种双全桥步进电机专用芯片,通过对其输入端的控制可以实现小车的启动、转向、停止等动作。
为节省成本,小车由两个直流减速电机加一个万向轮构成,并采用后轮驱动。
系统采用单片机为控制核心,利用自制小车或玩具小车进行小车的模拟,采用超声波避障模块进行障碍物的检测。
单片机控制避障模块发射和接收,通过相应的程序处理,判断障碍物的位置。
根据检测情况单片机控制电机驱动模块,控制小车电机的正反转实现小车的转向,启动等相应动作,来实现避开障碍物。
2总体设计方案
2.1设计要求
在小车行驶过程中,50ms启动一次超波模块,对前方路况进行检测,当障碍物小于40cm时,小车自动左转90度,当小车转过90度后,对前方道路再次检测,若无障碍,向前行驶。
如果存在障碍物且小于40cm,小车右转180度,并再次检测前方路况,若无障碍物,向前行驶,有障碍物且距离小于40cm,小车向右转90度并向前行驶。
2.2系统设计方案
根据设计要求,为了便于调试和改进,采用模块化设计。
系统可分为:
微控制器、避障模块、驱动模块、小车模块。
2.3总体设计
基于单片机STC89C52RC设计的智能避障小车,本设计需提供+5V电源,,DC+5CV由蓄电池通过降压模块得到+5V电源,为单片机及其他电路提供工作电压。
超声波避障模块,采用购买的现成的超生波发射接收模块,通过单片机控制超声波模块去小车行驶道路上的障碍物进行检测,然后单片机通过处理反馈的信息,判断障碍物的距离,进而发出指令控制驱动模块,控制小车实现转向,达到避障的目的。
系统框图
总体设计框图
2.4功能说明
本设计主控芯片采用51芯片,负责传感器的状态,并向电机驱动模块发出动作指令。
复位采用手动复位。
电源由蓄电池提供,为单片机及其他模块供电,+5V主要为驱动电机提供电源。
避障模块采用购买的成品,该模块在单片机的控制下对小车前方的路况进行检查,并将检测信息反馈给单片机,单片机经过处理反馈回来的信息,发出相应的指令控制驱动模块,从而控制小车做出相应的动作,达到避障的目的。
3硬件的选择与组成
3.1单片机的选择
采用单片机STC89C52RC为核心,8K的内部程序存储器(ROM),512个内部数据存储器(RAM),4个寄存器区,32个通用I/O端口,2个16位的定时、计数器,有ISP功能,能用于下载线进行的在线编程,设有4个中断源,能够完成设计要求,且该芯片价格便宜,采用该芯片能够达到设计要求。
该设计选用STC89C52作为主控芯片。
单片机用的是STC89C52RC,该芯片存储容量大,体积小。
单片机最小系统:
电源部分、晶振部分、复位电路和31号脚接高电平。
单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几个大单元及数据总线地址总线和控制总线等三大总线。
9号复位信号脚,时钟电器开始工作,复位端会出现24个时钟周期以上的高电平,系统即初始复位。
其复位方式一般为手动复位,VCC断电期间,此引脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
31脚程序存储器的内外部选通线,内置有8kb的程序存储器,当EA为高电平并且程序地址小于8kb时,读取内部程序存储器指令数据。
所以该设计31脚应该接高电平。
51单片机内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,18、19脚就接电容和晶振电路。
单片机40脚接VCC,可以提供电源,20脚接地。
3.2避障模块的选择
该部分采用购买HC-SR04超声波测距模块,该模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达到3cm,模块包括超生波发射器,接收器与控制电路。
工作原理:
(1)采用IO口TRIG触发测距,给至少给10us的高电平;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340m/s))/2。
3.3驱动模块的选择
驱动采用L298N驱动芯片,该芯片是双全桥步进电机专用驱动芯片,内涵4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge的高电压、大电流双全桥驱动器,接收标准TTL逻辑信号,可驱动46V、2A
以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信,第1脚和第15脚可与电流侦测用电阻连接来控制负载的电路。
OUTPUT1、OUTPUT2和OUTPUT3、OUTPUT4之间分别接2个直流电机;INPUT1~INPUT4输入控制电位来控制电机的正反转;Enable则控制电机停转。
电源供电部分使用直流可调稳压电源,提供直流+5V电压,运用三线稳压器件7805,输出+5V电源。
由于7805简单易用、价格低廉,在大多电路中充分采用。
通过电解电容的隔离滤波作用,电源部分可输出+5V的直流电源。
4软件程序流程图
4.1主流程图
在程序设计中,为了便于调试,方便找到程序问题的所在,程序采用在主函数中调用各个子函数的形式。
当启动一次超声波测距程序时,单片机会根据检测反馈回来的信息进行相应的处理,进而判断是否有障碍物,当障碍物的距离小于设定的安全距离时,单片机会发出相应的指令,控制驱动电路,对小车的行驶方向进行调整。
当小车前方无障碍物时,主程序会在一定的时间内自动启动一次超生波测距程序,若无障碍继续按原来的方向行驶。
如此循环,达到避障的目的。
4.2模块程序设计说明
在程序中我采用了两个计数器溢出中断,其中一个是T0计数器溢出中断,是用来计算障碍物的距离,如果障碍物的距离超出测距范围,利用该中断设置标志位。
另一个是T1计数器溢出中断,我利用该中断控制超声波发射的时间间隔,即对路面障碍物检测的时间间隔,来适时判断路面情况,改变小车的行驶方向,达到小车躲避行驶过程中遇到的障碍物。
4.3超声波避障程序
只需提供一个10us以上的脉冲信号,该模块内部将发出8个40KHz周期电平并检测回波。
一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。
由此通过发射信号到接收到回响信号的时间间隔可以计算得到距离。
4.4驱动模块程序
当在主程序中当计数器T1溢出中断响应时,会首先判断障碍物的距离是否小于设定的安全距离(被设计中为40cm),若大于安全距离,小车继续按原来的方向行驶,若小于安全距离,小车首先左转90度,停下并启动超声波避障程序再次对前方的路况进行障碍有无的检测,若无障碍物或有障碍但大于安全距离,小车沿该方向前进,反之当障碍物的距离小于安全距离时,小车向右旋转180度,停止并再次启动超生波避障程序,对前方的路况进行检测,若无障碍物或有障碍物但距离大于安全距离,小车沿该方向前进,反之当障碍物的距离小于安全距离时。
小车向右转90度,沿该方向行驶。
如此循环实现避障。
5小车整体程序部分
#include//器件配置文件
#include
sbitRX=P2^2;//接受端口
sbitTX=P2^3;//发射端口
//驱动引脚定义
sbitIN1=P1^0;//M2
sbitIN2=P1^1;
sbitIN3=P1^2;//M1
sbitIN4=P1^3;
unsignedinttime=0;
unsignedlongS=0,num=0;
bitflag=0;/*----------------------------uS延时函数大致延时长度如下T=tx2+5uS--------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*---------------------------------mS延时函数---------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
voiddelay(void)
{
DelayMs(200);DelayMs(200);
DelayMs(200);DelayMs(200);
DelayMs(200);DelayMs(200);
DelayMs(200);DelayMs(200);
}
/*********驱动模块********************/
forword()//前进
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
turn_left()//左拐
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
turn_right()//右拐
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
stop()//停止
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
/*****T0中断用来计数器溢出,超过测距范围******/
voidzd0()interrupt1
{
flag=1;//中断溢出标志
}
/*********启动超生波模块*****************/
voidStartModule()
{
TX=1;//启动一次模块
DelayUs2x(8);//延时大概20us
TX=0;
while(!
RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
}
unsignedintcount()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
//算出来是CM
if((S>=700)||flag==1)//超出测量范围
{
flag=0;S=700;
}DelayMs(80);//80MS
returnS;
}//定时器T1溢出中断一定时间启动一次测距模块
voidtime1()interrupt3
{
ET1=0;
TR1=0;
TH1=(65536-15536)/256;
TL1=(65536-15536)%256;
StartModule();
num=count();
if(num<40)
{
turn_left();
delay();//延时1.6s完成转向
stop();
StartModule();//启动一次模块
num=count();//计算障碍物距离
if(num<40)
{
turn_right();
delay();//延时3.2s完成转向
delay();
stop();
StartModule();//启动一次模块num=count();//计算障碍物距离
if(num<40)
{
turn_right();
delay();//延时1.6s完成转向forword();
}
elseforword();
}
elseforword();
}
elseforword();
ET1=1;TR1=1;
}
/**************主函数*********************/
voidmain()
{
unsignedinti=0;
TMOD=0x11;
//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1;//允许T0中断
TH1=(65535-15536)/256;
TL1=(65535-15536)%256;
ET1=1;//允许T1中断
TR1=1;
EA=1;//开启总中
while
(1)
{
forword();
}
}