首页->【玩CortexM0】

20 0

实验十三 LPC824采用HD-SR04超声波传感器模块测距

实验如题,网传和下载资料,看手册,这款模块控制和应用非常简单,一共4个引脚:+V、GND、Trig、Echo。工作原理:外部用不小于10uS的高电平触发一下Trig,模块将自动发出超声波脉冲N个,同时Echo输出高电平;当接收到返回的超声波脉冲时,Echo高电平截止,单片机只需要开一个接收口检测此高电平的时长,就可以计算出来距离。

电源可以在3~5V,LPC824工作在3.3V,Ok,没有问题。以前做过IO口发出脉冲实验,稍稍改一下,作为Trig触发信号。以前做过中断接收脉冲检测实验,就用上沿触发来检测Echo高电平的时长。编程很简单,因为以前都做过,此处仅仅是拿来主义。

测试高电平时长需要一个时钟,打开timer.h。timer.h中有mS、uS,因为声波速度接近340m/s,实际上测距不会超过2米,因此距离脉宽不会超过2mS,以uS来计时应该有富裕,从网上看到的精简公式为:

测得的时间/57~59=距离米,需要精确到CM,再做换算。

打开Timer.h,查看实例,需要创建一个时钟对象,一个时间测量函数和3个变量。

首先在对象类定义区再加一个时间对象timer:

Timer timer;

接着在变量定义区定义一些变量来存放开始时间,结束时间,以及两个时间的差,加到变量定义区:

float dist,begin,end;

用浮点数是为了得到小数点后的数据——CM厘米。

原来的P0_27产生脉冲为50%的,现在需要改成10uS正脉冲触发超声波模块:

void tipInt(void){plus27=1;wait(0.000010f);plus27=0;}

以前的plusIn中断函数的P0_28我们将他改一下:

void PlusIn28(void){

 timer.start();

 begin=timer.read_us();

 while(plusIn28){;};

 end=timer.read_us();

 dist=(end-begin)/57;

}

dist=(end-begin)/57;公式中的57是网上查的修正系数,实际取值可在56~59之间,本例取57,精度还可以。

最后在显示屏适当位置设置dist,和测距得到的数值显示出来就可以了。

实际测试,超过100CM就无法测试了,小于2CM,显示值就开始增加了。因此实际测试距离在2~100CM,如果换成5V电源,应该能超过1米或更多。

此测试由P0_27中断发出脉冲,因此不需要在主程序循环中写语句。

结果见照片图D1~D4,fenbie shi 5,10,20,90CM多测距显示图。


楼主可见