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

共1条 1/1 1 跳转至

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

菜鸟
2026-09-18 20:49:30     打赏

【FRDM-MCXA153 成果帖】HC-SR04 超声波测距 + 1602 字符屏实时显示(裸机 · 已完成)

方向标签:嵌入式入门 · GPIO/时序 · 传感器驱动 · 字符型 LCD
平台:NXP FRDM-MCXA153(MCXA153,Cortex-M33,复位默认 FRO 12 MHz)
工具链:MCUXpresso IDE 25.6 + arm-none-eabi-gcc + LinkServer(MCU-LINK CMSIS-DAP)
状态:✅ 已上板验证通过,串口与 LCD 双通道输出正常

一、项目概述

本项目的目标是做一个"看得见"的超声波测距终端:把 HC-SR04 类超声波模块(型号 3942)接在开发板 Arduino 排针上,每 500 ms 测量一次距离,结果实时刷新到 NHD-0116AZ(16×1,HD44780 兼容,ST7066U 驱动 IC)字符液晶上,同时通过 LPUART0 以 115200 波特率上传到 PC 串口助手。


选择这个题目的原因:传感器和屏幕都是 5 V 器件、都是时序敏感型,正好能把 GPIO 配置、精确延时、外设复位释放、4 位总线驱动这些基本功一次性踩透。全部用户代码放在 source 目录下,共 6 个文件,主循环代码量不到 500 行。

source/

├── NXP.c          # main:初始化 → 主循环(测距 / 刷新 / 上传)

├── app_delay.h    # 基于 DWT->CYCCNT 的 µs/ms 延时与计时

├── ultrasonic.c/h # 超声波驱动

└── lcd1602.c/h    # LCD 4 位总线驱动

二、系统框图

企业微信截图_17897343782938.png

数据流:main 每 500 ms 调用一次 ULTRASONIC_GetDistanceCm(),得到 cm 单位的浮点距离;该值同时送 LCD_ShowDistance() 和 PRINTF()。无回波/超时统一返回 -1.0f,两个通道都显示 ----。

三、电路原理图(接线等效图)

3.1 超声波模块

 FRDM-MCXA153 (Arduino 排针)          HC-SR04 / 3942

   +5V  ─────────────────────────────  VCC  (1)

   GND  ─────────────────────────────  GND  (4)

   P2_4 (D2)  ────────────────────────  Trig (2)   推挽输出

   P2_5 (D4)  ◄───────────────────────  Echo (3)   输入(上拉+IBE)


3.2 字符液晶(4 位总线 · 只写模式)

企业微信截图_17897345473135.png

3.3 引脚汇总表

企业微信截图_17897346037253.png

⚠️ 硬件加固建议:E 与 RS 各加一只 10 kΩ 下拉到 GND(DB4~DB7 也建议加)。MCU 复位时 PCR 会复位、内部上下拉失效,只有外部电阻能消除"复位瞬间总线悬空被噪声当成写指令"的问题。

四、主要参数情况

4.1 测距参数

企业微信截图_17897346689208.png

4.2 LCD 时序参数(规格值 vs 本驱动取值)

企业微信截图_17897346905966.png

五、软件设计与项目代码

5.1 延时/计时层(app_delay.h)

刻意不用 SysTick:MCXA153 的 SysTick 时钟源复位默认是 1 MHz 的 clkroot_1m,切换后还可能停止计数,导致延时死循环。改用内核自带的 DWT 周期计数器,直接按处理器时钟计数,无需任何中断;企业微信截图_17897348493709.png

5.2 超声波驱动核心(ultrasonic.c)

企业微信截图_17897348586219.png

5.3 主循环(NXP.c)

企业微信截图_17897349042767.png

注意本工程 PRINTF_FLOAT_ENABLE=0,printf 不支持 %f,全部用"整数 + 小数"拼装;LCD 侧则先转成 0.1 cm 整数再拆位,顺便完成四舍五入,同时整行 16 字符全量重写(尾部补空格)实现无闪烁、无残影刷新。


六、实现步骤

1.环境搭建:安装 MCUXpresso IDE 25.6 与 FRDM-MCXA153 SDK,用 Config Tools 生成 board、device、drivers 等基础框架(本工程 BOARD_InitBootClocks() 为空,系统跑复位默认 FRO12M)。

2.硬件接线:按第三节接线图把超声波接 D2/D4,LCD 接 D7~D12,R/W 与 DB0~DB3 接地,V0 接 10 kΩ 电位器调对比度。

3.打通延时基准:实现 app_delay.h,在 main() 开头调用 APP_InitDelay(),并在调试器里确认 SystemCoreClock == 12000000。

4.超声波单点验证:先只做 Trig 翻转 + Echo 读电平的裸测试,确认 Echo 脚接 3.3 V 时 GPIO_PinRead 能读到 1(这一步能排除绝大多数"读不到信号"的假故障),再加脉宽测量与距离换算。

5.LCD 自检:用 LCD_DIAG_PATTERN=1 开关显示 0123456789ABCDEF,逐位确认 16 个字符位置都有扫描信号,再关掉开关进入正常显示。

6.联调与标定:把 ultrasonic 与 lcd1602 合入主循环,用卷尺在 5/20/50/100 cm 四点比对读数。

7.收尾:调整刷新周期与显示格式,把 LCD_BusIdle() 提到 main() 第一句。

七、如何开启运行

① 硬件准备:FRDM-MCXA153 一块、HC-SR04 一块、NHD-0116AZ 一块、10 kΩ 电位器一只、杜邦线若干。用 USB 线连接板载 MCU-LINK 调试口到 PC。

② 导入工程:MCUXpresso IDE → File > Open Projects from File System… → 选择工程根目录 NXP(.project / .cproject / NXP.mex 已就位)。

③ 编译:IDE 内:右键工程 → Build Project;命令行:进入 Debug 目录后执行 make all,产物为 NXP.axf。

④ 下载运行:调试配置选 NXP LinkServer Debug.launch(LinkServer + MCU-LINK CMSIS-DAP,非 J-Link),点击 Debug/Resume。程序会自动停在 main,再点一次运行即可。

⑤ 观察结果:

LCD 上电后先清屏,随即显示 Dist:  xx.x cm,手掌前后移动读数实时跟随;

打开串口助手,参数 115200 / 8 / N / 1,选择 MCU-LINK 虚拟串口,可见 banner 与每 500 ms 一行的 Distance: xx.xx cm。

⑥ 复位:按 SW1 可热复位。若屏幕出现残留字符,属已知的总线悬空问题,按第三节加下拉电阻即可根治。

八、调试记录(关键问题与解决)

企业微信截图_17897350895539.png

九、成果与不足

成果:实现了"测距 → 显示 → 上传"完整闭环。LCD 显示稳定无闪烁,5~150 cm 范围内读数跟随流畅;无回波时 LCD 与串口同步给出 ---- 提示,不会出现乱码或卡死。固件体积仅 17.3 KB Flash / 284 B RAM(不含堆栈),资源占用极低。

4d84ce8d37793ba83c4587b32c98c76f.jpg

09534c2f36eb771b3517715d90bf08bc.png

不足与后续计划:

1.  Echo 脉宽用轮询 + DWT 实现,CPU 在测量期间被独占,后续可改为输入捕获(CTimer)或加上多次采样取中值滤波;

2.  目前只做单向测距,后续可扩展到 3 路超声波做避障小车,或用 FreeRTOS 把测距、显示、上传拆成独立任务。


共1条 1/1 1 跳转至

回复

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