一、工作原理回顾
1.1 HC-SR04模块工作流程
text
STM32 HC-SR04模块 │ │ │────Trig高电平(≥10μs)───→│ 1. 接收到触发信号 │ │ │ │ 2. 自动发射8个40kHz方波 │ │ │←────Echo高电平──────────│ 3. 发射完成,Echo拉高 │ (持续时间=超声波往返时间) │ │ │ │ │ 4. 收到回波,Echo拉低 │←────Echo低电平──────────│
关键点:Echo引脚高电平的持续时间,就是超声波从发射到返回的完整时间。
1.2 距离计算公式
text
距离(cm) = 高电平时间(μs) × 声速(cm/μs) / 2 常温(25℃)下:声速 ≈ 343m/s = 0.0343 cm/μs 简化公式:距离(cm) = 高电平时间(μs) / 58
简化公式的推导:0.0343/2 = 0.01715,倒数约为58.3。
1.3 输入捕获测时原理
text
定时器时钟: 1MHz (1个计数周期=1μs) Echo信号: ────────┐ ┌──────── │ │ │ 高电平持续时间 │ │ (如: 5800μs) │ ────────────┴────┴────────────────────┴────┴────→ 捕获事件: ↑上升沿捕获 ↑下降沿捕获 记录CNT=1000 记录CNT=6800 高电平时间 = 6800 - 1000 = 5800μs 距离 = 5800 / 58 = 100cm
定时器以1MHz的频率计数(每μs加1),在Echo信号的上升沿和下降沿分别记录计数值,差值就是高电平持续的时间。
一句话总结:输入捕获 = 硬件自动给信号跳变打时间戳。
二、硬件连接
| HC-SR04引脚 | 连接到STM32 | 说明 |
|---|---|---|
| VCC | 5V | 注意:HC-SR04需要5V供电 |
| GND | GND | 共地 |
| Trig | PA0(任意GPIO) | 触发信号输出 |
| Echo | PA6(TIM3_CH1) | 必须接到定时器的捕获通道引脚 |
重要:Echo引脚输出的是5V高电平,STM32的GPIO耐受5V才能直连。如果不确定,建议用电平转换电路或串联1kΩ电阻分压保护。
三、CubeMX配置
3.1 基础配置
新建工程,选择芯片(如STM32F103C8T6)
RCC:HSE设为"Crystal/Ceramic Resonator"
SYS:Debug设为"Serial Wire"
定时器3配置(输入捕获)
为什么用TIM3?TIM3是通用定时器,有4个捕获通道,选择它是因为其通道1(PA6)正好可以用。
USART1配置(调试用)
PA6(Echo)已被定时器自动配置,不需要单独设置。
GPIO配置时钟树配置
四、调试要点与常见问题
5.1 时序检查清单
| 检查项 | 正常值 | 异常排查 |
|---|---|---|
| Trig高电平时间 | ≥10μs | 检查延时函数是否准确 |
| Echo高电平时间 | 200μs~24ms(对应3~400cm) | 超出范围说明测量异常 |
| 测量间隔 | ≥60ms | 太短会导致回波干扰 |
5.2 常见问题及解决
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 始终返回0 | Echo引脚连接错误 | 确认Echo接到了TIM3_CH1(PA6) |
| 测量值跳动大 | 未做滤波 | 连续测5次取平均 |
| 近距离测不准 | 模块盲区(2-4cm) | 软件屏蔽<200μs的结果 |
| 长时间运行卡死 | 超时处理缺失 | 加入上面代码中的超时机制 |
| 串口无输出 | 波特率不匹配 | 确认115200且接线正确 |