不用怀疑,超声波测距电路设计,核心难点从来不在“发射”也不在“接收”,而在于把“发射—空中传播—回波接收—信号处理”这条完整的链路,从原理图变成一块真正能稳定测距的板子。这块板子做出来不难,但做到盲区小、距离远、测量稳定、不受环境干扰,很多细节只有亲手调过才明白。这篇博文我按一个完整的项目流程来拆解:先讲方案选型的思路,再讲发射端怎么驱动、接收端怎么把微弱的回波从噪声里捞出来,最后讲主控怎么把时间差换算成距离,并把我在调试中踩过的坑一起列出来,给大家做个参考。
1. 系统方案与关键器件选型
1.1 测距基本原理
超声波测距的原理一句话就能讲清楚:发射换能器发出一束超声波脉冲,声波在空气中传播,遇到障碍物后反射回来,接收换能器收到回波信号。只要测出从发射到接收到回波的时间差 t,再乘以声速 c,除以 2,就能得到障碍物到探头之间的距离。
公式很简单:距离 d = (c × t) / 2。除以 2 是因为声波走了个来回,实际距离是声程的一半。
声速 c 在空气中并不是一个固定值。标准大气压下,20°C 时声速大约是 343 m/s,温度每升高 1°C,声速大约增加 0.6 m/s。这个温度漂移听起来不大,但在 2 米以上的测距场景里,温差带来的误差就能到厘米级别。所以在精度要求高的场合,必须加温度传感器做补偿。后面我会详细说补偿怎么实现。
1.2 40kHz 换能器:为什么是它
市面上绝大多数超声波测距方案选择 40kHz 作为工作频率,这不是随便定的。频率和探测距离是一对矛盾:频率越高,空气中衰减越大,测距距离越近;频率越低,波长越长,对小型障碍物的分辨能力越差,而且探头体积会更大。40kHz 是长期工程实践折中出来的结果,兼顾了探测距离、分辨率和器件成熟度。
常见的压电陶瓷超声波换能器有“一发一收”型号,比如国产的 TCT40-16T/R,也就是发射头 16T、接收头 16R 这一对。发射头的中心频率在 40kHz 左右,接收头的谐振频率和它对上。选型时注意两个关键参数:发射灵敏度和接收灵敏度。发射灵敏度高的探头,同样的驱动电压下声压更强;接收灵敏度高的探头,同样的声压下输出信号电压更大。这两个参数直接决定了整个测距系统的极限距离,选型阶段务必优先看。
顺带提一句,有一种器件叫“收发一体”压电晶片,也就是发射和接收共用同一个探头,省了一个探头,但需要额外的收发隔离电路来防止发射信号直接把接收电路打饱和。对新手来说,一发一收是更稳妥的起点,设计难度低很多,调试也更方便。
1.3 系统架构划分
把整套电路按功能拆开,就清晰了。整个系统可以划分为四个功能块:发射驱动电路、接收信号调理电路、主控计时与数据处理电路、电源与接口电路。
发射驱动电路要解决的问题是:把主控给出的 40kHz 脉冲信号,放大到足够高的电压去驱动压电陶瓷片,让它能产生足够强的声压。接收信号调理电路要解决的问题是:把接收探头输出的几十微伏到几毫伏级信号,经过放大、滤波,变成主控能识别的数字电平信号。主控部分我以前用 STM32 比较多,也可以用普通单片机,核心是利用定时器捕获回波脉冲的到达时刻。电源部分看似简单,但超声波发射瞬间电流很大,如果电源纹波控制不好,接收电路的噪声就会跟着飙升。
2. 发射驱动电路设计
2.1 驱动方案对比
发射驱动最常见的有三种方案:三极管单管驱动、推挽驱动、变压器升压驱动。三种方案我都在实际项目中用过,差别很明显。
单管驱动电路最简单,一个 NPN 三极管加一个集电极电阻,主控 IO 口输出 40kHz 方波,控制三极管导通和关断。但这种方案驱动电压只有电源电压 3.3V 或 5V,加在探头上的有效电压太低,发射声压偏弱,有效测距距离很难超过 2 米。
推挽驱动用两个三极管或 MOS 管组成半桥结构,给探头两端提供正负对称的方波驱动,相当于把驱动电压翻倍,发射能量明显增强。我在 5V 系统里做过推挽驱动,实测有效测距可以做到 3 米左右。
变压器升压驱动是我个人最常用的方案。通过升压变压器把驱动电压从 5V 升到 20V 甚至更高,同时利用变压器的阻抗变换匹配探头阻抗,发射声压能提升好几个等级。配合低噪声接收链路,实测 5 米以上没问题。缺点是电路多了一个磁性元件,成本和体积略有增加,但超声波测距里这点代价完全值得。
2.2 变压器升压电路关键参数
发射驱动电路的核心是升压变压器的设计。市场上有现成的超声波升压变压器卖,中心抽头结构,初级和次级的匝数比通常选 1:10 到 1:20 之间。我常用的是初级 2 个绕组各 10 匝、次级 200 匝的成品变压器,5V 推挽驱动下,次级能输出大约 100V 的峰峰值。
这里要重点讲一讲变压器的阻抗匹配作用。压电陶瓷换能器在谐振频率附近表现出容性阻抗,如果不做匹配,大量能量会反射回驱动电路。方法是在变压器初级串联一个匹配电感,或者调变压器的漏感,让整个驱动回路的等效阻抗在工作频率下呈纯电阻。这个匹配电感的计算并不复杂:先测出或查出探头在 40kHz 附近的等效电容 C,谐振点匹配电感 L 由公式L = 1 / (4π²f²C)算出。比如探头等效电容 2.5nF,40kHz 下算出来大约是 6.3mH。如果次级电感量不够,可以在次级并联一个电容做谐振补偿,同样按谐振公式计算。
方波驱动不能直接理解成“只要在谐振频率上就能输出最大声压”。驱动脉冲串的持续时间和重复频率同样影响发射波形。脉冲串太长,虽然声压大,但盲区会变大,因为发射余波还没衰减完,接收端没法开始工作;脉冲串太短,声压又不够。我一般把脉冲串宽度设在 8 到 16 个周期,也就是 200 到 400 微秒,具体值需要根据实际探头和驱动电压调试确认。
2.3 驱动管选型与死区控制
选驱动管的时候要注意三个参数:耐压、峰值电流、开关速度。变压器初级在关断瞬间会产生反电动势,如果不加保护,电压尖峰很容易超过三极管的 Vceo 击穿电压。用 MOS 管的话,通常需要在集电极或漏极加一个 RC 吸收电路,或者用 TVS 管做钳位。我在早期的版本里没加保护,连续工作几小时就烧过驱动管,后来老老实实加上吸收电路,再没出过问题。
如果采用推挽驱动结构,两个驱动管交替导通,必须留出死区时间。死区太短,两个管子同时导通会造成电源短路,电流猛增;死区太长,变压器初级电流断续,影响升压效率。用 STM32 定时器产生互补 PWM 时,硬件上可以直接配置死区时间,通常设置在 0.5 到 1 微秒就够用。如果只是用普通 GPIO 翻转电平的方式产生方波,注意在软件上保证两个 IO 口的翻转时刻有微小间隔,不要同时切换。
3. 接收信号链设计
3.1 从微伏级信号到数字脉冲
接收端是整个电路的难点所在。超声波在空气中衰减很快,经过几米距离的传播后,接收探头输出的回波信号可能只有几十微伏到几毫伏。要在噪声背景下把这个信号可靠地检测出来,接收电路通常分这几级:前置放大器 → 带通滤波器 → 可变增益放大器(TGC)→ 比较器 → 主控输入捕获。
这个信号链的设计思路是逐级“提纯”:前置放大器把信号放大到便于处理的幅度,带通滤波器把 40kHz 附近的信号留下、把其他频段的噪声滤掉,自动增益控制解决“近处信号强、远处信号弱”的动态范围问题,最后比较器把模拟信号转成数字脉冲。
前置放大级是整个接收电路的噪声天花板。第一级放大器的噪声系数决定了整条链路的信噪比,所以第一级尽量选低噪声的运放,比如 ADA4898 这类低噪声器件。增益不要在第一级拉太高,20dB 到 30dB 比较合适,太高容易饱和,太低则后级噪声贡献占比变大。这里有个容易忽略的细节:接收探头和运放之间的连接线要尽可能短,而且最好用屏蔽线。探头引线在这个环节相当于一根接收天线,环境里的各种电磁干扰都会从这根线上溜进来。
3.2 带通滤波器设计值与实现
接收信号里的噪声成分很杂:工频 50Hz、日光灯镇流器的几十kHz 干扰、电机高速运转产生的宽频噪声、还有各种电磁开关产生的脉冲干扰。用带通滤波器把频率限制在 40kHz 附近一个较窄的频带内,是提纯信号最有效的手段。
滤波器的中心频率定在 40kHz,带宽通常设定为中心频率的 10% 到 20%,也就是 4 到 8kHz。带宽太窄,通带内的信号衰减会变大,而且温度变化导致换能器谐振频率漂移时,信号容易被滤掉;带宽太宽,噪声抑制效果变差。我通常把 Q 值控制在 5 到 10 之间,工程上比较均衡。
有源二阶带通滤波器是性价比最高的方案,一个运放配几个电阻电容就能搞定。用运放的 Sallen-Key 拓扑或者多反馈拓扑都可以。多反馈结构(MFB)对电阻电容的灵敏度更低,稳定性更好,对硬件设计来说更友好。设计时可按这个顺序计算:先确定中心频率 f0 为 40kHz,确定 Q 值取 8,再根据你选定的电容值算出电阻值。市面上很多在线滤波器设计工具可以帮你算,但算完之后一定自己复核一遍:用实际选型电容的标称值重新计算中心频率,确认偏差在可接受范围。
实际上,很多项目的接收电路不会用高阶滤波器,而是利用接收换能器本身的窄带特性。压电陶瓷换能器本身就是个高品质因数的带通滤波器,中心频率在 40kHz 附近,带宽只有几 kHz。这意味着换能器在“转换声压为电压”的同时,已经滤掉了大部分带外噪声。电路里的一级低阶滤波,其实是做个补充。明白这个逻辑再设计接收电路,就不容易走极端堆高阶滤波器了。
3.3 可变增益与动态范围问题
超声回波有非常宽的动态范围:近距离障碍物回波很强,甚至能到几百毫伏;远端障碍物的回波很弱,可能只有几毫伏。如果固定增益,近处信号会把放大器推到饱和,等放大器恢复线性,强信号造成的振铃还会把后续的微弱回波淹没。这就是为什么要做自动增益控制。
工程上常用的做法是 STC(灵敏度时间控制),也就是 TVG 电路——根据发射时刻的远近,实时调节接收增益:刚发射完的近段时间增益调低,随着时间推移增益逐渐升高。这样远端弱信号也能被放大到足够的幅度,而近处强信号也不至于饱和。实现方式有模拟的和数字的两种。模拟的做法是用 RC 指数衰减电路控制一个压控增益放大器的增益控制端;数字的做法比较简单,直接用 DAC 或数字电位器控制运放的反馈电阻。对新手来说,用 STM32 的 DAC 输出一个随时间变化的电压,去控制 VCA810 或者 PGA 芯片的增益端,软件上非常灵活,也容易调试。
如果没有可变增益电路,也有一个折中的妥协办法:把接收链路的固定总增益降下来,保证最近处的回波刚好不饱和,但这样远端回波就会比较弱,比较器可能触发不了。也就是说,测距范围会被压缩。在 1 米以内的近距离小项目里,这个妥协通常没问题,低成本方案里可以这么干。
3.4 比较器整形与阈值设置
回波信号经过放大滤波后,还是一个幅值变化的正弦波包络。要把它变成主控能捕获的电平跳变,需要用一个比较器。这里有个关键细节:比较器如果不加迟滞(滞回),在信号幅值刚好越过阈值的时候,噪声会导致比较器输出反复翻转,产生很多毛刺。主控如果把毛刺当成有效回波触发,测出的距离就会乱跳。
比较器加迟滞的办法很简单,在比较器输出端和正输入端之间接一个正反馈电阻,就能形成滞回窗口。阈值电压的取值需要综合考虑:太高了远端弱回波检不到,太低了近处的噪声可能误触发。我一般把阈值设在接收信号链路中间点附近,比如接收链路输出最大幅值 3.3V,阈值设在 100mV 到 300mV 之间,配合 TVG 增益控制,可以让最远端的有效回波刚好高出阈值一点点。
实际上,很多现成的模块会选择用接收探头的第二波特性和比较器触发来做测距。回波不是一束干净的单脉冲,而是一个有上升沿和拖尾的包络。如果直接拿比较器输出的第一个上升沿去触发计时,测到的往往不是主波前沿,而是包络幅度超过阈值的那一点。这会导致在一定信噪比下,近距离的目标测距值偏大、远距离的目标测距值偏小。所以要仔细调整阈值和增益,找到一个相对准的拐点。
4. 主控计时与温度补偿实现
4.1 STM32定时器与输入捕获
主控部分的计时精度直接决定了测距分辨率。声速约 343 m/s,一个来回的距离误差如果控制在 1mm,时间测量的误差就要控制在 0.0000029s,也就是大约 3 微秒。市面上绝大多数单片机定时器都轻松满足这个量级的要求。
我用 STM32 做过多个版本。发射时,用定时器的 PWM 输出模式产生 40kHz 方波,同时打开另一个定时器做输入捕获,等待接收比较器输出的上升沿。回波到达时,比较器输出跳变,输入捕获自动锁存当前计数值,CPU 只需要在中断里读取。这种方式不依赖于中断响应速度,计时精度很高。
注意盲区问题:发射脉冲串本身有长度,而且发射探头发射时,声波会通过探头外壳和结构件直接传导到接收探头。在这个“直接串扰”的信号没有衰减完之前,接收电路如果被它触发了,测到的就是障碍物距离非常近的错误值。解决办法是:发射结束后等一段时间再开启接收比较器使能,这段时间对应最近的测距盲区。比如等待 2ms 再开启接收,对应的盲区约为 34cm,系统就只能测 34cm 以上的目标。实际上,超声波测距模块普遍有 20cm 到 40cm 的盲区,就是这个原因。如果你需要测近距离,可以优化结构件隔离发射和接收探头的声桥传导,并在软件里适当缩短屏蔽时间。
4.2 声速温度补偿的计算
正常情况下我们取 c = 340 m/s 或者 343 m/s 去算距离就够用了,但要让测距数据经得起验证,还是要做温度补偿。声速与温度的关系在常温附近近似线性的经验公式是:
c ≈ 331.3 + 0.606 × T (m/s)
T 是环境温度,单位摄氏度。用这个公式算出来,20°C 时声速为 343.4 m/s,跟精确值非常接近。硬件上只需要加一个 DS18B20 温度传感器或者 NTC 热敏电阻,软件上在测距时读取温度,按公式修正声速。用 NTC 的话,需要先 ADC 采样,再查表或算公式得到温度,稍微麻烦一点,但成本低。
有朋友问过湿度对测距有没有影响。严格来说湿度会影响声速,但常温下 0% 到 100% 相对湿度造成的声速变化不到 2%,一般测距精度要求在厘米级的话,可以忽略。风的影响反而比湿度大,室外顺风和逆风情况下,超声波测距结果偏差会比较明显,这个只能通过多次测量取平均值来缓解。
4.3 软件滤波与异常值处理
即使硬件做得再干净,单次测量还是可能因为干扰产生异常值。我习惯在软件里加一个简单的滑动平均滤波,连续取 5 到 10 次有效测量结果,去掉最大值和最小值,剩下的取平均。这种做法在近距离、反射面平整的场景下效果很好,可以明显减小数据抖动。
还有一个必须处理的情况:没有回波。障碍物太远、吸音材料(海绵、布艺沙发、人体衣物)会把超声波能量大量吸收,此时接收端一直等不到回波。主控不能死等,要设置超时时间。我一般把超时时间设成 60ms,对应大约 10 米的测量范围。超时后上报无效值,交由上层逻辑处理。注意超时定时器要够长,得大于你期望的最远测量距离对应的声程时间,否则会把远端有效回波误判为超时。
5. 实测调试与常见问题排查
5.1 调试仪器与基本流程
硬件调试工具是刚需:双通道示波器最好准备一台,带宽不用高,100MHz 就够用。调试时不光要看发射端波形,更重要的是看接收端整个信号链上每个节点的波形。我发现很多新手拿着数字万用表测接收信号,那是根本测不出来的,因为回波是微秒级的瞬态信号,万用表根本没响应。
我的调试流程一般是这样的:第一步,用示波器看发射端探头两侧的波形,确认 40kHz 方波干净、幅度足够、无明显振铃。第二步,把一个反射板放在探头正前方固定距离(比如 1 米),用示波器探测接收探头的输出端,确认能看到回波信号。这里要留意,接收到的信号是一个包络,开始很小,逐渐变大,再衰减下去。第三步,逐级检查放大器和滤波器输出端的波形幅度,确认链路各级增益正常。第四步,确认比较器输出端有干净的方波脉冲,并且下降沿(或上升沿)的位置能随障碍物远近对应变化。
5.2 发射余波串扰:最常见的“假回波”
调试中遇到最频繁的问题就是“近处没障碍物却一直报近距离值”。这个时候要先想到串扰。发射探头的驱动信号是几十上百伏的高压脉冲,即使探头本身只在 40kHz 谐振,压电陶瓷的瞬态响应也会产生很宽的频谱分量。这些分量可以通过三个途径进入接收链路:空间辐射耦合、电源共阻抗耦合、结构固体传导。
排查步骤是:用示波器观察接收链路的输出,但把接收探头从电路上断开。如果断开后输出端还有干扰波形,说明干扰是通过电路耦合进来的;如果断开后干扰消失,接上探头就出现,那大概率是通过探头接收到的声学串扰或辐射耦合。发射和接收探头之间装一个隔声片、拉开安装距离、或者在结构上让两者不直接接触,都能有效减小串扰。电路上,发射驱动电路的电源和接收放大电路一点要分开走线,最好各用独立的 LDO 稳压,防止发射瞬间的大电流引起地电位跳动。
5.3 距离近时而准、远而不准
如果你发现近距离测得很准,超过一米五左右就开始跳,最可能的原因是接收链路增益不足。远距离回波衰减很厉害,信号幅度接近噪声水平,比较器在噪底上反复触发,测距值自然乱跳。处理思路有三个方向:提高发射声压(升高驱动电压、增加脉冲串长度);提升接收链路增益(但要小心噪声同步放大);改善噪声(优化布线、滤波、屏蔽)。
另外一个容易被忽略的点是发射探头的驱动脉冲串长度对不同距离的影响。脉冲串越长,发射能量越集中在 40kHz,回波包络越“锐利”,远端信号检测能力越强。但是脉冲串过长也会让近距离目标的回波和发射串扰波形重叠,导致盲区增大。所以要平衡。我一般先固定 10 个周期的发射脉冲串,再看实际效果,远端不够就往上加,盲区变大就往下减,通过实验找这个平衡点。
5.4 温度影响与环境干扰
夏天和冬天测量同一面墙,如果程序里用的是固定 343 m/s 的声速,数据对比会差出几个厘米,这是正常的物理现象,不是机器坏了。加温度补偿后,这个偏差可以缩小到毫米级。注意温度传感器要尽量放在靠近探头的流通空气位置,不要贴在主控芯片附近,否则长时间运行后测的是板温而不是环境温度。
工业环境里的超声干扰也要留意。现在很多工厂里有用超声波清洗机、超声波焊接设备,它们的频率往往不在 40kHz 附近,但产生的噪声频谱很宽,还是可能对被测回波造成干扰。此时可以在软件里增加“时间窗口”验证:只在预期回波到达的时间窗口内打开比较器检测,窗口之外的信号一律忽略。这样即使干扰幅度超过阈值,只要它不在预期时刻,也不会被当成有效回波。
5.5 常见问题速查表
| 现象 | 可能原因 | 排查与处理 |
|---|---|---|
| 完全无回波 | 发射驱动电压太低、探头损坏、接收链路增益不足 | 示波器查发射波形、探头输出,锁定失效级 |
| 近距离“假回波” | 发射串扰、电源耦合、结构传导 | 断开探头对比测试,隔离结构、分电源走线 |
| 数据跳动大 | 比较器无迟滞、阈值过低、噪声过大 | 增加迟滞电阻、提高阈值、优化滤波 |
| 远距离测不到 | 增益不足、脉冲串太短、方向性偏了 | 增大驱动电压、增加脉冲串长度、调整探头朝向 |
| 温度漂移误差 | 未加温度补偿或传感器位置不当 | 加 DS18B20,声速按公式修正 |
| 盲区过大 | 直接串扰信号持续时间太长 | 优化结构隔离、缩短脉冲串、软件屏蔽时间调短 |
6. 实测数据与参数记录心得
做超声波测距,成功的标准不是“能测到”,而是“测到的数可复现、可信”。不要只记录一个距离下的测量值,要把多个距离下的实际值、误差值、环境温度、发射脉宽、增益设置都记成一个表格。这个表在你改版调参的时候非常有价值。
我自己的项目中,在做好结构隔离、加温度补偿、调好 TVG 参数后,用 10 个周期的发射脉冲串,实测在 30cm 到 4m 范围内误差能控制在 ±1cm 以内,4m 到 6m 范围误差会扩大到 ±2cm 左右,主要受风力影响。这个数据在同级别方案里已经算表现不错了。之前的版本没有做结构隔离,50cm 以内基本没法用,数据全是乱的。对照这些记录再回头调参数,效率高很多。
这里单独提醒一个很多人忽略的细节:探头的朝向和反射面的角度对测量结果影响极大。超声波探头本身有指向性,发射能量集中在正前方的一个锥形区域里,接收同样有方向性。反射面如果是光滑硬表面且与声束垂直,回波最强;如果是斜面,声波会反射到别的方向去,接收端可能完全收不到回波。所以实际项目里,探头的安装角度、被测物的表面性质,要与电路参数放在一起综合考虑。
7. 总结之外:几个沿用至今的设计习惯
最后分享几个我从这个项目里沉淀下来、后来做其他模拟前端电路也一直在用的习惯。
第一,接收信号链的第一级永远是噪声控制的重心,低噪声运放的选型、走线、参考地处理,再怎么认真都不为过。第二,有升压变压器的电路,必须加吸收电路,别让开关管的尖峰电压值逼近器件耐压极限。第三,调试模拟电路,示波器是两个通道起步,有条件上四个通道,同时看发射驱动、接收前置放大输出、滤波输出、比较器输出,你才能看清楚信号是怎么一步步变化的。第四,所有电路参数调整后,一定要重新测一组完整数据并记录,不要靠感觉判断“好像变好了”。
超声波测距电路看上去是一个入门级的模拟电路项目,但真正把它做稳定,涉及的已经远不止“会算公式”。噪声、阻抗匹配、地回路、结构声学隔离、温度物理特性,每一个维度都要照顾到。正因为如此,这个项目特别适合做模拟电路基本功练习。有人问我“推荐第一个硬件项目做什么”,我一般会建议先做这个——它不复杂,但足够让你把示波器用熟,也足够让你体会:真实世界里的信号,永远要比教科书里的波形复杂得多。