别再只测距了!用STM32F103C8T6驱动HC-SR04做个智能避障小车(附完整代码)
2026/5/31 7:12:55 网站建设 项目流程

从测距到决策:基于STM32F103的智能避障系统实战

1. 重新认识HC-SR04的工程价值

很多开发者拿到HC-SR04超声波模块的第一反应就是测试距离测量功能,这确实是最基础的应用场景。但当我们把视角切换到智能硬件系统层面,这个售价不到10元的小模块就能展现出惊人的潜力。在智能小车系统中,它不仅是距离传感器,更是整个避障决策系统的"眼睛"。

HC-SR04的物理特性决定了它的应用边界:

  • 工作电压:典型5V供电(注意部分STM32开发板IO电压为3.3V)
  • 探测角度:<15°的锥形区域(需要多模块组合消除盲区)
  • 响应时间:完整测距周期约50ms(限制系统采样频率)
// 基础距离检测代码示例 float get_distance_cm(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)); uint32_t start = TIM2->CNT; while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin)); uint32_t end = TIM2->CNT; return (end - start) * 0.017f; // 换算为厘米 }

注意:实际项目中需要添加超时判断,避免因物体超出量程导致程序死循环

2. 避障系统的架构设计

一个完整的智能避障系统需要硬件和软件的协同设计。不同于简单的测距演示,系统级设计需要考虑实时性、可靠性和扩展性。

2.1 硬件架构框图

模块功能描述接口方式
STM32F103C8T6主控制器-
HC-SR04前方障碍物检测GPIO + 定时器
L298N电机驱动PWM + 方向控制
红外对管底部边缘检测(防跌落)GPIO输入
蜂鸣器系统状态提示GPIO输出

2.2 软件状态机设计

避障逻辑的核心是有限状态机(FSM),典型状态包括:

  1. 巡航模式:直线行驶,周期性检测前方障碍
  2. 预警模式:检测到障碍但距离较远(>30cm)
  3. 避障模式:近距离障碍触发规避动作
  4. 紧急停止:突发近距离障碍立即刹车
typedef enum { MODE_CRUISE, MODE_WARNING, MODE_AVOIDANCE, MODE_EMERGENCY_STOP } SystemMode; SystemMode current_mode = MODE_CRUISE;

3. 提升系统可靠性的关键技术

3.1 传感器数据滤波处理

原始超声波数据存在波动,直接使用会导致小车"抖动"。常用滤波方法对比:

滤波算法实现复杂度实时性适用场景
移动平均低速平稳环境
中值滤波抗脉冲干扰
卡尔曼滤波动态变化环境

推荐5点移动平均的简单实现:

#define FILTER_SIZE 5 float distance_filter(float new_value) { static float buffer[FILTER_SIZE] = {0}; static uint8_t index = 0; buffer[index++] = new_value; if(index >= FILTER_SIZE) index = 0; float sum = 0; for(int i=0; i<FILTER_SIZE; i++) { sum += buffer[i]; } return sum / FILTER_SIZE; }

3.2 多传感器数据融合

单一超声波模块存在探测盲区,典型解决方案:

  • 前向主探测器:HC-SR04(2-400cm范围)
  • 近距辅助检测:红外接近开关(0-20cm)
  • 碰撞检测:微动开关作为最后保障

提示:各传感器应设置优先级,当红外检测到障碍时立即触发急停,无需等待超声波确认

4. 运动控制算法实现

4.1 基于距离的分级响应

距离范围响应策略电机控制参数
>50cm全速前进PWM=100%, 直行
30-50cm减速并准备转向PWM=60%, 开始扫描
10-30cm停止并选择转向方向PWM=0%, 比较左右距离
<10cm紧急后退反向PWM=30%, 持续500ms

4.2 转向决策逻辑

void avoidance_decision(float distance) { if(distance > SAFE_DISTANCE) { motor_forward(DEFAULT_SPEED); } else { motor_stop(); float left_dist = check_left_side(); float right_dist = check_right_side(); if(left_dist > right_dist && left_dist > MIN_TURN_DIST) { motor_turn_left(AVOIDANCE_SPEED); delay_ms(300); } else if(right_dist > MIN_TURN_DIST) { motor_turn_right(AVOIDANCE_SPEED); delay_ms(300); } else { motor_backward(EMERGENCY_SPEED); delay_ms(500); } } }

5. 系统优化与调试技巧

5.1 电源管理要点

  • 电机启动瞬间会产生电压跌落,可能导致STM32复位
  • 解决方案:
    • 为控制电路增加1000μF以上储能电容
    • 电机电源与控制电源分离
    • 在代码中添加电源监测

5.2 实时调试方法

利用STM32内置的SWD接口和printf重定向可以极大提升调试效率:

  1. SWD在线调试:设置断点观察变量
  2. 串口日志:关键数据实时输出
  3. LED状态指示:快速定位故障模块
// 串口重定向示例 #include <stdio.h> int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY); return len; } // 使用示例 printf("Distance=%.1fcm, Mode=%d\n", current_dist, current_mode);

6. 进阶扩展方向

当基础避障功能实现后,可以考虑以下增强功能:

  • SLAM建图:记录运动路径构建简单环境地图
  • 手机遥控:通过蓝牙增加手动控制模式
  • 能耗优化:根据环境光线自动调节检测频率
  • 多机协作:多个小车之间的简单通信避让

在最近的一个学生竞赛项目中,参赛队通过增加简单的红外通信模块,实现了三辆小车的编队行驶。他们的关键改进是在避障算法中加入了车队间距保持逻辑,当领航车检测到障碍时,跟随车会同步进行避障动作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询