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

目录

一、模块概述

二、模块简介

[2.1 基本特性](#2.1 基本特性)

[2.2 结构与工作原理](#2.2 结构与工作原理)

[2.2.1 模块结构组成](#2.2.1 模块结构组成)

[2.2.2 工作原理时序](#2.2.2 工作原理时序)

[2.2.3 声速与温度补偿](#2.2.3 声速与温度补偿)

[2.3 电气特性](#2.3 电气特性)

[2.4 模块接口说明](#2.4 模块接口说明)

[2.5 原理图设计](#2.5 原理图设计)

[2.6 实际应用注意事项](#2.6 实际应用注意事项)

三、硬件设计

[3.1 硬件组成](#3.1 硬件组成)

[3.2 硬件连接](#3.2 硬件连接)

四、软件设计

[4.1 开发环境配置](#4.1 开发环境配置)

[4.1.1 开发工具链](#4.1.1 开发工具链)

[4.1.2 库支持](#4.1.2 库支持)

[4.1.3 工程配置要点](#4.1.3 工程配置要点)

[4.2 关键代码实现](#4.2 关键代码实现)

[4.2.1 硬件初始化函数](#4.2.1 硬件初始化函数)

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

[4.2.3 核心距离测量函数](#4.2.3 核心距离测量函数)

五、功能实现与优化

[5.1 基础功能实现](#5.1 基础功能实现)

[5.2 软件优化方案](#5.2 软件优化方案)

[5.2.1 数字滤波算法](#5.2.1 数字滤波算法)

[5.2.2 温度补偿算法](#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)

  1. 控制电路:
  • 触发信号处理

  • 回波信号检测

  • 输出脉冲生成

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元以内

  1. 软件算法优化:
  • 中值滤波提高数据稳定性

  • 温度补偿提升测量精度

  • 自动量程调整优化响应速度

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

  • 100-300cm范围:误差<±5mm

  • 300-400cm范围:误差<±1cm

  1. 扩展性强:
  • 可方便集成无线传输模块

  • 支持多传感器组网

  • 易于移植到其他STM32平台

实际应用建议:

  • 工业环境使用时增加EMC防护电路

  • 高精度场合建议增加温度传感器

  • 移动平台应用需考虑振动补偿