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

共1条 1/1 1 跳转至

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

菜鸟
2026-09-09 14:44:35     打赏

上一篇开箱备齐了料、定了思路:CTIMER 捕获量 Echo 脉宽,GPIO 模拟 8 位并口刷 LCD。本以为接下来就是顺理成章地接线、写驱动、跑通收工——结果 LCD 上一排黑块,硬生生把整个排障流程逼了出来。

这一篇按时间线摊开:先说接线怎么安排、三个必须提前算账的电平坑(§1、§2),再说分步开发的顺序(§3),然后是两场硬仗——没有电位器怎么把对比度窗口夹出来(§4)、黑块怎么从"怀疑人生"排到"一根断线定案"(§5),最后用 3 点中值滤波收尾(§6)。翻车的心路和排查思路都如实保留,给同样在 3.3V MCU 上接 5V 器件的朋友避避坑。

1. 接线:电源与信号分开对待

动接线之前先想明白一件事:外设吃 5V,MCU 的 IO 却是 3.3V——电源归电源,信号归信号,中间该分压的分压,不能一根线怼到底。

板子 Arduino 座的 J3-10 是 SYS_5V0(5V),HC-SR04 和 LCD 的逻辑供电、背光都从这里取;J3-12 是 GND,三者共地。注意别误接 J3-8 的 3.3V——这两个器件都要 5V。

HC-SR04 只占两根信号线:

    Trig → P1_9(J2-20),GPIO 输出,发 ≥10 µs 高电平;

    Echo → P1_8(J2-18),接 CTIMER0 的 CAP0 做捕获。

LCD 是 16 脚全接:RS=P3_15、E=P3_14,DB0~DB7 分别落到 Arduino D0~D7(P1_4、P1_5、P2_4、P3_0、P2_5、P3_12、P3_13、P3_1)。

image.png

 2. 通电前必须想清楚的三个坑

线不难接,难的是几处电平和时序的边界账,都是 5V 器件混 3.3V MCU 的经典题:

Echo 一定要分压。 Echo 是 5V 电平,而 P1_8 不耐 5V。我用 10 kΩ 上臂 + 15 kΩ 下臂(对地),中点约 3.0V,既低于 IO 上限 3.6V,又高于 3.3V 逻辑的高电平阈值。直连会超 VDD+0.3V,可能打坏。

LCD 的 R/W 必须接地、软件只写。 一旦读忙标志,LCD 会把数据线推到 ≥3.9V 回灌进 3.3V 的 IO。接地只写就从硬件上断了这条路。

1×16 屏的 DDRAM 在第 9 个字断开。左 8 字地址 `0x00~0x07`,右 8 字是 `0x40~0x47`。连续写 16 个字不重新设地址,右半边就空白。驱动里写到第 9 字要跳一次地址。

这三个坑在方案阶段就提前算过,后面验证下来:前两个决定硬件能不能活,第三个决定显示对不对——提前算账,比出了问题再翻手册快得多。

 3. 开发顺序:先超声,再 LCD,最后合并

软件按"分步验证"来,保证每一步只有一个变量:先只上超声,串口打印 µs 和 cm,用示波器看 Echo 波形,拿尺子在 10/30/100 cm 标定,确认分压后的边沿 CTIMER 能认到;再只上 LCD,写固定字符串 0123456789ABCDEF,确认 16 个字全亮、切行正确;最后合并成 10 Hz 刷新。

超声这一路出奇地顺:分压一接、CTIMER 一配,串口里的距离值和尺子量出来的基本一个意思。正以为这项目半天就能收工——LCD 一步直接翻车,而且一翻就是连着两个坑,一个比一个隐蔽。

 4. 没有电位器:V0 的三连测

第一个坑栽在对比度上。开箱清单里列的 10 kΩ 电位器实际一直没到手,V0(LCD pin3,对比度偏置)就先被暴力试探了一轮:

接法

VLCD = VDD−V0 

现象

悬空

不定完全不显示
接GND5.0V(超过规格上限)一排黑点,对比度拉满
接 3.3 V1.7 V(低于下限 4.2 V)完全无显示

从两个方向把窗口夹了出来:V0 必须落在 0.3~0.8 V。V0 是模拟偏置脚,不是逻辑电平脚,不能拿电压轨直接怼。最后用 10 kΩ + 1 kΩ 固定分压得到 0.45 V,一次到位——结论是电位器不是必需品,固定分压照样玩,阻值不挑、只挑比例(约 9:1~10:1)。

V0 到位,屏底果然变浅了。可是里面还是一排黑方块。对比度只是第一层,真正的硬仗在后面。

5. 黑块大战:从对比度到断线

黑块是什么?查资料确认:它是 ST7066U 的上电默认态——没收到 Function Set 之前它就是这个样子。V0 都对了还黑块,说明我写的初始化一个字节都没被它收下,写入链路根本没通。排查路径:

1. R/W 接地:万用表通断确认 pin5 对地 0 Ω,排除;

2. 板载 RGB LED 当总线监视器:DB3/DB5/DB6 与 RGB 灯共脚,低电平亮。重新编译烧录后灯从"纯白"(引脚停在初始低电平,写屏代码没在跑)变成"青偏白"——这是总线静态电平的指纹:主循环刷完屏停在空格字符 0x20(只有 bit5 高)→ 蓝灯+绿灯亮、红灯灭。灯色一变,说明 MCU 侧写总线正常,问题锁定在 LCD 收不到;

3. 总线自检:在代码里加了个编译期开关,十根线(RS/E/DB0~DB7)逐根单独拉高 1.5 秒,串口实时报"当前拉高的是哪根、该去 LCD 第几脚量"。万用表黑表笔接 GND,跟着串口提示一轮量下来:九根全是 3.25 V,唯独 pin13(DB6)量到 4.66 V

4. 物理判据定案:MCU 是 3.3 V 推挽输出,物理上不可能给出 4.66 V——这只能是**悬空脚被泄漏电流拉高**的读数。把线从 MCU 端断开 pin13 还是 4.66 V,断开 LCD 端量线本身又是 3.2 V,两头都好、接上不对 → 断点在接头和针脚之间。重接 pin13,一次点亮。

事后复盘也很自洽:DB6 悬空偏高后,清屏 `0x01` 被读成 `0x41`、显示开 `0x0C` 变 `0x4C`,全是非法命令被无视,只有 Function Set 因为 DB6 是无关位侥幸执行——所以屏有电、有偏置、就是永远初始化不完,黑块锁死。断的要是 DB0~DB2 这种低位线反而会"能初始化但显示乱码",只有 DB6/DB7 高位线断才会黑块死锁,和现象严丝合缝。

这场仗打下来几乎没动示波器:万用表 + 串口 + 板载 LED,三个土办法把断点钉死。工具不在贵,在会不会设计判决性实验。

image.png

7. 一点小提醒 

DB3/DB5/DB6 和板上 RGB LED 共用,写屏时三色灯会跟着闪,属正常现象,别以为是故障。另外 3.3V 直驱 LCD 的高电平比规格 `VIH=3.5V` 差 0.2V,这颗屏实测能认 3.3V——本次黑块排查最后排除的就是这个疑点。但如果你的屏乱码或无显示,先跑一遍总线自检确认接线没问题,再怀疑电平:真到那一步,加一片 74AHCT125(5V 供电,VIH≈2.0V)电平转换即可,软件不用改。

8. 写在最后

image.png

回头看,这一篇从"以为半天收工"打到鏖战两轮:V0 三连测教会我模拟偏置脚不能拿逻辑电平的思维去接,黑块大战则验证了一个朴素道理——排障的本质是设计判决性实验:板载 LED 的颜色指纹、逐根拉高的总线自检、"4.66 V 物理上不可能"这个读数,每一步都在把嫌疑范围砍掉一半,而不是无头苍蝇式换线重试。

到这里,硬件、驱动都齐了:超声链路全窗口可测、LCD 稳定刷屏、显示值锁定不抖。下一篇出成果帖——框图、原理图、标定数据和完整演示,欢迎围观。


共1条 1/1 1 跳转至

回复

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