任务59超声波测距0Word格式.docx

上传人:b****6 文档编号:8402559 上传时间:2023-05-11 格式:DOCX 页数:4 大小:20.93KB
下载 相关 举报
任务59超声波测距0Word格式.docx_第1页
第1页 / 共4页
任务59超声波测距0Word格式.docx_第2页
第2页 / 共4页
任务59超声波测距0Word格式.docx_第3页
第3页 / 共4页
任务59超声波测距0Word格式.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

任务59超声波测距0Word格式.docx

《任务59超声波测距0Word格式.docx》由会员分享,可在线阅读,更多相关《任务59超声波测距0Word格式.docx(4页珍藏版)》请在冰点文库上搜索。

任务59超声波测距0Word格式.docx

需要注意

(2)脉冲信号功率放大电路超声波测距的大小根发射功率的大小有直接的关系。

常用的功率放大电路有三种;

非门的是,在超声波测距中,40KHz的脉冲信号不需要一直发送,发送4-10个脉冲即可。

驱动(74HC04或CD4069),电荷泵芯片(MAX232)驱动,中周变压器驱动。

这三种方式本质是一致的,都是提高脉冲信号的电压来增大发射的功率。

-2-5.9超声波测距5.9.3由非门74LS04构成的驱动电路在图5.9.3中,U1C和U1D并联输出信号加载到超声波的一个引脚,其输出电平和输入电平反相,U1E和U1F的输出信号并联后加载到超声波的另一个引脚,其输出电平和输入电平同相,超声波探头得到了2倍的VCC,从而提高了发射功率,测量的距离变远。

②电荷泵芯片(max232)驱动MAX232芯片是为串口通信设计的芯片,它的内部有电荷泵,能实现TTL电平和RS232电①非门驱动平的互相转换(TTL电平:

5V逻辑正,0V逻辑负;

RS232电平:

+12V为逻辑正,-12V为逻辑负)。

图5.9.4是MAX232驱动超声波的电路图,T1IN和T2IN接收单片机输出的TTL电平,经过MAX232升压后,转化成RS232电平,然后驱动超声波发射探头。

图5.9.4MAX232驱动电路-3-5.9超声波测距③中周变压器驱动将40KHz脉冲信号通过中周变压器升压,也可以提高超声波的发射功率。

40KHz脉冲接变压器的低压端,超声波探头接高压端,变压器要选用中频变压器。

4、超声波接收电路简介超声波接收探头接收到40KHz的超声波后,将机械能转换为电信号,在接收端会感应出40KHz的电压波形。

由于信号微弱,且易受其他信号的干扰,所以接收端的电路包括信号的放大、滤波和整形。

常见的接收电路专用接收芯片和分立元件搭建的接收电路①专用接收芯片(CX21016)CX20106是SONY公司生产的红外接收专用芯片,由于红外载波频率和超声波40KHz频率非常接近,所以可以用它做作为超声波接收电路。

当超声波接收头受到发射信号时,通过CX20106进行前置放大、限幅放大、带通滤波、峰值检波和比较、施密特触发,便可得到处理后的信号。

7脚为信号输出口,没有信号时为高电平,收到后变为低电平,之后又恢复高电平。

②分立原件构建的接收电路利用集成运放,将超声波放大,并设计40KHz的带通滤波器,然后再经过整形电路就可以得到TTL电平的输出信号。

5、HC-SR04超声波测距模块的特点HC-SR04超声波测距模块是淘宝上热卖的一个超声波测距成品模块,测距的范围为2cm-4m,测量精度为3mm,体积小、价格便宜,省去了硬件制作的麻烦,特别适合初学者使用。

图5.9.5是HC-SR04模块的外观和接口。

图5.9.5HC-SR04超声波测距模块实物图和接口。

-4-5.9超声波测距HC-SR04模块体积较小,45*20*15mm。

模块的正面是发射探头和接收探头,背面是由3个集成IC构成的发射和接收电路。

模块接口简单,除了电源和地外,一个引脚是触发信号输入端,另外一个引脚是回响信号输出端。

图5.9.6是其时序图。

图5.9.6HC-SR04模块时序图通过时序图,我们看到HC-SR04模块使用非常简单:

只需要在Trig端加入一个10us以上的脉冲触发信号,模块就会自动产生8个40KHz的周期电平,并自动检测回波,一旦检测到回波,则在Echo端输出回响信号,回向信号的脉冲宽度与所测量的举例成正比。

40KHz脉冲信号的产生和回波信号的检测都是由模块内部电路来完成的,那么模块是怎么做到这些呢?

图5.9.7HC-SR04超声波测距模块的电路图。

简单分析一下HC-SR04模块的原理图,发射信号的功率驱动由电荷泵芯片MAX232来完成,接收信号由经过4合1运放TL074完成放大、带通滤波和整形,这和我们之前介绍的超声波电路基本一致。

不同的地方在于HC-SR04模块中加入了一片单片机(STC11),Trig引脚接STC11单片机的P5.0引脚,Trig端输出一个10us以上的脉冲触发信号,STC11单片机的P5.1引脚和P5.2引脚输出极性相反的8个40KHz的周期性电平,并通过MAX232提升电压后送到发送探头。

回波信号的检测也是由STC11来完成,检测到回波后,STC11在P6.7引脚输出回响应信号,回响信号的脉冲宽度与测量距离成正比。

51单片机完成HC-SR04的测距流程:

(1)51单片机向模块触发输入端发送一个10us以上的高电平,然后等待模块的回响输出端变成高电平。

(2)检测到回响输出端变成高电平后,单片机立即开定时器计时,当回向输出端变为低电平时停止计时,读取定时器的值,记录的时间为超声波从发射到接收的时间。

-5-5.9超声波测距(3)从超声波探头到被测物体的距离=(高电平时间*声速(340M/S))/2。

测距时,被测物体的面积不少于0.5平方米且要尽量平整,超声波探头与被测物体的角度尽量垂直。

图5.9.7HC-SR04超声波测距模块的电路图5.9.3任务实施HC-SR04模块厂家配套程序是演示版,不适合嵌入到多任务系统中。

状态机+定时器测脉宽的方法,测量精度高,不过多占用CPU,可移植性好。

1、接口定义:

4位数码管:

段选:

P0,位选,P1。

1、2、超声波模块:

触发端(Trig):

P2.0;

回响端(Echo):

P3.2。

-6-5.9超声波测距2、工程结构图和主程序

(1)工程结构图测距程序的工程结构图如图5.9.10所示5.9.10工程结构图除了主函数,其它任务模块包含数码管显示模块和距离测量模块。

(2)主函数(main.c)程序如下:

#includelt;

reg52.hgt;

#includeMicroDefine.h#includeSeg7Display.h#includeDistanceMeasure.hsbitled=P2_;

/****************************************************************************函数名称:

main()*功能:

主函数*入口参数:

无*出口参数:

无*说明:

***************************************************************************/voidmain(){DelayMs(200);

TimerInit();

//定时器初始化while

(1){-7-5.9超声波测距if(FlagSystem1Ms==1){led=0;

FlagSystem1Ms=0;

Seg7Display();

//数码管显示DistanceToBufffer();

//缓冲区更新SonicMeasureDistance();

//超声波测距led=1;

}}}程序解释:

主程序内容比较简单,在完成定时器的初始化后,间隔1ms,数码管扫描,刷新一次显示缓冲区,并执行超声波测距任务。

3、其它功能模块

(1)数码管显示模块(Seg7Display.c)4位数码管显示,第1位数码管加小数点,程序略。

(2)距离测量模块(DistanceMeasure.c)DistanceMeasure.h:

#ifndef_DISTANCEMEASURE_H_#define_DISTANCEMEASURE_H_#includelt;

intrins.hgt;

#includeMicroDefine.h#includeSeg7Display.hsbitSonicTrig=P2_;

//Trig触发端接口#defineSonicTrigSetSonicTrig=1#defineSonicTrigResetSonicTrig=0//10us宏定义#defineDelay10Us{_nop_();

_nop_();

\_nop_();

}//变量声明externbitFlagSystem1Ms;

//时标信号-8-5.9超声波测距//函数声明externvoidTimerInit();

//定时器初始化externvoidDistanceToBufffer();

//缓冲区更新externvoidSonicMeasureDistance();

//超声波测距#endifDistanceMeasure.c:

#includeDistanceMeasure.hbitFlagSystem1Ms=0;

//时标信号bitFlagCaptureOk=0;

bitMeasureOk=0;

//测量成功标志位uintPulseWidth=0;

//脉冲宽度uintDistance=0;

//测量距离/****************************************************************************函数名称:

TimerInit()*功能:

定时器初始化*入口参数:

定时器0,测量脉宽;

定时器1,1ms时标信号***************************************************************************/voidTimerInit(){TMOD=0x29;

//定时器0:

0b1001;

定时器1:

0b0010。

TH0=TL0=0;

//定时器0初值为0TH1=TL1=56;

//定时器1初值为0IT0=1;

//中断0下降沿触发EX0=1;

//开外中断0ET1=1;

//开定时器1中断EA=1;

//开总中断TR0=TR1=1;

//开定时器0和定时器1}/****************************************************************************函数名称:

Intr0Init()*功能:

外部中断0中断服务函数*入口参数:

无***************************************************************************/-9-5.9超声波测距voidIntr0Isr(void)interrupt0{PulseWidth=TH0*256+TL0;

//计算脉冲宽度TH0=TL0=0;

//为下一次测量做准备FlagCaptureOk=1;

//捕获成功标志位置1}/****************************************************************************函数名称:

Timer1Init()*功能:

定时器1中断服务函数*入口参数:

产生1ms时标信号***************************************************************************/voidTimer1Isr(void)interrupt3{staticucharCnt200us=0;

if(++Cnt200usgt;

=5)//1ms时标信号到{Cnt200us=0;

FlagSystem1Ms=1;

}}/****************************************************************************函数名称:

DistanceToBufffer()*功能:

更新缓冲区*入口参数:

MeasureOk=1,测量成功,向缓冲区送测量的距离MeasureOk=0;

测量不成功,向缓冲区送---***************************************************************************/voidDistanceToBufffer(){if(MeasureOk==1)//测距成功{DispBuffer[0]=Distance/100;

DispBuffer[1]=Distance%100/10;

DispBuffer[2]=Distance%10;

-10-5.9超声波测距}else//在100ms内,没有完成测距{DispBuffer[0]=10;

DispBuffer[1]=10;

DispBuffer[2]=10;

SonicMeasureDistance()*功能:

距离测量*入口参数:

状态机,1ms时标信号驱动。

完成需100ms,即1秒之内测量10次状态0(1ms):

发送超声波触发信号状态1(99ms):

根据测量的脉宽计算测量距离***************************************************************************/voidSonicMeasureDistance(){staticucharMeasureState=0;

//状态机staticucharCnt1Ms=0;

//1ms计数变量switch(MeasureState){case0:

//状态0,发送10us高电平触发信号{//HC-SR04开始测距SonicTrigSet;

Delay10UsSonicTrigReset;

MeasureState=1;

//发送完后,转到状态1}break;

case1:

//状态1,99ms后,根据捕获的结果球距离{if(++Cnt1Msgt;

=99){Cnt1Ms=0;

if(FlagCaptureOk==1)//捕获成功,则计算测量距离,{//测量成功标志位置1-11-5.9超声波测距FlagCaptureOk=0;

Distance=PulseWidth*34/(1000*2);

MeasureOk=1;

}else//捕获不成功,测量成功标志位置0MeasureOk=0;

MeasureState=0;

//转到状态0,继续测量}}break;

}}程序解释:

①测距程序中,分2个部分。

第1部分:

定时器配合外中断测量超声波回响信号的高电平脉宽;

第2部分:

基于状态机的距离测量。

②程序中用到了2个定时器。

定时器1产生1ms时标信号供给主函数使用,方式2。

定时器0配合外部中断0,测量回响信号的高电平宽度。

定时器0中的GATE门置1,方式1,初值为0。

当回响信号的高电平到来时,定时器0开始计时,回向信号高电平结束,定时器0停止计时,并触发外部中断0的中断服务函数。

在外部中断0服务函数中,计算定时器0的计时值作为测量脉宽,置位测量成功标志位(FlagCapture=1),并清零定时器0的初值,为下一次测量做好准备。

③主函数间隔1ms扫描SonicMeasureDistance()函数。

函数以状态机构建,共有2个状态。

状态0:

发送10us的高电平触发信号给HC-SR04模块,HC-SR04接收到高电平触发信号后,连续发送8个40KHz脉冲给超声波发射探头。

需要注意的是程序中的10us延时,_nop_()是汇编指令,12晶振下,1个_nop_()是1us,程序中通过宏定义,连续定义了10个_nop_()的延时,即10us。

另外使用_nop_()指令,头文件中需包含intrins.h头文件。

状态0任务完成后,将状态机变量指向下状态1,下一个1ms,进入状态机1。

状态机1:

当计数变量Cnt1Ms连续计数99次后(99ms后),本次测距结束(测距时间==1ms+99ms=100ms)。

如果回响信号测量成功(FlagCaptureOk=1),将脉宽转换成测量距离,并将测量成功标志位置位(MeasureOk=1)。

如果在本次测量中,没有回响信号,则测量成功标志位清零(MeasureOk=0)。

在DistanceToBufffer()中,根据MeasureOk标志位,刷新缓冲区。

如果MeasureOk=1,向缓冲区送入4位测量距离值,如果MeasureOk=0,向缓冲区送入----。

-12-5.9超声波测距超声波速度340米/秒=0.034厘米/微秒,根据脉宽计算的距离=PulseWidth0.034厘米,这个距离是超声波探头和被测物体来回的距离,所以实际距离还需要再除2。

0.034为浮点数,程序中,分子乘以1000,分母也乘以1000。

-13-

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2