搜档网
当前位置:搜档网 › 超声波避障小车结题报告

超声波避障小车结题报告

超声波避障小车结题报告
超声波避障小车结题报告

H a r b i n I n s t i t u t e o f T e c h n o l o g y

课程设计说明书(论文)

设计题目:超声波避障小车

院系:电气学院自动化测试与控制系

班级:

设计者:

学号:

指导教师:周庆东

设计时间:9.2~9.13

哈尔滨工业大学

课程设计考核表

题目:超声波避障小车

学生姓名:班级:学号:

实验部分考核

总结报告评分

总成绩:指导教师签字:

结题报告

1课题完成情况

本超声波避障小车的设计基于单片机原理和传感器原理,以51单片机为主控芯片,采用直流电机为驱动元件,通过软件编程制作了一整套结构完整,功能模块化,反应较为灵敏的超声波避障小车。经过对该避障小车的避障测试实验,实验结果证明该避障小车能够很好的按照预期完成避障动作,并且能够快速运动灵敏避障,效果良好,运行稳定性较好。

预期的目标都能够实现:

(1)在车前方没有障碍物时,小车沿直线向前走。

(2)在车前方有障碍物时,小车能避开障碍物,避障方法如下:

①先向左边转90度,如果前面没有障碍物,再沿直线向前走;

②如果前面仍有障碍物,则向右转180度,如果前面没有障碍物,则沿直线向前行走;

③如果前面仍有障碍物,则向右90度,然后直线行。

但是该超声波避障小车还存在着许多的不足,比如说只能对正前方一定角度内进行探测,使用的是一路超声波而不是多路超声波探测,并且为了简化,默认的只是向同一个方向转弯等,这些都是有待进一步发展和提高的。

2 所遇问题及解决方案

首先,我们对硬件的原理不够明白,在此之前超声波传感器并没有接触使用过,课程设计指导书上介绍的并不详细,我们利用课后时间查了更加详细的资料,对其做了近一步的了解。

其次,在烧写完程序,通电之后,小车不停地旋转,旋转次序与设计的避障旋转次序一致,说明子函数“getx()”返回的Dis 的值一直小于10. 出现这个结果的问题是子

函数“getx()”里面的子函数delay_nus(1),因为delay_nus(1)的实现的延时时间实际上不是1us,因为delay_nus()函数里面有这样的语句“i=i/10”,这样实际上i就等于0;为了解决这个问题我们重新编写了一个延时函数delay_nus1(1),结果小车正常运行。小车再次通电之后,小车在避障功能上完全满足要求,但是前进时,小车却每行进两三厘米就停顿一下,然后再行进两三厘米就停顿。出现这个问题的原因是程序每循环一次时都应该初始化Sig,我们在程序中加上了“delay_nus(20000);Sig=0;”结果小车正常运行

3 心得体会

通过这次的项目实训,我学习到了很多的电子知识,提高了我对于陌生硬件的学习能力。超声波传感器在此之前我没有接触过,对我来说非常的陌生,从一无所知慢慢查资料到能够熟练应用,让我知道了面对新的硬件应该怎么学习,在以后的工作学习中,我一定会遇到非常多的不熟悉的硬件,我相信,通过不断地锻炼积累,学习能力会进一步提高。

这次实训同时还加强了我实践动手能力,特别培养了出现问题、分析问题、解决问题的能力,我相信这些能力的提高对我以后在从事任何工作都将会有极大的帮助。这次的项目实训让我感触最深的是:作为电子爱好者,电子制作中不管遇到什么问题和困境都要有一颗平静的心和坚持不懈的精神,一颗浮躁的心是不会到达成功的彼岸。

这次课程设计,给我更多的是一种模块化的思想,将系统按我们所需的功能和系统所能提供的功能进行模块化的分类,将会使我们的工作变得一目了然,非常清晰。比如说这次我选的避障小车,可以分成超声波测速模块,电机驱动模块,单片机核心模块三个,三个部分各司其职,无论从硬件上还是软件上,都能够比较清晰地将他们的功能区分开,从而有利于硬件的连接和程序的编写。对于这次程序的编写,我就是分块编写,按模块

调试,从而避免了许多错误。

从以后工作来看,这种模块化处理问题的方式将会更加的有用,在公司和以后得科研项目中,系统一定是越来越复杂,不可能一个人完成所有的任务,一定是一个团队来做这些系统的设计,所以模块化之后,能够将任务分配给每个人,最后大家还能够很好的综合到一起,大大的缩短了开发周期。

最后,感谢胡老师这么多天对我们的帮助,每次遇到问题时,老师都耐性的帮我解答问题,正是老师一次有一次的讲解才让我坚持下来。老师耐心细致的讲解也让我学到了很多课堂上没有学到的知识在此,感谢指导老师尽心的指导。

4 参考文献

[1] 袁新娜,与红英编著.超声波传感器在智能小车避障系统中的应用.[A]中北大学(2009)08-0085-04

[2] 邵贝贝. 单片机嵌入式应用的在线开发方法[M].北京.清华大学出社.2004

[3] 王晓明. 电动机的单片机控制[M].北京. 北京航空航天大学出版社.2002

[4] 臧杰,阎岩. 汽车构造[M]. 北京. 机械工业出版社.2005

[5] 安鹏,马伟.S12单片机模块应用及程序调试[J]. 电子产品世界. 2006.第211期. 162-163

[6] 童诗白,华成英.模拟电子技术基础[M].北京. 高等教育出版社.2000

[7] 沈长生.常用电子元器件使用一读通[M].北京. 人民邮电出版社.2004

[8] 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出社.2004

[9] 张伟等.Protel DXP高级应用[M].北京. 人民邮电出版社.2002

[10] 张文春. 汽车理论[M].北京.机械工业出版社.2005

[11] 江海波,王卓然,耿德根编著.深入浅出AVR单片机.中国电力出版社,2008.

[12]邵贝贝. 嵌入式实时操作系统[LC/OS-Ⅱ(第2版)[M]. 北京.清华大学出版社.2004

附录:

#include

#include

sbit Sin=P1^5; //超声波模块控制端口sbit right=P1^0; //右轮控制信号

sbit left=P1^1; //左轮控制信号unsigned int Dis,Time;

unsigned char LTime,HTime;

void IO_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度

{

unsigned int 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()

{

unsigned int 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() //令左、右两轮均逆时针转动{

unsigned int 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度

}

}

}

}

}

相关主题