1. 项目概述
在嵌入式系统开发中,HC-SR04超声波测距模块因其价格低廉、使用简单而广受欢迎。但传统驱动方式存在两个明显缺陷:一是采用阻塞式等待ECHO信号,导致CPU利用率低下;二是缺乏有效的数据滤波机制,测量结果易受环境干扰。本文将分享一种基于STM32的非阻塞式驱动方案,通过中断触发+环形缓冲区+数据滤波的三重优化,实现高精度、高稳定性的距离测量。
提示:本方案适用于所有带定时器和外部中断功能的MCU,文中代码以STM32 HAL库为例,但核心思路可移植到任何平台。
2. 核心设计思路
2.1 传统方案的痛点分析
常见示例代码通常采用以下流程:
c复制// 典型阻塞式实现(不推荐)
void HCSR04_GetDistance(void) {
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
delay_us(15);
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
while(!HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin)); // 死等上升沿
__HAL_TIM_SET_COUNTER(&htim2, 0);
while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin)); // 死等下降沿
uint32_t pulse = __HAL_TIM_GET_COUNTER(&htim2);
}
这种实现存在三大问题:
- CPU资源浪费:两个while循环会阻塞整个系统
- 单次测量风险:没有滤波处理,异常值直接影响输出
- 模块故障连锁反应:若超声波模块损坏,程序将永远卡在while循环
2.2 本方案的优化策略
| 优化维度 | 传统方案 | 本方案 |
|---|---|---|
| 触发方式 | 阻塞等待 | 定时器自动触发+双边沿中断 |
| 数据处理 | 单次原始值 | 环形缓冲区+中位值平均滤波 |
| 错误处理 | 无 | 超时检测+数据有效性校验 |
| CPU利用率 | 低(阻塞期间无法执行其他任务) | 高(仅中断短暂占用) |
3. 硬件设计与配置
3.1 硬件连接示意图
code复制HC-SR04模块 STM32单片机
V
