stm32超声波模块

HC-SR04 超声波测距模块资料

1. HC-SR04 简介

HC-SR04 是一种常见的 超声波测距传感器 ,它通过超声波反射测量物体的距离,广泛应用于 机器人避障、液位测量、物联网设备 等领域。

2. HC-SR04 主要参数
  • 工作电压:5V DC
  • 工作电流:15mA
  • 测量范围:2cm - 400cm
  • 测距精度:±3mm
  • 工作频率:40kHz
  • 探测角度:<15°
  • 接口方式:TTL 信号(Trig 输入,Echo 输出)
3. HC-SR04 引脚说明
引脚 说明
VCC 供电(5V)
Trig 触发信号输入(10µs 高电平启动测量)
Echo 回波信号输出(高电平时间表示距离)
GND 接地
4. HC-SR04 工作原理
  1. 触发信号(Trig) :向 Trig 引脚输入 10µs 高电平,传感器发射超声波。
  2. 超声波传播:超声波遇到障碍物后反射回来。
  3. 回波信号(Echo) :超声波返回后,Echo 引脚输出 高电平,高电平持续时间与物体距离成正比。
  4. 距离计算 : 距离=(高电平持续时间×声速)2距离 = \frac{(高电平持续时间 × 声速)}{2} 空气中的声速:约 343m/s(≈ 0.0343 cm/µs)
5. HC-SR04 连接 STM32

STM32 连接方式(以 STM32F103C8T6 为例):

  • VCC5V
  • GNDGND
  • TrigGPIO 输出引脚(如 PA0)
  • EchoGPIO 输入引脚(如 PA1,需配置为外部中断)
6. STM32 代码示例

初始化 GPIO 和定时器

复制代码
void HC_SR04_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM2, ENABLE);

    // Trig 引脚(PA0)配置为推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // Echo 引脚(PA1)配置为输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

测距函数

复制代码
uint32_t HC_SR04_GetDistance(void) {
    uint32_t time;
    
    // 发送 10µs 触发信号
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
    delay_us(10);
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);

    // 等待 Echo 高电平
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == RESET);
    time = 0;
    
    // 计算高电平持续时间
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == SET) {
        time++;
        delay_us(1);
    }

    // 计算距离(单位:cm)
    return (time * 0.0343) / 2;
}
7. 代码使用
复制代码
int main(void) {
    SystemInit();
    HC_SR04_Init();

    while (1) {
        uint32_t distance = HC_SR04_GetDistance();
        printf("Distance: %d cm\n", distance);
        delay_ms(500);
    }
}

8. 总结

  • HC-SR04 通过 Trig 触发超声波发射 ,然后 Echo 回传信号
  • 通过测量 Echo 高电平时间,计算出距离。
  • STM32 中,可以使用 GPIO+定时器 进行测距。

如果你需要更详细的资料或示例代码,欢迎随时告诉我!

你的之前上传的文件已经过期,无法查看。如果你希望我提供 HC-SR04 超声波测距传感器 的相关资料,我可以直接为你整理一份完整的介绍,包括其 工作原理、接线方法、STM32 驱动代码示例 等内容。


HC-SR04 超声波测距模块资料

1. HC-SR04 简介

HC-SR04 是一种常见的 超声波测距传感器 ,可以用于 非接触式测距 ,广泛应用于 智能车避障、液位检测、机器人导航 等场景。

2. HC-SR04 主要参数

  • 工作电压:5V
  • 静态电流:小于 2mA
  • 测距范围:2cm - 400cm
  • 测距精度:±3mm
  • 测距角度:小于 15°
  • 信号触发:10µs 高电平
  • 回波信号:TTL 电平,高电平时间代表测距值

3. HC-SR04 引脚定义

引脚 说明
VCC 5V 供电
Trig 触发信号输入(TTL 电平,高电平触发)
Echo 回波信号输出(TTL 电平,高电平时间代表距离)
GND 地(0V)

4. HC-SR04 工作原理

  1. 触发信号 :MCU 发送一个 10µs 的高电平 脉冲到 Trig 引脚。
  2. 超声波发射:HC-SR04 发送 8 组 40kHz 的超声波信号。
  3. 回波检测:如果超声波遇到障碍物,则会被反射回来。
  4. 回波信号 :Echo 引脚会输出一个高电平,高电平持续时间等于超声波往返时间
  5. 距离计算 : 距离=高电平时间(μs)×声速(340m/s)2距离 = \frac{高电平时间(μs) \times 声速(340m/s)}{2} 换算公式: 距离(cm)=高电平持续时间(μs)58距离(cm) = \frac{高电平持续时间(μs)}{58}

5. HC-SR04 与 STM32 连接

HC-SR04 通过 Trig 和 Echo 引脚 与 STM32 的 GPIO 端口 连接。

HC-SR04 引脚 STM32 GPIO
VCC (5V) 5V
Trig PA0
Echo PA1
GND GND

6. STM32 驱动 HC-SR04(标准库实现)

(1) GPIO 配置
复制代码
void HC_SR04_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // Trig 触发引脚(输出)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // Echo 回波引脚(输入)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

(2) 发送触发信号
复制代码
void HC_SR04_Trigger(void) {
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
    Delay_us(10); // 保持高电平 10 微秒
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}

(3) 读取回波信号
复制代码
uint32_t HC_SR04_GetEchoTime(void) {
    uint32_t time = 0;

    // 等待 Echo 变高(起始)
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0);

    // 计时开始
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1) {
        time++;
        Delay_us(1); // 微秒级延时
    }

    return time;
}

(4) 计算距离
复制代码
float HC_SR04_GetDistance(void) {
    HC_SR04_Trigger(); // 发送触发信号
    uint32_t time = HC_SR04_GetEchoTime();
    
    // 转换为厘米(1us 对应 0.034cm,往返计算除以2)
    float distance = (time * 0.034) / 2;

    return distance;
}

7. 主函数示例

复制代码
int main(void) {
    SystemInit();
    HC_SR04_GPIO_Init();

    while (1) {
        float distance = HC_SR04_GetDistance();
        printf("Distance: %.2f cm\r\n", distance);
        Delay_ms(500); // 每 500ms 读取一次
    }
}

8. 关键问题与调试

  1. 测量距离始终为 0?
    • 检查 Trig 引脚 是否正确输出 10µs 高电平
    • Echo 引脚是否有 高电平信号,用示波器观察。
  2. 测量距离不稳定?
    • 确保 电源稳定 ,HC-SR04 需要 5V 供电
    • 避免 电磁干扰,远离马达等高功耗设备。

9. 结论

HC-SR04 是一个简单易用的超声波测距模块,适用于 STM32、Arduino、ESP8266 等平台。STM32 通过 GPIO 控制 Trig 触发信号,并读取 Echo 计算测距值。

10 项目:通过HC_SR04超声波传感器测量距离:

1配置GPIO引脚结构体(Tring PB11,Echo PB10)

2配置定时器结构体

3.配置定时器中断结构体

4.开启时钟(定时器,GPIO)

5.Trig引I脚输出高电平(10usl以上), 然后关闭

·6.等待Echo引脚输入高电平开始, 定时器打开....2开启计数器计数

7.等待Echo引脚输入高电平结束, 定时器关闭>停止计数器计数

8.通过计数器的值计算得出超声波测量距离

距离公式:高电平持续时间·声速(340/秒)/2

通过OLED屏反馈数据

复制代码
#include "stm32f10x.h"                  // Device header
#include "hc_sr04.h"
#include  "Delay.h"

uint16_t  Counter;
void hc_sr04_Init()
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4, ENABLE );
	//配置高电平触发引脚Tring引脚(PB11)
	
	GPIO_InitTypeDef   hc_sr04_inisturt;
	 hc_sr04_inisturt.GPIO_Mode =GPIO_Mode_Out_PP;
	 hc_sr04_inisturt.GPIO_Pin =TRIG_PIN ;
	 hc_sr04_inisturt.GPIO_Speed =  GPIO_Speed_50MHz;
	GPIO_Init(TRIG_ECHO_PORT, & hc_sr04_inisturt);
	
	//配置高电平回响Echo引脚(PB10)
	
	 hc_sr04_inisturt.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	 hc_sr04_inisturt.GPIO_Pin =ECHO_PIN ;
	GPIO_Init(TRIG_ECHO_PORT, & hc_sr04_inisturt);
	
	//配置TIM4的结构体
	 TIM_TimeBaseInitTypeDef  hc_sr04_tim_insturt;
	hc_sr04_tim_insturt.TIM_ClockDivision =TIM_CKD_DIV1   ;
	hc_sr04_tim_insturt.TIM_CounterMode =TIM_CounterMode_Up ;
	hc_sr04_tim_insturt.TIM_Period =1000-1;    //产生一次更新事件时间为1s
	hc_sr04_tim_insturt.TIM_Prescaler =72-1;
	hc_sr04_tim_insturt.TIM_RepetitionCounter =0;
	TIM_TimeBaseInit(TIM4,&hc_sr04_tim_insturt);
	TIM_ITConfig(TIM4,TIM_IT_Update, ENABLE );

	
	
	//配置NVIC中断向量嵌套
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitTypeDef   hc_sr04_nvic;
	hc_sr04_nvic.NVIC_IRQChannel = TIM4_IRQn;
	hc_sr04_nvic.NVIC_IRQChannelCmd =ENABLE;
	hc_sr04_nvic.NVIC_IRQChannelPreemptionPriority =0;
	hc_sr04_nvic.NVIC_IRQChannelSubPriority =0;
	NVIC_Init(&hc_sr04_nvic);
	
	
	
}
//打开定时器计时
void Open_tim4()
{
	
	TIM_SetCounter(TIM4, 0);
	Counter =0;
	TIM_Cmd(TIM4, ENABLE );
	
	
}
//关闭定时器计时
void Close_tim4()
{
		TIM_Cmd(TIM4, DISABLE );
	
	
}
//编写关于TIM4的终端服务函数
void TIM4_IRQHandler()
{
	if(TIM_GetITStatus(TIM4, TIM_IT_Update)==SET)
	{
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
		Counter ++;
		
	}
	
}

float  Get_Echo_time()
{
	 uint32_t   t=0;
	t=Counter *1000;
	t+=TIM_GetCounter(TIM4);
	TIM4->CNT =0;
	delay_ms (50);
	return  t ;
	
	
	
}
float  Getlength()
 { 
	 uint32_t i=0;
	 uint32_t  t=0;
	 float Length =0;
	 float sum=0;
	 while(i!=5)
	 {
		 TRIG_High;
		 delay_us(20);
	   TRIG_LOw ;
		  while(ECHO_STATE!=SET) ;
			   Open_tim4();
			   i=i+1;
		  while(ECHO_STATE ==SET);
			 Close_tim4();
		   t=Get_Echo_time ();
		  Length =((float)t*0.017) ;  //cm
		 
	  }
		 sum =Length /5.0;
		 return  sum ;
		 
		 
	}	 
	
uint16_t  num;
float distance;
int main(void){

	  SystemInit ();//配置系统时钟为72Mhz
	  OLED_Init();
	  OLED_ShowString (1,1,"ds:");
	  OLED_ShowString (1,11,"cm");
	  
	
		while(1)
		{
			hc_sr04_Init();
	    distance= Getlength();
			OLED_ShowFloat (1,5,distance );
			delay_ms (50);
			
    }

}

通过串口反馈数据

复制代码
int main(void){

	  SystemInit ();//配置系统时钟为72Mhz
	    Usart_Init();
//	  OLED_Init();
//	  OLED_ShowString (1,1,"ds:");
//	  OLED_ShowString (1,11,"cm");
//	  
//	
		while(1)
		{
//			hc_sr04_Init();
	    distance= Getlength();
		USART_SendData(USART1, distance);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC));
		USART_ClearFlag(USART1,USART_FLAG_TC);
相关推荐
-Springer-19 分钟前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
LS_learner38 分钟前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天1 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT2 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠2 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠13 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200515 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT16 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen17 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制