这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【成果帖】简易超声波测距仪实践

共1条 1/1 1 跳转至页

【成果帖】简易超声波测距仪实践

菜鸟
2026-10-07 11:58:36     打赏
基于 FRDM-MCXA153 的超声波测距与 LCD 显示系统
  • 平台:NXP FRDM-MCXA153(MCXA153,Cortex-M33 cm33_core0,96 MHz,裸机,无 RTOS)

  • 传感器:HC-SR04 超声波测距模块(5V)

  • 显示:Newhaven NHD-0116AZ-FL-YBW(16×1 字符 LCD,HD44780/ST7066 兼容,4-bit 并口)

  • 交互:板载 wakeup 按键 SW3(P1_7)

  • 日期:2026-10-06

  • 相关文档:接线与引脚见 WIRING.md


1. 项目概述

实现"测距 → 显示 → 按键切换量程"的完整闭环:

  • HC-SR04 周期性测距,距离以 0.001 cm 分辨率、3 位小数 显示;

  • 单行 16 字符显示 <量程> <距离>,例如 FULL    123.456 cm;

  • 按键循环切换量程:FULL(上限 400cm) → 50cm → 200cm → 回到 FULL;

  • 超量程显示 OVER,无回波显示 NO ECHO;

  • 串口(LPUART0,115200)输出运行日志,便于联调。


2. 系统组成

层次组成说明
感知HC-SR04TRIG 触发、ECHO 脉宽对应距离
控制MCXA153计时、滤波、换算、状态机、按键
人机NHD-0116AZ(16×1 LCD)4-bit 并口只写
交互SW3 按键GPIO 中断,切换量程
调试LPUART0 → MCU-Link VCOM115200 8N1 日志
指示红色 LED (P3_12)1 Hz 心跳

3. 引脚与接线(摘要)

信号MCU备注
LCD RS / ENP3_1 / P3_30J6-2 / J6-1
LCD D4–D7P1_0 / P1_1 / P1_2 / P1_3J6-6 / J6-4 / J6-5 / J6-3
LCD RW / VDD / VSSGND / 5V / GNDV0 经对比度网络(不可直接接 GND)
HC-SR04 TRIGP3_7触发输出
HC-SR04 ECHOP1_8(CT_INP8)经 1kΩ/2kΩ 分压到 ~3.3V
按键P1_7(SW3)板载,低有效
日志P0_2 / P0_3LPUART0(生成代码未复用,固件内显式配置)

完整接线、对比度网络、注意事项见 WIRING.md。


4. 软件架构

文件职责
led_blinky.c主程序:初始化、主循环、显示格式化、按键状态机
hcsr04.c/.hHC-SR04 驱动:触发、硬件输入捕获、换算、滚动滤波
lcd1602.c/.hLCD 驱动:4-bit 只写、16×1 分半寻址、逐字刷新
app_ext.c/.h扩展板级资源:引脚/时钟、CTIMER1 时基、LPUART0 复用、按键中断
frdmmcxa153/、led_blinky/MCUXpresso Config Tools 生成文件(不手工修改)
WIRING.md、REPORT.md文档

主循环时序(led_blinky.c)

  1. 按键(中断锁存标志)→ 切换量程并立即刷新显示;

  2. 每 60 ms 测距一次(≈16 Hz),更新内部值并打印日志;

  3. 每 250 ms 刷新 LCD 一次(≈4 Hz),且仅在文本变化时真正写屏。


5. 精度提升亮点设计(重点)

5.1 硬件输入捕获取代软件轮询 —— 消除时序抖动

  • ECHO 接 P1_8 = CT_INP8,经 INPUTMUX 路由到 CTIMER1 捕获通道 0;CTIMER1 自由运行于 1 µs/计数。

  • 上升/下降沿由硬件锁存计数器值,脉宽 = 两次捕获之差。

  • 效果:测量不再受软件轮询延迟、中断响应时间影响,边沿时刻精确到定时器计数;这是相对"GPIO 轮询计时"的核心精度提升。

5.2 温度补偿声速 —— 修正系统性误差

  • 声速随温度变化:v(T) = 331.3 + 0.606·T (m/s)。

  • 换算采用温度相关系数的精确整数形式:v100 = 33130 + 606·T/10,distance = echo_us · v100 / 2000(单位 0.001 cm)。

  • 效果:相对固定 58 µs/cm(约 22℃)的写法,在 0–40℃ 范围内修正约 ±1.8%/10℃ 的系统误差;温度可通过 HCSR04_TEMPERATURE_C 设定。

5.3 直接毫厘米级换算 —— 减少中间舍入

  • 从捕获计数直接计算 0.001 cm 单位(echo_us·v100/2000),而非先算整厘米再插值。

  • 效果:1 µs 计数对应约 0.017 cm 的真实分辨率,显示的第 3 位小数有实际意义(非补零)。

5.4 自适应鲁棒估计 —— 中值 + MAD 近邻均值 + 跳变确认

  • 滚动窗口长度 7:先取中值(完全压掉少量回波周期跳变),再用 MAD(中值绝对偏差)自适应确定近邻带宽 max(150, 3·MAD)(毫厘米),只对带宽内的样本求平均。

  • 带宽随噪声自适应:静态时更严、噪声大时自动放宽,避免误杀真实值。

  • 跳变确认(持续性门控):输出变化 > 1.000 cm 时需连续 3 次确认才接受,偶发的错误回波不会显示;≤1 cm 的变化用指数平滑跟随。

  • 无回波/无效时不入窗,保持上次有效值,显示不跳变。

5.4b 采样节奏与自干扰抑制

  • 相邻触发间隔提高到 ≥ 70 ms,在传感器最小周期(≥60 ms)之上留出余量,减少上一发回波余波造成的偶发"假近距"。

5.5 无效回波与量程约束

  • 剔除盲区(< 2.000 cm)与超量程(> 450.000 cm)读数;上升/下降沿均设超时(3 ms / 40 ms),异常立即返回,绝不阻塞死等。

5.6 采样节奏与抗串扰

  • 相邻触发间隔 ≥ 60 ms,满足 HC-SR04 回波余波衰减要求,避免上一发脉冲造成的"假近距"。

  • 测量(16 Hz)与显示(4 Hz)解耦,测量保持高频,显示按需刷新,画面稳定。

5.7b 校准(比例/偏置)

  • distance = measured × SCALE/1000 + OFFSET,用已知距离标定,消除传感器固定/比例系统偏差(HCSR04_CAL_SCALE_PERMILLE、HCSR04_CAL_OFFSET_MILLI_CM)。

5.7 人机与显示鲁棒性

  • 按键采用 GPIO1 下降沿中断锁存 + 15 ms 重触发消抖:测距阻塞期间按下也不丢失,轻按即响应。

  • LCD 采用变化才写 + 逐字跨半区寻址(仅在列 8 处重设地址),既减少总线占用又避免拖影。

  • 修正两处生成代码/配置缺陷:SysTick 装载值导致的 10 ms 快闪(改为 1 ms 基准做 1 Hz 心跳);LPUART0 引脚未复用导致串口无输出(在 app_ext.c 显式复用 P0_2/P0_3)。


6. 关键参数

参数值位置
时基分辨率1 µs ≈ 0.017 cmapp_ext.c CTIMER1
距离分辨率/单位0.001 cmhcsr04.c
温度补偿HCSR04_TEMPERATURE_C = 20hcsr04.h
滤波窗口7(中值 + MAD 近邻均值 + 跳变确认)hcsr04.c
跳变门控>1.000 cm 需连续 3 次确认hcsr04.h
用户校准SCALE / OFFSET 可调hcsr04.h
有效量程2.000 – 450.000 cmhcsr04.h
测距频率≈14 Hz(70 ms)led_blinky.c
刷新频率≈4 Hz(250 ms)led_blinky.c
显示格式<量程> <距离> 3 位小数led_blinky.c
日志LPUART0 115200 8N1led_blinky.c

7. 验证方法

  • 编译:cmake --preset debug && cmake --build --preset debug(产物 debug/test.elf)。

  • 烧录后打开串口(pyserial-miniterm /dev/ttyACM0 115200),应看到:

    [boot] BOARD_InitHardware done
    [boot] APP_ExtInit done, timer=...
    [boot] LCD_Init done
    [boot] entering main loop
    distance mc=123456 mode=0
    button event: mode=1 (50cm)
  • 功能核对:移动挡板时读数随之变化且保留 3 位小数;按 SW3 循环 FULL→50cm→200cm;拔掉传感器显示 NO ECHO 不卡死。

微信图片_20261007114406_85_16.jpg


8. 精度分析与局限

  • 软件能保证的:时序无软件抖动(硬件捕获)、系统误差已做温度补偿、随机噪声经切尾平均显著减小、无死等、边界安全。

  • 物理上限:HC-SR04 自身精度约 ±0.3 cm,且受被测面材质/角度、温湿度、气流影响;显示 3 位小数属"分辨率",末位仍会小幅跳动,真实精度以传感器规格为准。

  • 供电与去耦、ECHO 分压质量、探头安装方向都会影响实测稳定性。


9. 后续可改进方向

方向收益代价
LPADC 读内部温度,自动温度补偿免手工设定温度中(需新增 LPADC 配置)
中断式捕获 + 状态机(非阻塞测距)进一步降低 CPU 占用与延迟中
自适应平均(静止多平均、变化快少平均)兼顾稳定与响应中
增加中值+均值混合/卡尔曼更平滑中
LCD 换 PCF8574 I2C 背包接线由 6+ 降到 2 线需改驱动
多点校准(已知距离标定系数)抵消传感器固定偏差低

10. 交付物清单

  • 固件:led_blinky.c、hcsr04.c/.h、lcd1602.c/.h、app_ext.c/.h

  • 构建:CMakeLists.txt、frdmmcxa153/prj.conf(driver.ctimer、driver.inputmux 等)

  • 文档:WIRING.md(接线)、REPORT.md(本报告)




关键词: 简易     成果     超声波     测距仪     实践    

共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]