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

共1条 1/1 1 跳转至

过程贴-简易超声波测距仪实践

菜鸟
2026-09-18 20:11:26     打赏

【FRDM-MCXA153 实践】从零驱动 HC-SR04 超声波测距 + 1602 LCD 实时显示

一、项目背景

手头现在有一块 NXP FRDM-MCXA153 开发板(MCXA153,Cortex-M33),做一个最经典的入门小项目练手:超声波测距 + 屏幕实时显示。
需求很简单——每秒测两次距离,LCD 上显示 Dist: 123.4 cm,同时通过串口上传数据。
硬件清单:FRDM-MCXA153、HC-SR04 类超声波模块(型号 3942)、NHD-0116AZ 字符 LCD(HD44780 兼容,16×1)。


二、硬件连接

模块 引脚 开发板

超声波 Trig D2(P2_4,GPIO 输出)

超声波 Echo D4(P2_5,GPIO 输入)

LCD RS         D7(P3_1)

LCD E         D8(P3_15)

LCD DB4~DB7 D9/D10/D11/D12(P3_14 / P2_6 / P2_13 / P2_16)

LCD R/W 直接接地(只写模式)

两块模块都用杜邦线接在 Arduino 排针上,LCD 的 V0 接 10k 电位器调对比度,背光串电阻接 5V,这里我用另一块开发板进行了5V供电。

2cd1e322ae26265d836c3c09f398c098.jpg

三、软件设计

工程基于 MCUXpresso SDK 裸机框架,全部用户代码放在 source 下:


app_delay.h:整套延时/计时基于 DWT->CYCCNT 周期计数器实现(APP_DelayUs / APP_DelayMs / APP_GetTick / APP_Elapsed),不占用任何定时器外设,也不需要中断。

ultrasonic.c/h:Trig 发 10µs 高电平脉冲,然后轮询 Echo,用 DWT 计数测高电平脉宽,按 时间(µs) × 0.0343 cm/µs ÷ 2 换算距离,超时 60ms 返回 -1.0f 表示无回波。

lcd1602.c/h:4 位数据总线、只写模式驱动。

NXP.c:主循环每 500ms 测一次,刷新 LCD 并 PRINTF 到 LPUART0(115200)。

四、踩坑与解决(重点)

1. Echo 永远读到 0

MCXA153 的外设上电后处于复位保持状态,用 GPIO 前必须 CLOCK_EnableClock() + RESET_ReleasePeripheralReset()。更坑的是:PORT_SetPinMux() 只设 MUX,不会使能输入缓冲 IBE,必须改用 PORT_SetPinConfig() 并把 inputBuffer 设为 kPORT_InputBufferEnable,否则 GPIO_PinRead() 恒为 0。这个坑花了我最久。


2. LCD 只显示 8 个方块

NHD-0116AZ 用的是 ST7066U,1/16 Duty,内部 DDRAM 竟然是 8×2 结构:物理第 1~8 列对应 0x00~0x07,第 9~16 列对应 0x40~0x47。所以 Function Set 必须用 0x28(4 位 / 2 行,N=1),用 0x20 的话控制器只扫 COM0~7,右半边直接没信号。驱动里我在第 8 列自动切换 DDRAM 地址解决。


3. 按复位键后屏幕每次内容都不一样

根因:复位释放到 LCD_Init() 之间有 1~3ms 总线悬空,E 是下降沿锁存,噪声抖一个沿就被当成"写数据",随机字节进了 DDRAM。软件上在 main() 第一句加 LCD_BusIdle() 把窗口缩短到 0.3ms,但根治要靠硬件——E 和 RS 各加 10k 下拉到 GND。


4. 延时基准不可信(最隐蔽)

BOARD_InitBootClocks() 是空函数,系统跑复位默认时钟,而 SystemCoreClock 只是 C 语言初值,从未和寄存器校验过。一旦不符,所有延时按比例缩放,LCD 时序直接不达标。解决办法:在 APP_InitDelay() 里先调用 SystemCoreClockUpdate()。


五、最终效果

上电后 LCD 稳定显示 Dist:  xx.x cm,拿手掌在 5~150cm 范围内移动,读数跟随流畅、无明显跳变;超出量程或无回波时显示 Dist:  ---- cm,串口同步打印 Distance: ---- cm 。

acde2e7a8aca11b15aefd8edd16470e9.png

六、小结

这个项目代码量不到 500 行,但覆盖了嵌入式入门最容易翻车的几件事:外设复位释放、输入缓冲配置、复用功能与时序、时钟基准校验、5V/3.3V 电平兼容。建议新手在做 GPIO 采集类实验时,先把"读数是否真实"这个问题单独验证掉(比如先把 Echo 脚接 3.3V,确认 GPIO_PinRead 能读到 1),再往上叠算法,能省下大量时间。



共1条 1/1 1 跳转至

回复

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