嵌入式---HC-SR04超声波传感器

一、基本概述

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. 核心流程
  1. 触发阶段:向TRIG引脚输入≥10μs的高电平脉冲,模块内部发射电路触发,发射8个40kHz的超声波脉冲。
  2. 等待回波:发射同时,ECHO引脚由低电平变为高电平,等待接收探头检测到反射回波。
  3. 回波接收:接收到回波后,ECHO引脚变为低电平,高电平持续时间 ( t ) 即为超声波往返时间。
  4. 距离计算:根据声速 ( v v v) 和时间 ( t t t),计算距离
    在这里插入图片描述
    (除以2是因为时间包含往返路程)。
2. 声速与温度补偿

在这里插入图片描述

五、使用步骤(以STM32为例)
1. 硬件连接
HC-SR04引脚Arduino引脚
VCC5V
GNDGND
TRIGPA2(可自定义)
ECHOPA3(可自定义)

实现流程:

  1. 初始化部分:在main函数中,我们首先初始化HAL库,然后使能GPIOA的时钟。接着,我们配置TRIG_PIN为输出模式,ECHO_PIN为输入模式。
  2. 发送触发信号:在measureDistance函数中,我们使用HAL_GPIO_WritePin函数来控制TRIG_PIN的电平,通过HAL_Delay_us函数实现微秒级的延时。
  3. 测量ECHO高电平时间:我们使用HAL_GetTick函数来获取当前的系统时间,通过不断读取ECHO_PIN的电平状态,计算高电平的持续时间。如果超时,函数将返回0。
  4. 计算距离:根据高电平持续时间和简化的声速公式,计算出距离。

代码示例

#include "stm32xxxx_hal.h"

// 假设trigPin和echoPin对应的GPIO端口和引脚
#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(); // 使能GPIOA时钟

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    // 配置TRIG引脚为输出模式
    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);

    // 配置ECHO引脚为输入模式
    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); // 每隔1秒测量一次
    }
}

// 测量距离的函数
float measureDistance(void)
{
    // 发送触发信号
    HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);
    HAL_Delay_us(2); // 拉低2μs确保稳定
    HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);
    HAL_Delay_us(10); // 拉高10μs触发测距
    HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);

    // 等待ECHO引脚变为高电平
    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; // 超时返回0
        }
    }

    // 记录ECHO引脚变为高电平的时间
    startTime = HAL_GetTick() * 1000;

    // 等待ECHO引脚变为低电平
    while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET)
    {
        if ((HAL_GetTick() * 1000 - startTime) > TIMEOUT_US)
        {
            return 0; // 超时返回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次取中间值),或使用中值滤波、滑动平均算法。
八、应用场景
  1. 机器人避障:安装于机器人前方/侧面,实时检测障碍物距离,触发减速或转向。
  2. 智能家居:自动门感应、垃圾桶开盖(检测手的距离)。
  3. 工业测量:非接触式液位检测、物体高度测量(需固定安装角度)。
  4. 无人机/四轴:低空定高(配合气压计),避免撞墙。
九、替代方案与对比
传感器优势劣势适用场景
HC-SR04低成本、易使用盲区大、受环境影响短距离避障、入门项目
VL53L0X高精度、小盲区、ToF技术成本高、需I2C接口精密测量、机器人导航
红外传感器响应快、低成本精度低、受颜色影响简单避障、接近检测
十、总结

HC-SR04是入门级超声波测距的首选,其核心在于理解“触发-接收”机制和时间-距离换算。实际应用中需注意环境干扰、电路稳定性和软件滤波,通过温度补偿和算法优化可进一步提升精度。掌握其原理后,可扩展至多传感器系统或与其他传感器(如IMU、视觉)融合,实现复杂测距功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值