目录
一、模块概述
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 工作原理时序
- 外部微控制器向 TRIG 引脚发送一个至少 10μs 的高电平脉冲,触发模块发射超声波。
- 超声波发射头发射超声波信号。
- 超声波在空气中传播,遇到障碍物后反射回来,被超声波接收头接收并转换为电信号。
- 接收信号经过放大、滤波和整形后,从 ECHO 引脚输出一个高电平信号,其持续时间与超声波的传播时间成正比。
- 外部微控制器通过测量 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 | - | kΩ | 建议加分压电路 |
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 引脚的高电平持续时间,并根据超声波的传播速度计算出距离。
- 引脚功能:
- P3.0(RXD)和 P3.1(TXD):通常用于与外部设备进行串口通信,方便模块与微控制器或其他设备进行数据传输。
- 其他引脚:如 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;
}
触发阶段:发送10μs高电平触发超声波发射。
回波检测:
等待Echo引脚变高(超声波发射完成)。
启动定时器记录高电平持续时间(即超声波往返时间)。
距离计算:
公式:
距离(cm) = 高电平时间(μs) × 0.017
。系数来源:声速340m/s = 0.034cm/μs,往返时间需除以2。
超时处理:防止程序卡死在等待状态。
五、功能实现与优化
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防护电路
- 高精度场合建议增加温度传感器
- 移动平台应用需考虑振动补偿