一、基本概述
HC-SR04 是一款低成本、高精度的超声波测距模块,广泛应用于机器人避障、无人机导航、智能设备距离检测等场景。其核心原理是通过发射超声波并接收反射回波,计算信号往返时间来确定目标物体的距离。

二、硬件结构与引脚定义
1. 模块外观
- 4个引脚:VCC、TRIG(触发)、ECHO(回声)、GND。
- 超声波探头:左侧为发射探头(TX),右侧为接收探头(RX),中间可能有状态指示灯(部分版本)。
2. 引脚功能
引脚名称 | 功能描述 | 电压/信号类型 |
---|
VCC | 电源输入,通常接5V(部分模块支持3.3V,但需确认规格,5V为标准) | 直流5V |
TRIG | 触发信号输入,输入至少10μs的高电平脉冲以启动测距 | 数字信号(0-5V) |
ECHO | 回声信号输出,高电平持续时间对应超声波往返时间 | 数字信号(0-5V) |
GND | 接地引脚 | - |
三、电气参数
参数 | 数值范围 | 说明 |
---|
工作电压 | 5V DC | 典型值,部分兼容3.3V(需确认模块设计,避免损坏) |
工作电流 | 15mA(待机)~20mA(工作) | 低功耗,适合电池供电设备 |
测距范围 | 2cm400cm(约0.79英寸157英寸) | 最小盲区约2cm,最大距离受限于超声波能量衰减 |
测距精度 | ±3mm | 理想环境下的典型精度,实际受环境影响可能波动 |
工作频率 | 40kHz | 超声波发射频率(与探头匹配) |
响应时间 | 最短触发间隔≥50ms | 两次测距间隔需足够,避免信号重叠 |
四、工作原理与测距公式
1. 核心流程
- 触发阶段:向TRIG引脚输入≥10μs的高电平脉冲,模块内部发射电路触发,发射8个40kHz的超声波脉冲。
- 等待回波:发射同时,ECHO引脚由低电平变为高电平,等待接收探头检测到反射回波。
- 回波接收:接收到回波后,ECHO引脚变为低电平,高电平持续时间 ( t ) 即为超声波往返时间。
- 距离计算:根据声速 (
v
v
v) 和时间 (
t
t
t),计算距离

(除以2是因为时间包含往返路程)。
2. 声速与温度补偿

五、使用步骤(以STM32为例)
1. 硬件连接
HC-SR04引脚 | Arduino引脚 |
---|
VCC | 5V |
GND | GND |
TRIG | PA2(可自定义) |
ECHO | PA3(可自定义) |
实现流程:
- 初始化部分:在
main
函数中,我们首先初始化HAL库,然后使能GPIOA的时钟。接着,我们配置TRIG_PIN
为输出模式,ECHO_PIN
为输入模式。 - 发送触发信号:在
measureDistance
函数中,我们使用HAL_GPIO_WritePin
函数来控制TRIG_PIN
的电平,通过HAL_Delay_us
函数实现微秒级的延时。 - 测量ECHO高电平时间:我们使用
HAL_GetTick
函数来获取当前的系统时间,通过不断读取ECHO_PIN
的电平状态,计算高电平的持续时间。如果超时,函数将返回0。 - 计算距离:根据高电平持续时间和简化的声速公式,计算出距离。
代码示例
#include "stm32xxxx_hal.h"
#define TRIG_PIN GPIO_PIN_0
#define TRIG_PORT GPIOA
#define ECHO_PIN GPIO_PIN_1
#define ECHO_PORT GPIOA
#define TIMEOUT_US 30000
float measureDistance(void);
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ECHO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct);
float distance;
while (1)
{
distance = measureDistance();
HAL_Delay(1000);
}
}
float measureDistance(void)
{
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);
HAL_Delay_us(2);
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);
HAL_Delay_us(10);
HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);
uint32_t startTime = HAL_GetTick() * 1000;
while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_RESET)
{
if ((HAL_GetTick() * 1000 - startTime) > TIMEOUT_US)
{
return 0;
}
}
startTime = HAL_GetTick() * 1000;
while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET)
{
if ((HAL_GetTick() * 1000 - startTime) > TIMEOUT_US)
{
return 0;
}
}
long duration = HAL_GetTick() * 1000 - startTime;
float distance = duration * 0.034 / 2;
return distance;
}
六、进阶应用与优化技巧
1. 多传感器同步(避免干扰)
- 当多个HC-SR04同时工作时,相邻传感器可能互相干扰,解决方法:
- 为每个传感器分配独立的触发时间(如间隔100ms以上)。
- 在探头前加装隔音罩或导流板,减少声波交叉。
2. 高精度测距(温度补偿)
// 假设已接入DHT11获取温度T(单位℃)
float v = 331.4 + 0.6 * T; // 声速(m/s)
float distance = duration * v * 0.0001 / 2; // 转换为cm(v单位m/s,duration单位μs)
3. 盲区处理
- 最小盲区:约2cm(因模块内部电路延迟和探头余震),近距离测量时需忽略小于2cm的读数。
- 最大距离限制:400cm以上时回波信号过弱,ECHO可能无高电平输出,需设置超时判断(如超过30ms高电平视为无效)。
七、注意事项与常见问题
1. 环境影响
- 障碍物特性:软质(如毛绒)、倾斜或过小物体(<探头直径)可能导致回波不足,测距失败。
- 噪声干扰:强风声、其他40kHz设备(如蜂鸣器)可能导致误触发,需增加软件滤波(如多次测量取平均)。
- 温度/湿度:高湿度会略微提高声速(影响较小),极端温度需严格补偿。
2. 电路问题
- 电源稳定性:模块对电压波动敏感,建议通过稳压器供电,避免与电机等大电流设备共电源(加100μF电容滤波)。
- IO口兼容性:3.3V单片机(如ESP8266)需通过电平转换模块连接(HC-SR04输出5V,直接连接可能损坏单片机)。
3. 软件调试
- 无回波信号:检查接线是否正确,TRIG是否有效触发,ECHO是否被正确读取(可用示波器观察波形)。
- 测距值异常:可能是回波被多次反射(如墙角),导致时间计算错误,可通过限制最大测量时间(如23200μs对应400cm)过滤无效数据。
- 精度波动:增加测量次数(如测10次取中间值),或使用中值滤波、滑动平均算法。
八、应用场景
- 机器人避障:安装于机器人前方/侧面,实时检测障碍物距离,触发减速或转向。
- 智能家居:自动门感应、垃圾桶开盖(检测手的距离)。
- 工业测量:非接触式液位检测、物体高度测量(需固定安装角度)。
- 无人机/四轴:低空定高(配合气压计),避免撞墙。
九、替代方案与对比
传感器 | 优势 | 劣势 | 适用场景 |
---|
HC-SR04 | 低成本、易使用 | 盲区大、受环境影响 | 短距离避障、入门项目 |
VL53L0X | 高精度、小盲区、ToF技术 | 成本高、需I2C接口 | 精密测量、机器人导航 |
红外传感器 | 响应快、低成本 | 精度低、受颜色影响 | 简单避障、接近检测 |
十、总结
HC-SR04是入门级超声波测距的首选,其核心在于理解“触发-接收”机制和时间-距离换算。实际应用中需注意环境干扰、电路稳定性和软件滤波,通过温度补偿和算法优化可进一步提升精度。掌握其原理后,可扩展至多传感器系统或与其他传感器(如IMU、视觉)融合,实现复杂测距功能。