HC-SR04超声波测距模块的STM32与51单片机实战对比

张开发
2026/4/11 4:40:59 15 分钟阅读

分享文章

HC-SR04超声波测距模块的STM32与51单片机实战对比
1. HC-SR04模块基础认知第一次接触超声波测距模块时我盯着那个火柴盒大小的HC-SR04愣了半天——这玩意儿真能测出距离后来才发现它简直是电子项目里的尺子精2cm到4米的测量范围完全覆盖了日常需求。模块正面两个金属圆片就像眼睛一个是发射器T一个是接收器R工作时会发出人耳听不到的40kHz超声波。实测中发现个有趣现象当我把模块对准绒毛玩具时测距值会偶尔跳变。原来超声波遇到柔软材质时声波吸收严重导致回波信号弱。这提醒我们测量平面坚硬的物体时精度最高比如墙面、金属板而毛毯、窗帘这类目标最好保持30cm以上距离。模块的四个引脚中除了VCC和GNDTrig脚像发令枪给10μs高电平就能激活测距流程Echo脚则是计时器高电平持续时间直接对应距离。2. 硬件接口差异对比2.1 51单片机接线方案用51单片机驱动HC-SR04就像搭积木我当年用STC89C52做毕业设计时直接把Trig接P1.0Echo接P3.2外部中断0引脚。这里有个隐藏陷阱51的IO口驱动能力弱建议在Trig信号线上加个1kΩ上拉电阻。更麻烦的是Echo信号5V电平的Echo输出会直接灌入51的IO口长期使用可能损伤单片机。我的解决方案是用两个电阻做分压把5V降到3.3V左右。数码管显示部分更考验功底。为了在51上实现三位数码管距离显示我踩过动态扫描的坑——超声波中断和显示刷新会互相干扰。后来改用定时器中断统一刷新显示关键代码如下// 51单片机数码管显示核心代码 void Timer0_ISR() interrupt 1 { static uchar digit 0; P2 0xFF; // 关闭所有段选 switch(digit) { case 0: P0 seg_table[bai]; P2 0xFE; break; // 百位 case 1: P0 seg_table[shi]; P2 0xFD; break; // 十位 case 2: P0 seg_table[ge]; P2 0xFB; break; // 个位 } digit (digit1)%3; }2.2 STM32驱动方案切换到STM32后简直打开新世界以STM32F103C8T6为例不仅可用普通GPIO驱动还能玩出更高级的花样。我最推荐用定时器输入捕获功能——用TIM2的CH1接Echo信号自动记录高电平脉宽。具体配置时要注意时钟树配置使定时器时钟达到72MHz输入捕获设置为上升沿/下降沿双触发开启定时器中断计算时间差进阶玩法是上PWMDMA用TIM1的CH1产生精确的40kHz方波直接驱动Trig省去软件延时的麻烦。实测发现这种方式比普通GPIO控制节省30%的CPU资源。STM32的3.3V电平与HC-SR04的5V接口需要注意电平转换我常用TXS0108E这类双向电平转换芯片。3. 代码实现逻辑剖析3.1 51单片机编程要点51的代码就像老式机械表每个齿轮都要亲手调校。测距核心逻辑是触发信号→等待回波→定时器计数→公式换算。这里最易出错的是定时器模式选择建议用模式116位定时计算公式为距离(cm) (TH08 | TL0) * (1/12) * 34000 / 2 / 1000000中断服务程序要足够精简。我曾因在中断里做浮点运算导致测距频率暴跌后来改成在中断只记录时间主循环中计算距离。优化后的中断服务程序如下void EX0_ISR() interrupt 0 { if(ECHO_PIN) { // 上升沿 TR0 1; // 启动定时器 } else { // 下降沿 TR0 0; distance_ready 1; } }3.2 STM32的HAL库实现STM32的HAL库让开发变得优雅但要注意几个关键点。使用输入捕获时建议开启预分频器让计数器周期大于最大测量时间对应4米约23ms。配置代码示例// STM32输入捕获配置 htim2.Instance TIM2; htim2.Init.Prescaler 71; // 72MHz/721MHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 0xFFFF; htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1);DMA传输是性能杀手锏。当需要连续采样时可以配置DMA循环模式自动搬运捕获值。我在做自动泊车项目时用此法实现了100Hz的采样率关键配置如下hdma_tim2_ch1.Init.Mode DMA_CIRCULAR; hdma_tim2_ch1.Init.PeriphInc DMA_PINC_DISABLE; hdma_tim2_ch1.Init.MemInc DMA_MINC_ENABLE; HAL_DMA_Start(hdma_tim2_ch1, TIM2-CCR1, buffer, 2);4. 性能实测对比4.1 响应速度对决用示波器抓取波形时发现STM32方案比51单片机快出一个数量级。具体数据对比如下指标51单片机(STC89C52)STM32(F103C8T6)最小测量间隔65ms15ms中断响应延迟12μs0.5μs计算耗时(浮点)1.2ms0.03ms最大采样频率15Hz100Hz4.2 测量精度对比在恒温实验室环境下测试两种方案表现迥异。将模块固定距墙面1米处连续测量100次51单片机标准差为±2.3mm受限于定时器分辨率STM32标准差仅±0.8mm72MHz主频优势明显加入温度补偿后DS18B20STM32精度可达±0.5mm长距离测量时STM32的自动溢出处理更可靠。当测量超过3米时51单片机需要手动处理定时器溢出而STM32的32位定时器可以直接支持到10米量程。4.3 资源占用分析51单片机的优势在于极简整个测距程序仅占用2KB ROM和128B RAM。而STM32基础工程就占用8KB Flash但换来的是可同时运行多组超声波模块支持背景计算不影响主流程轻松扩展LCD显示、无线传输等功能在8位数码管显示场景下51的扫描式驱动会占用大量CPU时间而STM32可以完全用定时器和DMA实现零CPU占用刷新。

更多文章