STM32智能小车避障功能实战:超声波模块HC-SR04与舵机联调避坑指南
从循迹到避障,是许多STM32智能小车爱好者项目进阶的关键一步。当你已经能让小车乖乖地沿着黑线跑起来,下一步自然就是赋予它一双“眼睛”,让它能感知前方的障碍物并自主绕开。这个过程听起来很酷,但实际动手时,你会发现从简单的超声波测距到与舵机协同完成多角度扫描,再到最终做出可靠的避障决策,中间布满了各种“坑”。我见过不少朋友,硬件连上后要么测距数据乱跳,要么舵机转得“六亲不认”,要么程序跑着跑着就卡死了。这篇文章,我就结合自己调试过好几辆小车的经验,和你聊聊如何让HC-SR04超声波模块和舵机在STM32上稳定、高效地协同工作,避开那些常见的陷阱,打造一个真正聪明的避障小车。
1. 硬件架构与核心原理:不只是“接上线”那么简单
在开始写代码之前,我们必须先理解这套避障系统的“骨架”和“神经”。一个典型的超声波避障小车,其核心感知部分由HC-SR04模块和舵机构成。HC-SR04负责发射和接收超声波,测量前方障碍物的距离;舵机则像一个灵活的脖子,带动超声波模块左右转动,从而探测不同方向的情况。但要让它们听STM32的话,你得先搞清楚它们各自的“语言”。
HC-SR04模块的工作时序是固定的。它需要STM32在Trig引脚上提供一个至少10微秒的高电平脉冲来触发一次测距。随后,模块内部发出8个40kHz的超声波脉冲,并自动将Echo引脚拉高。当超声波遇到障碍物返回并被模块接收后,Echo引脚会拉低。因此,Echo引脚高电平的持续时间,就代表了超声波从发射到返回的总时间。根据声速(约340m/s),我们就能算出距离。这里第一个坑就来了:很多教程里直接用HAL_Delay函数来产生Trig脉冲和测量Echo高电平时间,这在单任务环境下或许能跑,但一旦加入舵机控制、电机PWM等其他功能,这种阻塞式延时就会严重拖慢系统响应,甚至导致测距失败。
舵机的控制则依赖于PWM信号的占空比。常见的180度舵机,其控制信号是周期为20ms(50Hz)的PWM波,其中高电平的宽度在0.5ms到2.5ms之间变化,对应着0到180度的角度。例如:
- 0.5ms高电平 -> 0度
- 1.5ms高电平 -> 90度
- 2.5ms高电平 -> 180度
在STM32中,我们通常使用一个通用定时器(如TIM2)的PWM输出通道来生成这个信号。关键在于计算正确的ARR(自动重装载值)和CCR(捕获/比较寄存器值),以匹配你芯片的主频和预分频系数。
下面这个表格对比了两种常见的硬件连接方案,帮助你理解不同选择的优劣:
| 组件 | 方案一:独立引脚控制 | 方案二:复用与中断 | 推荐与说明 |
|---|---|---|---|
| HC-SR04 Trig | 连接普通GPIO(如PB4) | 连接普通GPIO | 两者皆可,普通GPIO输出模式即可。 |
| HC-SR04 Echo | 连接普通GPIO输入 | 连接至支持外部中断/输入捕获的引脚(如PB5) | 强烈推荐方案二。利用输入捕获功能可以极其精确地测量高电平时间,且不占用CPU进行忙等待。 |
| 舵机信号线 | 连接至定时器PWM输出通道(如TIM2_CH3) | 连接至定时器PWM输出通道 | 必须使用硬件PWM输出,软件模拟精度和稳定性无法满足要求。 |
| 电机驱动 | 使用另外两个PWM通道(如TIM2_CH1, CH2) | 使用另外两个PWM通道 | 确保PWM频率适合电机驱动(通常几百Hz到几十KHz),与舵机50Hz不同。 |
| 核心资源占用 | 1个定时器(PWM),CPU忙于延时测量 | 2个定时器(1个用于PWM,1个用于输入捕获),CPU解放 | 方案二系统效率更高,是构建复杂多任务系统的基础。 | </


1万+

被折叠的 条评论
为什么被折叠?



