当前位置:首页 > 公众号精选 > 程序员小哈
[导读]HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm; 模块包括超声波发射器、接收器与控制电路。 在智能小车的测距、避障,盲人拐杖,视力保护器(坐姿矫正),倒车雷达等应用中时常使用。 工作原理 HC-SR04基本工作原理: 使用

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm;

模块包括超声波发射器、接收器与控制电路。

在智能小车的测距、避障,盲人拐杖,视力保护器(坐姿矫正),倒车雷达等应用中时常使用。

工作原理

HC-SR04基本工作原理:

  1. 使用单片机的一个引脚发送一个至少10us高电平的TTL脉冲信号到模块的Trig引脚,用于触发模块工作。

  2. 模块检测到触发信号之后,会自动发送8个40khz的方波,然后自动切换至监测模式,监测是否有信号返回(超声波信号遇障碍物会返回)。

  3. 如果有信号返回,通过模块的Echo引脚会输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。

  4. 因为声音在空气中的速度为340米/秒,即可计算出所测的距离。

代码实现

通过上面的分析,我们知道,获得超声波模块测得的距离的难点就是求得Echo引脚输出脉冲的高电平持续时间。

实现步骤:

  1. 初始化Trig引脚PA2为输出模式,Echo引脚PA3为浮空输入模式;
    初始化TIM4为1ms的定时器,msHcCount变量用于记录定时器中断次数。
//文件"sr04.h"中添加定义extern u32 msHcCount;
//超声波硬件接口定义#define HCSR04_PORT GPIOA#define HCSR04_CLK RCC_APB2Periph_GPIOA#define HCSR04_TRIG GPIO_Pin_2#define HCSR04_ECHO GPIO_Pin_3
#define TRIG_Send PAout(2)#define ECHO_Reci GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
//文件"sr04.c"中void Hcsr04Init(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG); GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_DeInit(TIM4); TIM_TimeBaseStructure.TIM_Period = (1000-1); TIM_TimeBaseStructure.TIM_Prescaler =(72-1); TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); Hcsr04_NVIC(); TIM_Cmd(TIM4,DISABLE); }


  1. 测量距离,下面代码实现的是五次测量取平均值作为最终的结果。
    单次距离测量的方法采用了两种实现方式:定时器方式和延时函数的方式。

  • 定时器方式,通过定时器4计数器值计算距离

当ECHO_Reci引脚的输入电平由低变高时:即while(ECHO_Reci == 0); 循环为假时开始计时:OpenTimerForHc();

当ECHO_Reci引脚的输入电平由高变低时,即while(ECHO_Reci == 1); 循环为假时结束计时:CloseTimerForHc();

计时结束,调用GetEchoTimer(void)函数计算总耗时,单位us。

u32 GetEchoTimer(void){ u32 t = 0; t = msHcCount*1000; t += TIM_GetCounter(TIM4); TIM4->CNT = 0;  delay_ms(50); return t;}

通过定时器4计数器值计算距离的具体实现代码如下所示:

float Hcsr04GetLength(void ){ u32 t = 0; int i = 0; float lengthTemp = 0; float sum = 0; while(i<5) { TRIG_Send = 1;  delay_us(20); TRIG_Send = 0; while(ECHO_Reci == 0);  OpenTimerForHc();  i = i + 1; while(ECHO_Reci == 1); CloseTimerForHc();  t = GetEchoTimer();   lengthTemp = ((float)t/58.0);  sum = lengthTemp + sum ;  }  lengthTemp = sum/5.0; return lengthTemp;}
  • 延时函数方式计算距离

也是取五次测量值的平均值作为结果,在计算Echo引脚输出高电平时间的时候,只要while(ECHO_Reci)为真,计时即+10us,直至高电平结束,即可获得高电平持续的总时间。

测试结果部分可以看出此方法误差较大,大家可以想想,问题出在哪里?

void HCSR04_Ranging(float *p){ u8 i=0; u32 j=0; float HCSR04_Temp = 0.0;  for(i=0;i<5;i++) { TRIG_Send=1; delay_us(40); TRIG_Send=0; while(!ECHO_Reci); while(ECHO_Reci) { delay_us(10); j++; } HCSR04_Temp+=j*10; //模块最大可测距4m  j=0; delay_ms(60);//防止发射信号对回响信号的影响 }
*p= HCSR04_Temp/5/58.0; }

注意:文中多次使用类似while循环:while(ECHO_Reci),其实这样做容易让单片机陷入死循环,各位可以试着想想有没有好的方式避免。

距离换算

查看手册,我们会看到,手册上说:

测量距离(cm) = 高电平持续的us数 / 58

为什么us值/58即是以cm为单位的距离值呢?

正常的换算公式为:

测试距离 = (高电平时间*声速(340m/s))/2

除以2的原因是,超声波的信号是往返的耗时等于高电平时间,我们求距离,需要除以2。

上面的测量距离单位为m,高电平时间为s, 如果我们把测量距离的单位换为cm,高电平时间改为us, 则上面的公式就修改为:

测量距离cm = (高电平时间us/1000000) * 340 / 2 * 100

即测量距离cm = 高电平时间us * 17 / 1000;

即测量距离cm = 高电平时间us / (1000/17);而1000/17 ≈ 58.82

所以一般为了方便计算,距离换算就是将求得的高电平时间除以58,即得距离值,单位cm。

硬件连接


目前HC-SR04这个模块有很多版本,最好选用3.3V和5V兼容的版本。


我也拿了一个5V的老版本做了一下测试,使用3.3V供电,测量的数据不对,什么也不改变的情况下,将电源引脚供电改为5V供电,返回的数据就正常了。

如果使用5V老版本的HC-SR04模块,为了使系统能够稳定,最好选用5V耐受的IO引脚,诸如带有下面FT标识的引脚。


实际效果图

下面硬件使用的STM32核心板为我们“2020.06每月一练的核心板,需要资料的可以后台回复“每月一练”获取。

测试结果

分别将HC-SR04放置于障碍物前30cm、20cm、10cm处各测量两次,具体数据如下所示:

通过上面我们可以看出,定时器的方式的准确度明显高于延时函数的实现方式,自己分析一下,为什么延时函数的方式误差会差这么多呢?

当然这里面的误差还包括我摆放的原因导致的误差。

资料获取

微信公众号后台回复“SR04”,可以下载超声波测距原理及实现网文对应的工程源码。

尾语

在找回新号之后,就面临着两个选择,是选择更好的交流体验,选择带有留言功能的新号呢?还是为了辛辛苦苦积攒的读者,将就使用「程序员小哈」那个老号呢?

舍弃意味着从新开始,舍弃意味着读者的数量也一并清零,犹豫再三,为了成为一个有灵魂的公众号,还是选择了有留言功能的新号。

我相信,大家经过一段时间与我的相处,大概知道我的为人,我相信在各位朋友的帮助下,我们的读者数量很快就会超越老号,整体更进一步的。

希望各位新老朋友能帮忙宣传一下,让我们的公众号越来越好,让我有更多的热情能够写出好的文章分享给大家。

程序员小哈这个公众号也运营一段时间了,对其很有感情,也不想荒废了。

未来两个公众号的定位:

程序员小哈」:分享嵌入式、物联网相关领域精彩文章,分享圈内人员的经验心得,我会认真筛选每一次的分享,希望各位能够从中受益;

嵌入式从0到1」:坚持原创,每周2~3篇技术分享,每月DIY一个的小项目,大家一起玩,一起进步,带你走进嵌入式工程师的大门。

希望你能两个都关注一段时间,观察一段时间,如果你感觉没有收获,随时取关,感谢你的支持!


PS:咱们的公众号也有留言功能了,大家可以畅所欲言了^_^


新公众号「嵌入式从0到1」,长按关注一波哈。



免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭