目录标题

  • 1.前言(闲话)
  • 2.HC-SR04模块介绍
  • 3.硬件连接
  • 4.软件代码
  • 5.学习补充
  • 6.效果展示(可以先过来看效果)
  • 7.参考链接
  • 8.完整版代码链接

1.前言(闲话)

众所周知传感器(transducer/sensor)是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。传感器在生活中无处不在,小到温湿度传感器测量温湿度,大到当今最火热的领域——物联网IoT,传感器总是发挥着重要的作用。而学习传感器也尤为重要,特别是在电子设计中。

2.HC-SR04模块介绍

1.简介
HC-SR04模块性能稳定,测度距离精确,模块高精度,盲区小。在日常生活中,以下地方都可应用超声波测距模块:
(1)机器人避障
(2)物体测距
(3)液位检测
(4)公共安防
(5)停车场检测
(6)电子设计中的避障智能车也正是应用到了此模块,才能达到避开障碍的功能。
2.电气参数

电气参数 HC-SR04超声波测距模块
工作电压 DC 5V
工作电流 15mA
工作频率 40Hz
最远射程 4米
最近射程 2厘米
测量角度 15度
输入触发信号 10us的TTL脉冲
输出回响信号 输出与射程成正比的TTL电平信号
规格尺寸 40x20x15mm

3.工作原理
第一步:通过IO口给Trig接口周期不小于10us的脉冲信号。
第二步:HC-SR04接收到单片机发来的脉冲信号后自动发送8个频率为4KHz的方波,自动检测是否有信号返回。
第三步:若有信号返回,则通过Echo接口向单片机相连的IO口发送一个高电平,高电平持续时间就是超声波从发射到返回的总时间
假设高电平持续时间为T,声速为v(一般为340m/s),那么测到的距离S=(T*v)/2
4.换算单位
(1)us / 58 ——>cm
(2)cm / 148 ——>英寸

5.HC-SR04时序图
结合HC-SR04的时序图,其工作原理可以更好地解释。
6.实物图

3.硬件连接

1.VCC —— 5V
2.GND——GND
3.Trig ——PA0(TIM2_CH1)
4.Echo ——PA1(TIM2_CH2)

4.软件代码

hcsr04.h

#ifndef __HCSR04_H
#define __HCSR04_H#include "sys.h"void Hcsr04Init(void);
void TIM2_RQHandler(void);
u32 GetEchoTimer(void);
float Hcsr04GetLength(void);#endif

hcsr04.c

#include "hcsr04.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"#define TRIG_Send  PAout(0)
#define ECHO_Reci  PAin(1)u16 msHcCount = 0;//ms计数/*  对应IO口初始化  */
void Hcsr04Init(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //使能对应RCC时钟//PA0_CH1  TrigGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                //发送电平引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);//PA1_CH2  Echo  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                       //返回电平引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);  GPIO_ResetBits(GPIOA,GPIO_Pin_1);    TIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = (1000-1);                                  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,计数到1000为1msTIM_TimeBaseStructure.TIM_Prescaler =(72-1);                                //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                  //不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                                       //打开定时器更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                 //选择串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     //抢占式中断优先级设置为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            //响应式中断优先级设置为1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //使能中断NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM2,DISABLE);
}static void OpenTimerForHc()        //打开定时器
{TIM_SetCounter(TIM2,0);            //清除计数msHcCount = 0;TIM_Cmd(TIM2, ENABLE);         //使能TIM2外设
}static void CloseTimerForHc()        //关闭定时器
{TIM_Cmd(TIM2, DISABLE);  //使能TIM2外设
}//定时器1中断服务程序
void TIM2_IRQHandler(void)   //TIM2中断
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否{TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIM2更新中断标志 msHcCount++;}
}//获取定时器时间
u32 GetEchoTimer(void)
{u32 t = 0;t = msHcCount*1000;                    //得到ust += TIM_GetCounter(TIM2);  //得到usTIM2->CNT = 0;                      //将TIM2计数寄存器的计数值清零delay_ms(50);return t;
}//一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
//为了消除余震的影响,取五次数据的平均值进行加权滤波。
float Hcsr04GetLength(void)
{u32 t = 0;int i = 0;float lengthTemp = 0;float sum = 0;while(i!=5){TRIG_Send = 1;                        //发送口高电平输出delay_us(20);                                 //20us脉冲TRIG_Send = 0;                             //脉冲发送完成/*等待接收口高电平输出*/while(ECHO_Reci == 0);          OpenTimerForHc();                   //打开定时器i = i + 1;/*等待高电平输出结束*/while(ECHO_Reci == 1);CloseTimerForHc();              //关闭定时器t = GetEchoTimer();             //获取时间,分辨率为1USlengthTemp = ((float)t/58.0);    //cmsum = lengthTemp + sum ;  }lengthTemp = sum/5.0;                   //平均滤波return lengthTemp;
}

main.c

#include "stm32f10x.h"
#include "uart.h"
#include "delay.h"
#include "hcsr04.h"
#include "usart.h"
#include "stdio.h"int main()
{float length = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init();uart_init(115200);printf("串口初始化成功!\r\n");Hcsr04Init();printf("HcSr04初始化成功!\r\n");while(1){length = Hcsr04GetLength();printf("距离为 %f cm\r\n",length);}}

5.学习补充

补充1:利用正点原子官方模板中system中的usart.c文件里面的uart_init函数来进行串口打印距离。

但是注意,如果要想使用printf函数打印数据,必须要加入以下语句(正点原子的模板默认是加入了的),否则将无法打印数据:

//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif

补充2:静态局部函数不需要在头文件中声明
在hcsr04.c中,使用了static void OpenTimerForHc()static void CloseTimerForHc()两个局部函数,这两个局部函数只服务于hcsr04.c该文件,不需要在hcsr04.h中加以声明。
补充3.us/58——>cm换算原理
声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34,300厘米/秒。或者,我们作一下单位换算,34,300除以1,000,000厘米/微秒。即为:0.0343厘米/微秒再换一个角度,1/(0.0343 厘米/微秒)即:29.15 微秒/厘米。这就意味着,每291.5微秒表示10CM的距离1厘米就是29.15微秒。但是发送后到接收到回波,声音走过的是2倍的距离。所以实际距离就是1厘米,对应58.3微秒。实际上整个测距过程是测的发出声波到收到回波的时间,你的程序里的第一个distance实际上是时间us。所以换成距离cm,要除以58。当然除以58.3可能更精确。
该补充的参考链接

6.效果展示(可以先过来看效果)

7.参考链接

[1]百度百科 传感器
[2]博客:us/58——>cm换算原理

8.完整版代码链接

完整版代码下载链接

往期博客:
《OpenMv与Stm32单片机通信》
欢迎大家来访!

传感器系列(一)——超声波测距传感器 HC—SR04模块相关推荐

  1. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  2. 超声波测距传感器模块在畜牧业的应用

    我国现代养殖是一种"高投入.高产出.高效益"的产业.资本密集型和劳动集约化是其基本特征.这种集约化的产业耗费了大量的人力和自然资源,并在某种程度上对环境造成负面影响.如今物联网应用 ...

  3. 超声波测距传感器模HG-C40U工作程序图文详解

    超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离. 超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口 ...

  4. Arduino的光敏传感器和超声波测距传感器测试代码

    光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...

  5. 超声波测距传感器认知

    目录 一.超声波测距传感器认知 二.从零编程实现超声波测距 三.项目--感应开关盖垃圾桶 1.开发步骤 2.感应开关盖垃圾桶代码测试 一.超声波测距传感器认知 超声波测距模块是用来测量距离的一种产品, ...

  6. 【HaaS Python硬件积木】HCSR04超声波测距传感器

    来这里发现更多拿来即用的传感器 HaaS开发框架HaaS积木方案,赋能生态开发者,让您快速找到自己需要的解决方案,硬件主板与外设,以及各种应用组件.https://haas.iot.aliyun.co ...

  7. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  8. Arduino与Processing交互-超声波测距传感器的读取与显示

    公众号:STCode 1-超声波测距传感器简介 超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离. 超声波测距 ...

  9. [博创智联]创新创客智能硬件平台——超声波测距传感器

    [博创智联]创新创客智能硬件平台--超声波测距传感器 准备工作 测试环节 编译驱动和测试代码 加载驱动并执行代码 准备工作 烧录原版系统,供电.连接串口线,配置网络,挂载NFS共享,拷贝超声波测距传感 ...

  10. 树莓派基础实验24:超声波测距传感器实验

    一.介绍    超声波传感器使用超声波来准确检测物体并测量距离.他发出超声波并将它们转换成电信号,主要应用于汽车的倒车雷达.机器人自动避障行走.建筑施工工地以及一些工业现场. 二.组件 ★Raspbe ...

最新文章

  1. Redis 性能问题分析(好文推荐)
  2. Servlet的Filter的使用
  3. SAP BW/4 HANA亮点解析
  4. Linux下快速静态编译Qt以及Qt动态/静态版本共存
  5. 【转】C++ traits技术
  6. 科大星云诗社动态20220110
  7. linux CentOS6.x 修改主机名(Hostname)
  8. boost学习之boost::shared_ptr
  9. spring注解大全
  10. Flutter APP UI Components
  11. favicon.ico 404的问题(title栏前面的图标)
  12. c#期末考试知识点_c#期末考试复习题及答案
  13. 《HTTP权威指南》– 6.代理
  14. 一个桌面系统的微信公众号开发
  15. SLAM学习----使用rplidar运行Hector算法
  16. HTML5 SVG蝴蝶飞舞动画3D效果
  17. Java url链接生成二维码
  18. Dell Inspiron15-7567 拆机插放内存条步骤
  19. 达达php源码,达达房卡麻将二次开发VIP系统学习课程
  20. java中的finalize

热门文章

  1. 对996的一些看法与个人价值实现
  2. Excel小技巧总结,工作中超实用
  3. React-注册事件
  4. 论文章的标题与页面的距离不一样(已解决)章标题设置相同的段前段后间距,但各章段前距不一致
  5. ps基本操作以及常用快捷键
  6. 桌面版whatsapp自动发送实例分析
  7. kindle3使用技巧
  8. 计算机主板CPU接口最多支持,CPU供电接口
  9. 现代控制工程(二)状态方程的解
  10. Golang代码注释规范及goland代码注释模板配置