课程设计报告(旋转超声波测距仪)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大连民族学院机电信息工程学院
自动化系
单片机系统课程设计报告
题目:旋转超声波测距仪
专业:测控技术与仪器
班级:测控112班
学生姓名:张裕鑫牛小宁
指导教师:谢春利
设计完成日期:2013年10月18日
课程设计任务书
题目:旋转超声波测距仪
课程设计时间:2013.9.23~2013.10.18
一、设计任务
设计一个超声波测距器,可应用在汽车倒车、建筑施工工地以及一些工业现场的位置测控,也可用于如液位、井深、管道长度的测量等场合。
二、设计内容及要求
⒈系统设计的方案;
⒉检测电路和过程通道的设计;
⒊系统软件设计与实现;
⒋需要的详细材料和工具清单;
⒌设计的性能指标;
⒍撰写设计报告;
⒎资料归档。
三、设计重点
检测电路和过程通道设计;
系统软件设计、调试。
四、课程设计进度要求
⒈13.9.23~13.9.24 系统方案设计;
⒉13.9.25~13.9.26 检测电路和过程通道设计;
⒊13.9.27 完成系统硬件设计,提交材料清单;
⒋13.10.7~13.10.11 系统硬件焊接和软硬件调试;
⒌13.10.14~13.10.16 完善系统设计,撰写设计报告;
⒍13.10.17 成果验收;
⒎13.10.18 答辩
五、参阅书目
[1] 祁伟,杨亭,单片机C51程序设计教程与实验[M]。
北京:北京航空航天大学出版社,2006.1
[2] 徐科军,传感器与检测技术[M]。
北京:电子工业出版社,2010.11
[3] 方彦军,孙健,智能仪器技术及其应用[M]。
北京:化学工业出版社,2004.4
[4] 徐爱钧,智能化测量控制仪表原理与设计[M]。
北京:北京航空航天大学出版社,2004.9
目录
1任务分析和性能指标 (1)
1.1任务分析 (1)
1.2性能指标 (1)
2总体方案设计 (2)
3硬件设计与实现 (3)
3.1检测电路 (3)
3.2显示电路 (3)
3.3转动电路 (4)
4软件设计与实现 (5)
4.1主程序 (6)
4.2子程序 (6)
5 调试及性能分析 (7)
5.1 调试分析 (7)
5.1.1 软件调试 (7)
5.1.2 硬件调试 (7)
5.2 性能分析 (8)
总结 (9)
参考文献 (10)
附录1 元器件清单 (11)
附录2 调试系统照片 (12)
附录3 技术资料 (13)
附录4 原理图 (14)
附录5 主要程序 (15)
主程序 (15)
子程序 (18)
课程设计题目
1任务分析和性能指标
1.1任务分析
该作品需要达到的目标:
⑴测量前方障碍物距离;
⑵可以旋转,测量多个角度;
⑶能够显示测得的距离,以及旋转的角度。
该作品在常见的超声波测距仪的基础上,增加了旋转功能,即可在同一个水平面上测量多个角度上的障碍物距离。
使测距功能更加灵活,简单有效。
1.2性能指标
题目要求:
⑴测量范围10 cm—4m;
⑵测量精度1 cm;
⑶测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。
课程设计题目
2总体方案设计
图1
该作品以msp430g2553单片机为核心,控制超声波模块发射和接收超声波,并采集发射和接收到的超声波的时间差,再送到显示电路显示,并且控制超声波模块下方的舵机转动,从而达到多角度的测量。
主要硬件电路:
控制CPU:MSP430G2553单片机,作为整个系统的控制器。
显示电路:以诺基亚5110液晶屏为核心,用来显示超声波测得的距离和角度。
检测电路:超声波模块HC-SR04,用来探测与障碍物之间的距离。
转动电路:mg995舵机以及双向缓冲器74HC245,放在超声波模块的下方,带动超声波模块转动,达到多个角度测距的功能。
3硬件设计与实现
3.1检测电路
以超声波测距模块HC-SR04为核心。
图2
基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信号。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2;
3.2显示电路
图3 图4
以诺基亚5110液晶屏为核心,可以显示传感器测得的距离,以及旋转角度。
Nokia/诺基亚5110 LCD模块具有以下特点:
(1)84x48 的点阵LCD,可以显示4 行汉字,
(2)采用串行接口与主处理器进行通信,接口信号线数量大幅度减少。
(3)LCD 控制器/驱动器芯片已绑定到LCD 晶片上,模块的体积很小。
(4)采用低电压供电,正常显示时的工作电流在200μA 以下,且具有掉电模式。
3.3转动电路
以mg995舵机以及74HC245为核心。
图5
将msp430g2553发出PWM波的P2.2引脚接入74HC245输入端,将74HC245的输入接入舵机。
两个按键分别接到P2.4和P2.5,控制PWM占空比变化,从而控制舵机。
舵机是一种位置伺服的驱动器。
它接收一定的控制信号,输出一定的角度,适用那些需要角度不断变化并可以保持的控制系统。
在微机电系统和航模中,它是一个基本的输出执行机构。
4软件设计与实现
程序流程图:
图6
超声波模块HC-SR04从发射出超声波时接收端即接收到高电平,直至超声波反射回来被接受到时才变为低电平,也就是说高电平维持的时间即为超声波的传播时间。
因此可以用msp430g2553单片机的TA0模块的捕获功能,分别捕捉上升沿和下降沿的时间,再算出时间差,就可求出超声波传播的时间。
诺基亚5110液晶屏为串行输入,用msp430g2553单片机IO口普通功能模拟SPI协议输入数据。
舵机是利用PWM来控制转动的角度,运用msp430g2553单片机的TA1的定时功能发出PWM波,按键控制PWM的占空比,从而控制舵机。
4.1主程序
⑴关闭看门狗。
⑵设置主系统时钟和主辅助系统时钟。
⑷开启MSP430g2553单片机总中断功能。
⑸初始化按键子程序;初始化PWM输出子程序;初始化显示子程序。
初始化超
声波触发子程序。
⑹在死循环中调用超声波触发子程序测量距离。
⑺在死循环中显示测得的距离和旋转的角度。
⑻编写P2口中断服务程序,用于按键扫描。
⑼编写定时器TA0中断服务程序,用于计算传播时间。
4.2子程序
⑴ PWM输出子程序:运用MSP430g2553单片机定时器TA1定时功能,选择P2.2
引脚的模块功能,可以输出占空比可调的PWM波形。
⑵按键扫描子程序:打开MSP430g2553单片机P2.4和P2.5引脚的I/O中断功
能,扫描按键,从而控制PWM占空比。
⑶超声波触发子程序:运用MSP430g2553单片机定时器TA0捕获功能,捕获超
声波发出时间和和接收时间。
P1.0和P1.1和分别接超声波模块的输入和输出引脚。
⑷显示子程序:编写LCD清屏函数,编写LCD写数据函数,编写LCD写命令函
数。
用以上三个函数为框架编写成写数字函数以及写文字函数,等待主程序调用。
⑷汉字代码数组:编写数组,存放需要显示的汉字的代码,等待显示子程序调
用。
⑸数字代码数组:编写数组,存放需要显示的数字的代码,等待显示子程序调
用。
5 调试及性能分析
5.1 调试分析
5.1.1 软件调试
(1) Msp430g2553单片机不能进行位操作,所以对某一位进行置1或清0的时候,
需要用与、或运算来对整个字节进行操作。
(2) 在运用msp430g2553单片机TA0的捕获功能时,当捕获到上升沿时需要立即
改变捕获方式,改为下降沿捕获,然后在捕获到下降沿之后再立即改为上升沿捕获,如此两次捕获的值作差才是超声波传播的时间。
(3) 在允许的范围内,可以选择更高频率的辅助系统时钟源,辅助系统时钟频率
越高,TA0捕获时计数值就越多,如此计算出的传播时间和距离就越精确。
(4) 液晶屏上显示的文字分为两部分:一部分不需改变的文字(距离、角度),
一部分需要不断更新的数值。
所以可以将不需改变的文字放在死循环前,只执行一次即可。
(5) 根据舵机控制的需要,msp430g2553单片机输出的PWM为周期20ms,高电平
为0.5ms-2.5ms。
5.1.2 硬件调试
(1) 整个系统需要两个电源,分别5v电源和3.3v电源,5v电源为74HC245、舵
机、超声波模块供电,3.3v电源为5110液晶屏和msp430单片机供电。
(2) msp430g2553单片机的最小系统上有5V电源的接口,内部有芯片可把5V转化为3.3V,所以可以用5V电池接单片机最小系统的5V插口,再从最小系统已引出的3.3V电源引脚接触供液晶屏使用。
方便电路设计。
(3) 74HC245为双向缓冲器,在应用前应把“DIR”引脚设置好,选择好输出的方向。
(4) 诺基亚5110液晶7引脚“LIGHT”为背光控制引脚,接地可以背光,5110液晶的电源为3.3v,所以控制时不需要电平转换。
(5) 按键需要在程序上加相应的延时进行去抖,避免出现连续转动。
(6) 74HC245必须加在单片机和舵机之间,不仅为电平转换,也为防止单片机驱
动力不够,烧毁单片机芯片。
5.2 性能分析
(1) 经测试,该作品可以达到3cm——4m的检测距离,并且误差较小,在毫米级
别上。
在允许范围内,可以提高辅助系统时钟频率来提高精度。
(2) 作品的旋转角度在0度——184度之间,由于用的MG995舵机只能在0——
200之间旋转,所以无法进行整周的旋转,如有需要可以将该舵机换为步进电机。
(3) 作品的旋转功能是由两个按键步进控制,步进值设为4度,可在0到184
度之间左右旋转,如有需要,可以更改PWM占空比步进大小来增大或减小转动的步进值。
(4) 显示屏上显示的为障碍物到超声波模块的距离,以及旋转的角度。
总结
为期一个月的课程设计将要结束了。
在这两周的学习中,我们学到了很多东西,也找到了自己身上的不足。
感受良多,获益匪浅。
这一个月中,我们小组分工合作、齐心协力,一起完成了课程设计前的准备工作(阅读课程设计相关文档)、小组讨论分工、完成系统开发、课程设计总结报告的任务等。
在课程设计的第一天我们便对这次任务进行了规划和分工。
在以后的几天中,我们组的成员一起努力,查阅资料、小组讨论、对资料进行分析,并最后撰写课程设计报告及汇报总结。
刚刚开始的时候我们真的是一团乱,不过有一天下午去找老师,韩老师悉心的教我们,让我们了解怎么样找到与我们所做的课题相关的方面,怎么样把我们的东西应用到实际中去,这让我们清楚了不少,也对以后的设计和制作减少了很大一部分的疑惑。
在课程设计的过程中,我们经历了感动,经历了一起奋斗的酸甜苦辣。
也一起分享了成功的喜悦。
这次的课程设计对我们每个人来说都是一个挑战。
每一个挑战要是对于每一个人来说那就是困难,但是一个挑战要是对于三个人来说没什么大不了的,俗话还说的好呢:三个臭皮匠顶一个诸葛亮。
所以这时候小组的力量就体现出来了,各司其职,各尽其能。
发挥了集体的效用。
虽然只有三个人,但是跟之前的课设的两个人比起来我们还是觉得多一个人多一份力量。
在这个过程,我们感受了好多帮助,老师一句耐心的解释,同学一个细微的帮助,让人有无比的动力和解决问题的决心。
其实这次的课程设计我们的最大的感受不是知识的获得,而是人格的磨练和交际的能力。
我觉得这些在以后我们的生活与工作的道路上都是及其有好处的。
然而我们也有意见不合的时候,但是我们现在都是成人了,不再是小孩子的了,都学会了与人好好沟通。
经过我们的讨论与分析统一了我们的意见继续设计,克服困难继续前行。
课程设计这样集体的任务光靠团队里的一个人或几个人是不可能完成好的,合作的原则就是要利益均沾,责任公担。
如果让任务交给一个人,那样既增加了他的压力,也增大了完成任务的风险,降低了工作的效率。
如果能像现在这样,团结的处理好每一个小细节,最后就成功的制作出我们的作品了。
那种喜悦是无法代替的。
总之,通过这次的课程设计我们不仅锻炼到了专业上的东西,也培养了遇到问题如何去处理的能力,让我们受益匪浅。
参考文献
[1] 郭天祥.新概念51单片机C语言教程[M].北京:电子工业出版社,2009.
[2]胡汉才.单片机原理与接口技术[M].北京: 清华大学大学出版社,2004.1-505.
[3] 邢国泉. LM35温度传感器的温度特性及其应用[J]. 医疗设备信息.2007,11,25-28.
[4] 薛国红,赵修斌,卢艳娥等.零漂与增益控制对量化的影响分析[J].西安:空军工程大学,2008.
[5] 马忠梅,刘滨等. 单片机C语言Windows环境编程宝典[M]. 北京: 北京航空航天大学出版社. 2003.
附录1 元器件清单
名称数量诺基亚5110液晶屏 1 Msp430g2553最小系统 1 超声波测距模块SR_04 1 舵机MG995 1 74HC245 DIP 1 轻触开关2杜邦线若干
附录2 调试系统照片
图6
附录3 技术资料
图7
图8
附录4 原理图
图9
附录5 主要程序
主程序
Main.c
#include <msp430g2553.h>
#include "bianliang.c"
#include "key.c"
#include "PWM.c"
#include "5110.c"
#include "shuzi.c"
#include "hanzi.c"
#include "SR04.c"
void main(void)
{
_EINT();
WDTCTL = WDTPW +WDTHOLD;
BCSCTL2 = SELM_0 + DIVM_0 + DIVS_3;
BCSCTL1 = CALBC1_8MHZ; /* 设置 DCO to 8MHz */ DCOCTL = CALDCO_8MHZ;
SR_Init();
Key_init();
PWMINIT();
LCD5110(); //5110 初始设置
LCD_begin(); //LCD初始化以及清屏
LCD_write_hanzi(0,0,0); // 显示文字:距离
LCD_write_hanzi(2,0,1);
LCD_write_hanzi(12,0,2);
LCD_write_hanzi(0,2,3); // 显示文字:角度
LCD_write_hanzi(2,2,4);
LCD_write_shu(8,2,14);
LCD_write_shu(4,0,11); //:
LCD_write_shu(4,2,11); //:
LCD_write_shu(6,0,10); //.
LCD_write_hanzi(2,4,5); // 显示文字
LCD_write_hanzi(6,4,8);
LCD_write_hanzi(10,4,10);
while(1)
{
SR_Start(); //发出超声波
s=(int)(TA_CCR0*1.68); //计算距离
mv=s/10000;
mw=s%10000/1000;
mx=s%1000/100;
my=s%100/10;
mz=s%10;
LCD_write_shu(5,0,mv); //显示距离
LCD_write_shu(7,0,mw);
LCD_write_shu(8,0,mx);
LCD_write_shu(9,0,my);
LCD_write_shu(5,2,jw);
LCD_write_shu(6,2,jx);
LCD_write_shu(7,2,jy);
delay_ms(100);
}
}
#pragma vector = PORT2_VECTOR //P2口中断向量声明
__interrupt void Key_interrput(void)
{ key_judge(); }
#pragma vector =TIMER0_A0_VECTOR
__interrupt void TimerA0Int(void) //TimerB CCRO捕捉中断服务程序{
if(TACCTL0&CM_1) //是上升沿捕捉
{
TA0_CCR0=TACCR0; //保存TBCCR0的值
TACCTL0&=~CM_1; //清除上升沿捕捉
TACCTL0|=CM_2; //设置下降沿捕捉
TACTL|=MC_2; //开始TimerA计数,模式为连续计数}
else //是下降沿捕捉
{
TA1_CCR0=TACCR0;
TACCTL0&=~CM_2; //清除下降沿沿捕捉
TACCTL0|=CM_1; //设置为上升沿捕捉 TACTL|=MC_0; //停止计数直到改变模式后,重新计数 TA_CCR0=TA1_CCR0-TA0_CCR0;
SR_Flag=1;
}
}
子程序
PWM.C
void PWMINIT()
{
P2SEL |= BIT2; //P1.6选为模块功能
P2DIR |= BIT2; //方向输出
TA1CCTL1=OUTMOD_7; //选择输出模式复位/置位TA1CTL |= TASSEL_2 + MC_1; //时钟源选择
TA1CCR0=22000; //计数周期
TA1CCR1=600; //占空比数值
jiaodu=TA1CCR1-600;
jiaodu=jiaodu/9.2;
jiao=(int)jiaodu;
jw=jiao/100;
jx=jiao%100/10;
jy=jiao%10;
}
Key.c
#include"bianliang.c"
void Key_init(void)
{
P2REN |=BIT5+BIT4; //打开上拉,电路板上没有上拉电阻,触发边沿是从高电平到低电平
P2IES |= BIT5+BIT4; //选择触发边沿,下降沿触发
P2IE |= BIT5+BIT4; //打开P2的中断
P2IFG &= 0x00;
_EINT();
}
void key_judge()
{
unsigned int i;
for(i=0;i<12000;i++); //消抖
switch(P2IFG) //判断
{
case 0x10:TA1CCR1+=50;
if(TA1CCR1>2300)
TA1CCR1=2300;
break;
case 0x20:TA1CCR1-=50;
if(TA1CCR1<600)
TA1CCR1=600;
break;
}
P2IFG &= 0x00;
P2REN |= BIT5+BIT4;
jiaodu=TA1CCR1-600;
jiaodu=jiaodu/9.2;
jiao=(int)jiaodu;
jw=jiao/100;
jx=jiao%100/10;
jy=jiao%10;
}
SR04.C
#define Trig_H P1OUT|=BIT0 //端口P2.0输出高电平
#define Trig_L P1OUT&=~BIT0 //端口P2.0输出低电平
#define CPU (8000000)
#define delay_us(x) (__delay_cycles((double)x*CPU/1000000.0)) #define delay_ms(x) (__delay_cycles((double)x*CPU/1000.0))
#define dely_s(x) (__delay_cycles((double)x*CPU/1.0))
void SR_DelayNus(unsigned int n)
{ unsigned int i;
for(i=0;i<n;i++)
delay_us(1); }
void SR_Start() //发送启动信号
{
Trig_L;
SR_DelayNus(20);
Trig_H;
SR_DelayNus(20); //延时20us,至少10us;
Trig_L; }
void SR_Init() //初始化端口和定时器B
{
Trig_L;
P1DIR|=BIT0; //设置P2.4为输出口
P1DIR&=~BIT1; //P1的管脚为输入
P1SEL|=BIT1; //CCI0A输入
TA0CTL |=TASSEL_2+ID_0+MC_2+TACLR; //选择SMCLK为定时器时钟,不分频,连续计数方式。
TACCTL0 |=CM_1+CCIS_0+SCS+CAP+CCIE;//上升沿捕获,同步方式,捕获方式,允许捕获中断。
_EINT(); //使能GIE
}。