平台: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-SR04 | TRIG 触发、ECHO 脉宽对应距离 |
| 控制 | MCXA153 | 计时、滤波、换算、状态机、按键 |
| 人机 | NHD-0116AZ(16×1 LCD) | 4-bit 并口只写 |
| 交互 | SW3 按键 | GPIO 中断,切换量程 |
| 调试 | LPUART0 → MCU-Link VCOM | 115200 8N1 日志 |
| 指示 | 红色 LED (P3_12) | 1 Hz 心跳 |
3. 引脚与接线(摘要)
| LCD RS / EN | P3_1 / P3_30 | J6-2 / J6-1 |
| LCD D4–D7 | P1_0 / P1_1 / P1_2 / P1_3 | J6-6 / J6-4 / J6-5 / J6-3 |
| LCD RW / VDD / VSS | GND / 5V / GND | V0 经对比度网络(不可直接接 GND) |
| HC-SR04 TRIG | P3_7 | 触发输出 |
| HC-SR04 ECHO | P1_8(CT_INP8) | 经 1kΩ/2kΩ 分压到 ~3.3V |
| 按键 | P1_7(SW3) | 板载,低有效 |
| 日志 | P0_2 / P0_3 | LPUART0(生成代码未复用,固件内显式配置) |
完整接线、对比度网络、注意事项见 WIRING.md。
4. 软件架构
| led_blinky.c | 主程序:初始化、主循环、显示格式化、按键状态机 |
| hcsr04.c/.h | HC-SR04 驱动:触发、硬件输入捕获、换算、滚动滤波 |
| lcd1602.c/.h | LCD 驱动:4-bit 只写、16×1 分半寻址、逐字刷新 |
| app_ext.c/.h | 扩展板级资源:引脚/时钟、CTIMER1 时基、LPUART0 复用、按键中断 |
| frdmmcxa153/、led_blinky/ | MCUXpresso Config Tools 生成文件(不手工修改) |
| WIRING.md、REPORT.md | 文档 |
主循环时序(led_blinky.c)
按键(中断锁存标志)→ 切换量程并立即刷新显示;
每 60 ms 测距一次(≈16 Hz),更新内部值并打印日志;
每 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 cm | app_ext.c CTIMER1 |
| 距离分辨率/单位 | 0.001 cm | hcsr04.c |
| 温度补偿 | HCSR04_TEMPERATURE_C = 20 | hcsr04.h |
| 滤波窗口 | 7(中值 + MAD 近邻均值 + 跳变确认) | hcsr04.c |
| 跳变门控 | >1.000 cm 需连续 3 次确认 | hcsr04.h |
| 用户校准 | SCALE / OFFSET 可调 | hcsr04.h |
| 有效量程 | 2.000 – 450.000 cm | hcsr04.h |
| 测距频率 | ≈14 Hz(70 ms) | led_blinky.c |
| 刷新频率 | ≈4 Hz(250 ms) | led_blinky.c |
| 显示格式 | <量程> <距离> 3 位小数 | led_blinky.c |
| 日志 | LPUART0 115200 8N1 | led_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 不卡死。

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(本报告)
我要赚赏金
