> 技术文档 > HC-SR04超声波传感器详解(STM32)_hcsr04超声波传感器

HC-SR04超声波传感器详解(STM32)_hcsr04超声波传感器

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

3.工作原理介绍

三、程序设计

main.c文件

ultrasonic.h文件

ultrasonic.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        HC-SR04超声波传感器是通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离的一种传感器模块。与蝙蝠寻找猎物的回声定位基本原理相同,可以广泛应用于无损测量、水文液位测量、工业场地等地方。

以下是超声波传感器的参数:

型号

HC-SR04

工作电压

DC 5V

工作电流

3.3mA

工作温度

-40~85

输出方式

GPIO

探测距离

2cm~600cm

探测精度

3mm

哔哩哔哩视频链接:

HC-SR04超声波传感器详解(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

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

2.引脚描述

引脚名称

描述

VCC

供给电压DC 5V

GND

地线

TRIG

触发控制信号输入

ECHO

回响信号输出

3.工作原理介绍

    传感器发射器向某一个确定的方向发射超声波的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为 t。根据速度距离公式,结合超声波的传播速度与时间 t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2

1. 采用 IO TRIG 触发测距,给最少 10us 的高电平 2. 模块自动发送 8 40khz 的方波,自动检测是否有信号返回 3. 有信号返回,通过 IO ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离 =( 高电平时间*声速 (343M/S))/2; distance_cm= us)/58

注意:测量周期应为60ms以上,以防止发射信号对回响信号的影响,被测物体的面积应不小于0.5平方米且尽量要求平整,否则影响结果

三、程序设计

1.使用STM32F103C8T6读取HC-SR04超声波传感器采集的距离数据,通过串口发送至电脑

2.将读取得到距离信息数据同时在OLED上显示

TRIG

PA0

ECHO

PA1

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

main.c文件

#include \"stm32f10x.h\"#include \"led.h\"#include \"usart.h\"#include \"delay.h\"#include \"oled.h\"#include \"ultrasonic.h\"#include \"timer.h\"/*****************辰哥单片机设计******************STM32 * 项目:HC-SR04超声波传感器实验* 版本: V1.0 * 日期: 2024.8.27 * MCU:STM32F103C8T6 * 接口:参看ultrasonic.h * BILIBILI :辰哥单片机设计 * CSDN:辰哥单片机设计 * 作者:辰哥 **********************BEGIN***********************/float distance;int main(void){ SystemInit();//配置系统时钟为72Mdelay_init(72);LED_Init();LED_On();Ultrasonic_Init();USART1_Config();//串口初始化OLED_Init();printf(\"Start \\n\");delay_ms(1000);OLED_Clear();//显示“距离:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChar(32,0,\':\',16,1);OLED_ShowString(60,20,\"cm\",16,1); while (1) {LED_Toggle();distance = UltrasonicGetLength();OLED_ShowNum(40,20,distance,2,16,1);delay_ms(50);//延时50ms }}

ultrasonic.h文件

#ifndef __ULTRASONIC_H#define__ULTRASONIC_H#include \"stm32f10x.h\"#include \"adcx.h\"#include \"delay.h\"#include \"math.h\"/*****************辰哥单片机设计******************STM32 * 文件:HC-SR04超声波传感器h文件  * 版本: V1.0 * 日期: 2024.8.27 * MCU:STM32F103C8T6 * 接口:见代码 * BILIBILI :辰哥单片机设计 * CSDN:辰哥单片机设计 * 作者:辰哥**********************BEGIN***********************//***************根据自己需求更改****************/// ULTRASONIC GPIO宏定义#defineULTRASONIC_GPIO_CLKRCC_APB2Periph_GPIOA#define ULTRASONIC_GPIO_PORTGPIOA#define ULTRASONIC_TRIG_GPIO_PINGPIO_Pin_0#define ULTRASONIC_ECHO_GPIO_PINGPIO_Pin_1#define TRIG_Send PAout(0)#define ECHO_Reci PAin(1)/*********************END**********************/void Ultrasonic_Init(void);float UltrasonicGetLength(void);void OpenTimerForHc(void);void CloseTimerForHc(void); u32 GetEchoTimer(void);#endif /* __ADC_H */

ultrasonic.c文件

#include \"ultrasonic.h\"#include \"timer.h\"/*****************辰哥单片机设计******************STM32 * 文件:HC-SR04超声波传感器c文件  * 版本: V1.0 * 日期: 2024.8.27 * MCU:STM32F103C8T6 * 接口:见代码 * BILIBILI :辰哥单片机设计 * CSDN:辰哥单片机设计 * 作者:辰哥**********************BEGIN***********************///超声波计数u16 msHcCount;void Ultrasonic_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (ULTRASONIC_GPIO_CLK, ENABLE );// 打开连接 超声波传感器 的单片机引脚端口时钟GPIO_InitStructure.GPIO_Pin = ULTRASONIC_TRIG_GPIO_PIN;// 配置连接 传感器TRIG 的单片机引脚模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 设置为推挽输出GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure);// 初始化 GPIO_InitStructure.GPIO_Pin = ULTRASONIC_ECHO_GPIO_PIN;// 配置连接 传感器ECHO 的单片机引脚模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 设置为浮空输入输入GPIO_Init(ULTRASONIC_GPIO_PORT, &GPIO_InitStructure);// 初始化 TIM4_Int_Init(1000-1,72-1);}//打开定时器4static void OpenTimerForHc() { TIM_SetCounter(TIM4,0); msHcCount = 0; TIM_Cmd(TIM4, ENABLE); }//关闭定时器4static void CloseTimerForHc() { TIM_Cmd(TIM4, DISABLE); }//获取定时器4计数器值u32 GetEchoTimer(void){ u32 t = 0; t = msHcCount*1000; t += TIM_GetCounter(TIM4); TIM4->CNT = 0; delay_ms(50); return t;} //通过定时器4计数器值推算距离float UltrasonicGetLength(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);//cm sum = lengthTemp + sum ; } lengthTemp = sum/5.0; return lengthTemp;}

四、实验效果 

五、资料获取

项目分享