STM32之HC-SR04超声波测距传感器模块

发布于:2025-07-17 ⋅ 阅读:(11) ⋅ 点赞:(0)

目录

一、模块概述

 二、模块简介

2.1 基本特性

2.2 结构与工作原理

2.2.1  模块结构组成

2.2.2  工作原理时序

2.2.3  声速与温度补偿

2.3 电气特性

2.4 模块接口说明

2.5 原理图设计

2.6 实际应用注意事项

三、硬件设计

3.1 硬件组成

3.2 硬件连接

四、软件设计

4.1 开发环境配置

4.1.1  开发工具链

4.1.2  库支持

4.1.3  工程配置要点

4.2 关键代码实现

4.2.1  硬件初始化函数

4.2.2  高精度延时函数(微秒级)

4.2.3  核心距离测量函数

五、功能实现与优化

5.1 基础功能实现

5.2 软件优化方案

5.2.1  数字滤波算法

5.2.2  温度补偿算法

六、常见问题解决

七、总结


一、模块概述

        HC-SR04是一款高性价比的超声波测距模块,采用非接触式测量原理,通过发射和接收40kHz超声波实现2cm-400cm范围内的距离检测,精度可达±3mm。模块工作电压5V,体积小巧(45mm×20mm×15mm),广泛应用于机器人避障、液位检测、智能停车等领域。

 二、模块简介

模块实物图:

2.1 基本特性

HC-SR04超声波测距模块主要特性参数:

特性参数 规格说明
工作频率 40kHz±1kHz
测量周期 ≥60ms
测量角度 ≤15°锥角
工作温度范围 -15℃~70℃
模块尺寸 45mm×20mm×15mm
模块重量 约9g

2.2 结构与工作原理

2.2.1  模块结构组成

1. 超声波发射器:40kHz压电陶瓷换能器
2. 接收电路:
   - 信号放大电路(增益≥1000倍)
   - 带通滤波电路(中心频率40kHz)
3. 控制电路:
   - 触发信号处理
   - 回波信号检测
   - 输出脉冲生成

2.2.2  工作原理时序

  1. 外部微控制器向 TRIG 引脚发送一个至少 10μs 的高电平脉冲,触发模块发射超声波。
  2. 超声波发射头发射超声波信号。
  3. 超声波在空气中传播,遇到障碍物后反射回来,被超声波接收头接收并转换为电信号。
  4. 接收信号经过放大、滤波和整形后,从 ECHO 引脚输出一个高电平信号,其持续时间与超声波的传播时间成正比。
  5. 外部微控制器通过测量 ECHO 引脚高电平的持续时间,并根据超声波的传播速度(在空气中约为 340m/s),计算出障碍物与模块之间的距离。距离= 高电平时间*声速(340M/S)/2 

2.2.3  声速与温度补偿

2.3 电气特性

参数 最小值 典型值 最大值 单位 备注
工作电压 4.5 5.0 5.5 V DC电源
静态电流 - 2 4 mA 无信号时
工作电流 - 15 20 mA 测量过程中
触发信号宽度 10 - - μs 最小要求
回波输出高电平 4.0 5.0 - V TTL电平
回波输出阻抗 - 10 - 建议加分压电路

2.4 模块接口说明

引脚名称 类型 功能描述 连接注意事项
VCC 电源 5V直流供电 需并联100nF滤波电容
Trig 输入 触发信号输入 需≥10μs高电平
Echo 输出 回波信号输出(5V TTL) 建议分压后接入STM32(3.3V电平兼容)
GND 地线 电源参考地 确保与控制器共地

2.5 原理图设计

整体架构:

        HC-SR04 超声波模块主要由超声波发射电路、超声波接收电路、控制与信号处理电路以及电源电路组成。其核心功能是通过发射超声波并接收反射波,计算超声波的传播时间,进而得出距离信息。

超声波发射电路:

  • 控制信号输入:模块的 TRIG 引脚是触发信号输入端。当该引脚接收到一个至少 10μs 的高电平脉冲时,模块开始发射超声波。
  • 发射驱动:图中可以看到,触发信号经过一些处理后,连接到超声波发射头相关的驱动电路。发射头通常是一个压电换能器,当接收到合适的电信号时,会将电能转换为机械能,发射出超声波。例如,图中的三极管或场效应管可能起到开关或放大作用,为发射头提供足够的驱动电流。
  • 发射头:标记为“超声波发射头”的部分就是实际的超声波发射装置,它将电信号转换为超声波信号并向空气中发射。

超声波接收电路:

  • 接收头:标记为“超声波接收头”的压电换能器负责接收反射回来的超声波信号,并将其转换为微弱的电信号。
  • 信号放大:由于接收头输出的电信号非常微弱,需要经过多级放大才能被后续电路处理。图中的运算放大器(如 U2 等)组成放大电路,对接收信号进行放大。例如,第一级放大可能将信号放大到一定幅度,后续的放大级进一步增加信号强度。
  • 滤波:在放大过程中,可能会引入各种噪声信号。图中的电容(如 C3、C4 等)和电阻组成的滤波电路,用于去除高频噪声和其他干扰信号,确保只有有用的超声波信号被处理。
  • 信号整形:经过放大和滤波后的信号可能仍然不够规则,需要通过比较器或其他电路进行整形。图中的比较器电路(可能由运算放大器配置而成)将模拟信号转换为数字信号,以便后续的测量和处理。整形后的信号会输出到 ECHO 引脚,其高电平的持续时间与超声波的传播时间成正比。

控制与信号处理电路:

  • 微控制器:图中的 STC11 微控制器是模块的核心控制单元。它负责接收触发信号,控制超声波的发射,并对接收到的信号进行处理。例如,它会检测 ECHO 引脚的高电平持续时间,并根据超声波的传播速度计算出距离。
  • 引脚功能
  1. P3.0(RXD)和 P3.1(TXD):通常用于与外部设备进行串口通信,方便模块与微控制器或其他设备进行数据传输。
  2. 其他引脚:如 P5.0 - P5.5 等,可能用于连接模块内部的其他功能电路,如控制发射和接收的时序等。

电源电路:

  • 电源输入:模块通常使用 5V 直流电源供电,图中的 VCC 引脚连接电源正极,GND 引脚连接电源负极。
  • 电源滤波:图中的电容(如 C1、C2 等)起到电源滤波的作用,去除电源中的高频噪声,确保模块内部的电路能够稳定工作。

2.6 实际应用注意事项

1. 安装要求:
   - 确保传感器表面清洁无遮挡
   - 与被测物体表面保持平行
   - 避免强振动环境安装

2. 环境适应性:
   - 工作环境避免强噪声干扰(特别是40kHz附近)
   - 高温环境下需进行温度补偿
   - 避免测量吸音材料(如棉布、泡沫等)

3. 测量限制:
   - 最小测量距离≥2cm(实际建议≥5cm)
   - 最大测量距离受反射面材质影响

三、硬件设计

3.1 硬件组成

组件 型号/参数 数量 备注
主控制器 STM32F103C8T6 1 最小系统板
超声波模块 HC-SR04 1 含安装孔位
电源模块 5V/1A DC-DC 1 建议使用LDO稳压

3.2 硬件连接

HC-SR04引脚 STM32连接 配置模式 备注
VCC 5V电源输出 - 需电源滤波
GND 共同GND - 确保低阻抗接地
Trig PA8 推挽输出,50MHz 直接连接
Echo PA0 浮空输入 经分压电路连接

四、软件设计

4.1 开发环境配置

4.1.1  开发工具链

   - IDE:Keil MDK-ARM V5
   - 调试器:ST-Link V2

4.1.2  库支持

  - STM32标准外设库V3.5.0
   - 核心头文件:

     #include "stm32f10x.h"
     #include "stm32f10x_gpio.h"
     #include "stm32f10x_rcc.h"
     #include "stm32f10x_tim.h"

4.1.3  工程配置要点

  • 系统时钟:72MHz HCLK
  • GPIO模式:

             - PA8:推挽输出,50MHz
             - PA0:浮空输入

  • 定时器配置:

             - TIM2,向上计数模式
             - 预分频值71(1MHz计数频率)
             - 自动重装载值0xFFFF

4.2 关键代码实现

4.2.1  硬件初始化函数

void Ultrasonic_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    // Trig引脚配置(PA8)
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // Echo引脚配置(PA0)
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 定时器基础配置(TIM2)
    TIM_InitStruct.TIM_Period = 0xFFFF;
    TIM_InitStruct.TIM_Prescaler = 72 - 1; // 1MHz
    TIM_InitStruct.TIM_ClockDivision = 0;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
    
    // 初始状态
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
}
  • GPIO配置

    • PA8(Trig)设置为推挽输出,用于发送10μs触发脉冲。

    • PA0(Echo)设置为浮空输入,用于检测回波高电平。

  • 定时器配置

    • TIM2定时器时钟为1MHz(72MHz主频/72分频),每个计数周期=1μs。

    • 用于精确测量Echo高电平的持续时间。

4.2.2  高精度延时函数(微秒级)

void Delay_us(uint32_t us)
{
    uint32_t ticks = us * (SystemCoreClock / 1000000) / 5;
    while(ticks--) __NOP();
}
  • 通过CPU空指令循环实现微秒级延时。

  • SystemCoreClock是系统时钟频率(72MHz),计算所需的循环次数。

  • 适用于短时间延时(如生成10μs触发脉冲)。

4.2.3  核心距离测量函数

float Get_Distance(void)
{
    uint32_t timeout = 0;
    uint32_t pulse_width = 0;
    
    // 发送10us触发脉冲
    GPIO_SetBits(GPIOA, GPIO_Pin_8);
    Delay_us(10);
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    
    // 等待回波信号变高(带超时)
    while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET)
        if(++timeout > 100000) return 0; // 超时返回0
    
    // 启动定时器测量高电平时间
    TIM_SetCounter(TIM2, 0);
    TIM_Cmd(TIM2, ENABLE);
    
    // 等待回波结束(带超时)
    timeout = 0;
    while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET)
        if(++timeout > 30000) break; // 超时退出
    
    pulse_width = TIM_GetCounter(TIM2);
    TIM_Cmd(TIM2, DISABLE);
    
    // 计算距离并限制有效范围
    float distance = pulse_width * 0.017f; // 单位:cm
    return (distance < 2 || distance > 400) ? 0 : distance;
}
  1. 触发阶段:发送10μs高电平触发超声波发射。

  2. 回波检测

    • 等待Echo引脚变高(超声波发射完成)。

    • 启动定时器记录高电平持续时间(即超声波往返时间)。

  3. 距离计算

    • 公式:距离(cm) = 高电平时间(μs) × 0.017

    • 系数来源:声速340m/s = 0.034cm/μs,往返时间需除以2。

  4. 超时处理:防止程序卡死在等待状态。

五、功能实现与优化

5.1 基础功能实现

单次距离测量:

   float distance = Get_Distance();

连续测量模式:

   while(1) {
       float dist = Get_Distance();
       Delay_ms(100); // 测量间隔
   }

5.2 软件优化方案

5.2.1  数字滤波算法

#define FILTER_SIZE 5

float Median_Filter(float new_val)
{
    static float buffer[FILTER_SIZE];
    static uint8_t index = 0;
    float temp[FILTER_SIZE];
    
    // 更新数据缓冲区
    buffer[index++] = new_val;
    if(index >= FILTER_SIZE) index = 0;
    
    // 复制数据并排序
    memcpy(temp, buffer, sizeof(buffer));
    Bubble_Sort(temp, FILTER_SIZE);
    
    // 返回中值
    return temp[FILTER_SIZE/2];
}

作用:对连续多次测量结果取中值,消除偶然误差。

5.2.2  温度补偿算法

float Temp_Compensate(float raw_dist, float temp_C)
{
    // 声速温度补偿公式:V = 331.5 + 0.6*T (m/s)
    float sound_speed = 331.5f + 0.6f * temp_C;
    return raw_dist * 343.0f / sound_speed;
}

物理原理:声速随温度变化(每升高1℃,声速增加0.6m/s)。
公式推导:

  • 实际声速:V = 331.5 + 0.6*T

  • 补偿后距离:补偿距离 = 原始距离 × (标准声速/实际声速)

六、常见问题解决

问题现象 可能原因 解决方案
测量值恒为0 1. Trig信号不足10μs
2. 硬件连接错误
1. 检查触发信号时序
2. 确认VCC/GND连接
数据波动大 1. 电源噪声
2. 环境干扰
1. 加强电源滤波
2. 添加软件滤波算法
短距离测量异常 1. 声波震荡未稳定
2. 安装位置不当
1. 忽略<5cm数据
2. 调整传感器角度
超出量程返回错误值 1. 障碍物超出400cm
2. 反射面吸收强
1. 添加超时检测
2. 更换反射材料
多模块相互干扰 同时触发多个传感器 错开触发时序(间隔≥50ms)

七、总结

        本设计实现了基于STM32F103C8T6最小系统板的HC-SR04超声波测距系统,具有以下优势特点:

1. 硬件设计精简:
   - 仅需最小系统板+超声波模块
   - 通过电阻分压实现电平转换
   - 成本控制在20元以内

2. 软件算法优化:
   - 中值滤波提高数据稳定性
   - 温度补偿提升测量精度
   - 自动量程调整优化响应速度

3. 实测性能指标:
   - 2-100cm范围:误差<±2mm
   - 100-300cm范围:误差<±5mm
   - 300-400cm范围:误差<±1cm

4. 扩展性强:
   - 可方便集成无线传输模块
   - 支持多传感器组网
   - 易于移植到其他STM32平台

实际应用建议:
- 工业环境使用时增加EMC防护电路
- 高精度场合建议增加温度传感器
- 移动平台应用需考虑振动补偿


网站公告

今日签到

点亮在社区的每一天
去签到