单片机课程设计——超声波避障小车
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书(论文)
设计题目:超声波避障小车
院系:学院
班级:
设计者:
学号:
指导教师:
设计时间:8.27~9.10
课程设计任务书
开题报告
绪论
课题目的
通过上学期单片机课程的学习,我们基本掌握了51单片机的基本使用方法,本学期开学初,单片机课程设计给了我们更大的挑战,课题的目的有以下几点。
●进一步熟练掌握单片机的使用方法、提高程序的编写能力
●掌握单片机系统外扩器件的连接与使用
●提高器件说明书以及时序过程的阅读、理解能力
●掌握软件和硬件调试的基本技巧与方法
项目研究背景及意义
在当今社会,汽车成为了越来越普遍,人们不可缺少的交通工具。
但汽车的不断增加,随之而来就是越来越多的交通事故。
交通事故成为了现在越来越严重的安全隐患。
所以随着汽车工业的快速发展,我们必须加强对汽车安全性能的考虑。
所以,智能汽车概念应运而生,他既是汽车产业的机遇也是汽车产业的挑战。
汽车的智能化必将是未来汽车产业发展的趋势,在这样的背景下,我们开展了基于超声波的智能小车的避障研究。
超声波作为智能车避障的一种重要手段,以其避障实现方便,计算简单,易于做到实时控制,测量精度也能达到实用的要求,在未来汽车智能化进程中必将得到广泛应用。
我国作为一个世界大国,在高科技领域也必须占据一席之地,未来汽车的智能化是汽车产业发展必然的,在这种情况下研究超声波在智能车避障上的应用具有深远意义,这将对我国未来智能汽车的研究在世界高科技领域占据领先地位具有重要作用。
设计要求
采用超声波模块实现小车避障功能,实现小车自动避障任务。
1主要设计内容及方案
总体方案设计
系统采用51单片机作为核心控制单元用于智能车系统的控制,在超声波检测到障碍物之后,主控芯片根据距离值控制直流电机的转动,在与障碍物距离较大的情况下,快速前进,在与障碍物距离较小但还未到达临界转弯方向值的时候,慢速前进。
在与障碍物距离很近需要转向避障时,方案上将尝试进行转向,来进行避障。
系统总体的设计方框图如图2-1所示。
根据以上的总体方案设计,我们进行了主程序流程图的设计,下面为所设计的主程序的流程图。
其中DIS即为小车与障碍物的距离;
图错误!文档中没有指定样式的文字。
-2 主程序流程图
主要模块的基本原理
超声波探测模块
超声波探测模块的基本原理及使用方法如下:
IO口触发,给Sin口至少5~10us的高电平,启动测量;
模块自动发送8个40Khz的方波,自动检测是否有信号返回;
有信号返回,通过IO口Sin输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间,测试距离=(高电平时间*340)/ 2。
图2- 3 超声波探测模块时序图
直流电机控制模块
机器人的动作由伺服电机控制。
伺服电机与单片机接口的连接,图电机连接原理图和实际接线图,P1_0引脚的控制输出用来控制右的伺服电机,而P1_1则用来控制左边的伺服电机。
图2- 4 左、右电机连接图
控制电机运动转速的是高电平持续的时间,当高电平持续时间为1.3ms时,电机顺时针全速旋转,当高电平持续时间1.7ms时,电机逆时针速旋转。
图2- 5 电机顺、逆时针旋转控制脉冲图
所以可知,若令左、右车轮电机高电平持续时间为1.5ms时,小车将处于静止状态。
若令左车轮电机高电平持续时间为1.7ms,右车轮电机高电平持续时间为1.3ms时,则左车轮电机逆时针,右车轮电机顺时针,小车将会以最快的速度前进。
此时,若想改变小车的前进速度,则逐渐减小左电机的高电平时间,逐渐增加右电机的高电平时间,则可以减小车速。
同理可知,若令左车轮电机高电平持续时间为1.3ms,右车轮电机高电平持续时间为1.7ms时,则左车轮电机顺时针,右车轮电机逆时针,小车将会以最快的速度后退。
当需要转弯时,通过分析和测试我们可以知道,当小车想左转时,需令左右两轮均顺时针旋转,而当小车想右转时,需令左右两轮均逆时针旋转。
通过对直流电机模块的学习和了解,我已经了解了控制小车运动的方法。
需解决的关键问题
关键问题首先是要学会使用超声波测距器件,根据老师所提供的知识,利用图像读懂超声波器件的工作时序,根据时序以及超声波测距器件的工作信号特点,并且结合单片机的定时器/计数器等功能,来顺利的完成小车对于前方障碍物距离的测量。
另一个比较关键的问题就是确定小车的避障方案,根据上方的主程序流程图,我们采用一种避障方案,在接下的设计中,我们需要对于该方案能否正确躲避障碍进行验证,并且需要不断思考,提出更多的更好的更有效的避障方案。
具体实施方案及程序
2.4.1 程序初始化
初始化函数中需要对定时器/计数器的模式进行设定,以及初始值的设定,流程图如下
程序如下:
voidIO_init(void)
{
EA=1;
ET0=1;
TMOD=0x11;//将T0定时器/计数器设置为16位计数模式
TH0=0x00; //初始值为0
TL0=0x00;
TR0=0; //不开始计数
}
2.4.2 测距函数
测距函数是本程序的比较关键的一个函数,需要根据仪器的本身特点来进行编程,流程图如下
测距函数如下:
void getx(unsigned char a) //测距函数
{
TH0=TL0=0; //初始值设置为0
if(a)
{
Sin=0; //Sin置0
Sin=1; //Sin置1,并且延时一段时间,提供一个测距的触发脉冲
delay_5us();
Sin=0; //Sin重新置0
}
while(Sin);
while(!Sin);//SIN信号从低电平变为高电平,此时跳出该循环TR0置1,开始计数TR0=1;
while(Sin); /SIN信号从高电平变为低电平,此时跳出该循环TR0置0,停止计数TR0=0;
LTime=TL0;
HTime=TH0;
Time=HTime*256+LTime; //将高8位乘以256加上低8位得到总值
Dis=Time/(2*29); //计算出所差距离
}
2.4.3 主函数
主函数的流程图如下
主函数如下:
void main() //主程序
{
IO_init(); //初始化
while(1)
{
getx(1); //测距
if(Dis>=50) //如果距离大于50
{
Forward_fast(); //快速前进
}
else if(Dis>=10&&Dis<50) //如果距离在10与50之内
{
Forward_slow(); //慢速前进
}
else //否则,小于10,需转向避障
{
Left_90(); // 先左转90度
getx(1); //测量距离
if(Dis>=10) //如果距离大于10
{
Forward_slow(); //慢速前进
}
else //如果距离依旧小于10
{
Right_180(); //右转180
getx(1); //测距
if(Dis>=10) //如果此时距离小于10
{
Forward_slow(); //慢速前进
}
else //否则,继续调试
{
Right_90(); //右转90度
}
}
}
}
}
2.4.4 完整程序代码与注释
#include<reg51.h>
#include<intrins.h>
sbit Sin=P1^5; //超声波模块控制端口
sbit right=P1^0; //右轮控制信号
sbit left=P1^1; //左轮控制信号
unsignedintDis,Time;
unsigned char LTime,HTime;
voidIO_init(void)
{
EA=1;
ET0=1;
TMOD=0x11;//将T0定时器/计数器设置为16位计数模式
TH0=0x00; //初始值为0
TL0=0x00;
TR0=0; //不开始计数
}
void delay_nus(unsigned int i) //延时函数
{
i=i/10;
while(--i);
}
void delay_5us() //短时间延时函数,为SIN高电平准备
{
_nop_();
}
void getx(unsigned char a) //测距函数
{
TH0=TL0=0; //初始值设置为0
if(a)
{
Sin=0; //Sin置0
Sin=1; //Sin置1,并且延时一段时间,提供一个测距的触发脉冲
delay_5us();
Sin=0; //Sin重新置0
}
while(Sin);
while(!Sin);//SIN信号从低电平变为高电平,此时跳出该循环TR0置1,开始计数TR0=1;
while(Sin); /SIN信号从高电平变为低电平,此时跳出该循环TR0置0,停止计数TR0=0;
LTime=TL0;
HTime=TH0;
Time=HTime*256+LTime; //将高8位乘以256加上低8位得到总值
Dis=Time/(2*29); //计算出所差距离
}
void Forward_fast(void) //快速前进
{
left=1;
delay_nus(1700);
left=0;
delay_nus(20000);
right=1;
delay_nus(1300);
right=0;
delay_nus(20000);
}
void Forward_slow(void) //慢速前进
{
left=1;
delay_nus(1580); //减小左电机的高电平时间,增加右电机的高电平时间,减小速度left=0;
delay_nus(20000);
right=1;
delay_nus(1420);
right=0;
delay_nus(20000);
}
void Left_90(void) //左转90度
{
unsignedint i=0;
while(i<20)
{
i++;
left=1;
delay_nus(1300); //令左、右两轮均顺时针转动
left=0;
delay_nus(20000);
right=1;
delay_nus(1300);
right=0;
delay_nus(20000);
}
}
void Right_180()
{
unsignedint i=0;
while(i<38)
{
i++;
left=1; //令左、右两轮均逆时针转动
delay_nus(1700);
left=0;
delay_nus(20000);
right=1;
delay_nus(1700);
right=0;
delay_nus(20000);
}
}
void Right_90() //令左、右两轮均逆时针转动{
unsignedint i=0;
while(i<20)
{
i++;
left=1;
delay_nus(1700);
left=0;
delay_nus(20000);
right=1;
delay_nus(1700);
right=0;
delay_nus(20000);
}
}
void main() //主程序
{
IO_init(); //初始化
while(1)
{
getx(1); //测距
if(Dis>=50) //如果距离大于50
{
Forward_fast(); //快速前进
}
else if(Dis>=10&&Dis<50) //如果距离在10与50之内
{
Forward_slow(); //慢速前进
}
else //否则,小于10,需转向避障
{
Left_90(); // 先左转90度
getx(1); //测量距离
if(Dis>=10) //如果距离大于10
{
Forward_slow(); //慢速前进
}
else //如果距离依旧小于10
{
Right_180(); //右转180
getx(1); //测距
if(Dis>=10) //如果此时距离小于10
{
Forward_slow(); //慢速前进
}
else //否则,继续调试
{
Right_90(); //右转90度
}
}
}
}
}
结题报告
1课题完成情况
本超声波避障小车的设计基于单片机原理和传感器原理,以51单片机为主控芯片,采用直流电机为驱动元件,通过软件编程制作了一整套结构完整,功能模块化,反应较为灵敏的超声波避障小车。
经过对该避障小车的避障测试实验,实验结果证明该避障小车能够很好的按照预期完成避障动作,并且能够快速运动灵敏避障,效果良好,运行稳定性较好。
2 所遇问题及解决方案
在进行小车调试时,我们遇到的一个最大困难就是当我们前期的程序烧入芯片后,我们的小车运行的非常不平稳,前进运行的非常不连贯。
小车前进一会,就会有一段比较明显的时段停止。
当我遇到这个问题时,我没有慌乱,我一步一步的进行了分析。
首先,我怀疑了前进函数Forward()出现问题,检查Forward()的后,发现提供给左右车轮的PWM信号正常,没有出现异常,而且出于控制变量思想,为了准确的找到问题的症结所在,我单独讲Forward()函数烧入小车中,运行后可以发现,小车的运行非常正常,不存在运行不平稳的现象。
在排除了Forward()函数的问题后,我开始怀疑是不是测速的函数getx()对Forward ()函数造成了干扰。
我们通过分析可以知道,forward()函数提供了一个非常完美的驱动电机的PWM信号,但是一旦在程序中,存在着一些其他例如测距程序,判断语句等程序时,会对其PWM信号产生一些干扰,应尽可能的减少这些程序对于小车运行程序的干扰。
所以我将我之前使用的delay()函数用系统的库函数_nop()_来代替,再将更改后的程序下载入小车后,惊奇的发现,小车能够平稳的运行了。
我们再进一步的分析这个问题的原因,我们可以看到,在之前的delay()函数中,我们使用了除法,除法在指令周期最长的一个指令,他会导致PWM信号在某一电平上停留的时间过长,影响信号的占空比与波形,而系统的库函数运行的时间则比较短,对其他函数的影响较小。
以上就是我对这个问题的思考,可能我对这个问题的分析也存在一些不完善的地方,比如说,我自己也会问自己,指令的运行周期长短,怎么会对毫秒级的PWM电机驱动信
号造成如此大的影响等等,课程设计结束后,我也会继续的查找一些资料,多问问师兄和老师,争取找到最完整,正确的答案。
3 心得体会
这次课程设计给我们提供了一个非常好的机会来提高我们实际的应用能力。
从选题开始老师就给予我们很大的自主性,让我们大家自主选题,这种开放式教学方式也从另一个方面激发起了我们去学习的欲望。
这次课程设计,给我更多的是一种模块化的思想,将系统按我们所需的功能和系统所能提供的功能进行模块化的分类,将会使我们的工作变得一目了然,非常清晰。
比如说这次我选的避障小车,可以分成超声波测速模块,电机驱动模块,单片机核心模块三个,三个部分各司其职,无论从硬件上还是软件上,都能够比较清晰地将他们的功能区分开,从而有利于硬件的连接和程序的编写。
对于这次程序的编写,我就是分块编写,按模块调试,从而避免了许多错误。
从以后工作来看,这种模块化处理问题的方式将会更加的有用,在公司和以后得科研项目中,系统一定是越来越复杂,不可能一个人完成所有的任务,一定是一个团队来做这些系统的设计,所以模块化之后,能够将任务分配给每个人,最后大家还能够很好的综合到一起,大大的缩短了开发周期。
这次课程设计,提高了我对于陌生硬件的学习能力,超声波仪器对我来说非常的陌生,所以通过这次的学习,我感觉我学习硬件的能力有所提高,对于时序的理解能力也有了进步。
单片机主要的功能就是对各种各样的外设进行控制,在以后的工作学习中,我一定会遇到非常多的不熟悉的硬件,我相信,通过不断地锻炼积累,应该有比较强的学习能力。
但是该超声波避障小车还存在着许多的不足,比如说只能对正前方一定角度内进行探测,使用的是一路超声波而不是多路超声波探测,并且为了简化,默认的只是向同一个方向转弯等,这些都是有待进一步发展和提高的,这与制作者自身的对与障碍检测距离分析、自动控制信号处理、图像处理等诸多技术的有限性分不开的,还需要研究制作者的学习和探索。
本次项目共历时两周,有时间比较紧张,此外项目的进度控制不是很准确,技术上本身也有一定难度,但我认为这不是主要原因,以后我会强调时间概念,按时并且争取有效率的完成规定阶段的任务。
我们遇到的困难主要在于对超声波模块的使用方法不了解,实验室的模块并没有配套的资料,而网上也比较难找到它的手册资料,最后我们选择参考模板程序,然后对其进行改进使之适于自己的需求,这样也减少了从头到尾重复编写代码的时间。
最后,感谢胡老师这么多天对我们的帮助,每次遇到问题时,老师都耐性的帮我解答问题,正是老师一次有一次的讲解才让我坚持下来。
老师耐心细致的讲解也让我学到了很多课堂上没有学到的知识。
感谢老师对我们的帮助。
4 参考文献
[1] 邵贝贝. 嵌入式实时操作系统[LC/OS-Ⅱ(第2版)[M]. 北京.清华大学出版社.2004
[2] 邵贝贝. 单片机嵌入式应用的在线开发方法[M].北京.清华大学出社.2004
[3] 王晓明. 电动机的单片机控制[M].北京. 北京航空航天大学出版社.2002
[4] 臧杰,阎岩. 汽车构造[M]. 北京. 机械工业出版社.2005
[5] 安鹏,马伟.S12单片机模块应用及程序调试[J]. 电子产品世界. 2006.第211期. 162-163
[7] 童诗白,华成英.模拟电子技术基础[M].北京. 高等教育出版社.2000
[8] 沈长生.常用电子元器件使用一读通[M].北京. 人民邮电出版社.2004
[9] 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出社.2004
[10] 张伟等.Protel DXP高级应用[M].北京. 人民邮电出版社.2002
[11] 张文春. 汽车理论[M].北京.机械工业出版社.2005
[12] 江海波,王卓然,耿德根编著.深入浅出AVR单片机.中国电力出版社,2008.
[13] 袁新娜,与红英编著.超声波传感器在智能小车避障系统中的应用.[A]中北大学 (2009)08-0085-04。