
想搞清楚超声波测距电路不能只停留在“买一个模块直接接上”的层面。我见过太多人用过HC-SR04或者类似的一体化模块接上STM32就能读距离但一旦想自己设计一个专用的测距方案比如要测更远的量程、要抗环境噪声、要自己控制发射功率或者要接入现有硬件系统时立刻就懵了。原因很简单现成模块把发射、接收、信号处理全部封装好了你根本看不到中间环节到底发生了什么。这篇文章我就把整个链路拆开从声波物理特性、器件选型、发射驱动、接收放大、比较整形到最后的MCU时间测量一步一步讲清楚尽量做到看完能自己画原理图、自己写驱动代码。1. 测距不只是“发个声再听个响”先搞懂声波在空气中的脾性设计电路之前先得从物理层面理解超声波在空气里是怎么传播的这决定了后面很多器件选型的方向。测距本质上是时间飞行法记下声波从发射到碰到目标反射回来被接收的总时间再乘以声速除以2就是单程距离。公式本身不复杂难点在于回波信号非常微弱而且声波在传播过程中衰减得厉害。1.1 频率选择为什么大家都用40kHz而不是200kHz空气中的声波衰减系数跟频率的平方成正比频率越高衰减越狠。40kHz左右的超声波在空气中的衰减系数大约在每米1到3dB这个量级空气湿度、温度都会影响实际值。如果用200kHz看起来分辨率更高但传播不到几米就衰减没了只适合极短距离或者液体介质场景。所以市面上绝大多数空气测距方案都选40kHz。反过来说如果是水下测距因为水对高频声波吸收弱得多就可以用更高的频率取得更好的分辨率这个差异得先分清。频率定了换能器就好选了。市面上的40kHz压电陶瓷超声波换能器分成发射专用T和接收专用R两类它们在结构设计上有明确的侧重。发射型换能器更注重把电信号转化成高强度的声波接收型更注重把微弱的声压变化转化成电信号灵敏度更高。电路设计时最好成对购买比如常见的TCT40-16T和TCT40-16R就是一对。如果你非要拿接收头去发射、或者发射头去接收也不是完全不能用但性能会明显变差不建议这样做。1.2 回波信号到底有多弱直接决定接收电路增益需求发射换能器把电能转换成声能声波向外扩散打到目标表面后一部分能量被反射回来再传播回接收换能器接收换能器再把声能变回电信号。这个过程中能量经过两次电声转换和两次空气传播衰减回波信号通常是毫伏级别甚至远距离时只有几十微伏。接收换能器的接收灵敏度一般用dB表示典型值在-65dB附近意思就是输出电压比声压参考值低很多。我做一个粗略的估算发射端给换能器加10V左右的脉冲激励发射声压级大约能到110dB经过2米距离传播衰减5到10dB目标反射率打个折再衰减一些来回一共衰减20dB到40dB接收端声压就降到70到90dB配合接收换能器的灵敏度最后能送到放大器输入端的信号大概在几毫伏到几十毫伏之间。这就很明确了接收电路需要至少40dB到60dB的电压增益才能把信号放大到比较器可以稳定判断的电平也就是几百毫伏到1V以上。这些物理特性总结起来就一句话发射端要尽可能提升声压输出接收端要尽可能降低噪声、提升增益。后面所有电路设计都围绕这两个目标展开。2. 发射链路设计怎么把微弱的脉冲变成足够响的“喊话”发射链路的作用很简单MCU产生40kHz的方波脉冲串驱动电路把电压提升到换能器需要的电平推动压电陶瓷片振动发出超声波。但就这么一个环节里面有很多容易踩坑的细节。2.1 驱动方案选型直接驱动、单管升压、H桥驱动怎么选发射换能器容性负载特性很明显典型等效电容在2000pF到3000pF左右驱动它需要一定的瞬态电流。如果MCU引脚直接驱动高电平只有3.3V输出电流也有限声压会非常弱有效测距没几米所以必须加驱动电路。常用方案有这几种各有适用场景单三极管/单MOS管驱动一个NPN三极管或者N-MOS管集电极接变压器初级或直接接换能器基极/栅极接MCU脉冲。结构最简单成本最低但是只能单向驱动声压不对称效率一般。推挽互补驱动用一对NPN和PNP三极管构成图腾柱两个引脚反向控制输出对称方波效率较高适合5V左右的供电。变压器升压驱动先用推挽电路或单管生成脉冲然后通过一个高频变压器把电压从5V升到12V甚至更高压电陶瓷换能器在更高激励电压下能产生更强的声压。这个方案测距效果最明显。专用超声波驱动芯片比如思为同的系列、或者一些自动化厂商的集成驱动器功能全但成本高普通DIY和一般产品项目不太必要。我自己的项目里选了推挽变压器升压的组合供电5V变压器变比1:10次级峰值电压能达到40V以上实测发射声压比直接5V驱动强了一大截极限测距从不到3米拉到了6米以上。2.2 脉冲串参数怎么定发射频率、脉冲个数、间隔时间MCU发出的脉冲串频率必须是换能器的谐振频率也就是40kHz这个不能偏。脉冲个数通常在6到16个之间。个数太少换能器来不及起振声波能量不足个数太多虽然声波持续更久能量更大但会拉长发射时间导致近距离盲区扩大。计算一下40kHz一个周期是25微秒发射10个脉冲共250微秒这段时间内声波已经走了大约8.6厘米如果再加上接收电路余振的时间盲区通常在20到40厘米之间。如果你的应用需要测很近的目标比如20厘米以内就不能测那脉冲数要相应减少。但脉冲数少又会导致回波弱所以这是权衡。实际设计时MCU用定时器输出PWM比较合适。我习惯用定时器的主从模式主定时器控制脉冲个数和间隔从定时器输出PWM波形这样CPU基本不参与整个发射过程占用极少的处理资源。发射完成后开启某个外部中断或者输入捕获等待接收链路的回波信号。2.3 变压器绕制参数和注意事项如果是自制变压器核心参数是初次级匝数比和工作频率。对于40kHz变压器磁芯适合用铁氧体罐型磁芯或者EE型小磁芯。初级2到3匝的话次级做20到30匝变比1:10左右。绕制时有几个实际问题要注意同名端不要接反接反了输出波形就变成负压主导虽然也能响但效率不对。初级线圈的线径不能太细因为驱动峰值电流可能到1A级别至少要0.2mm以上。磁芯要开气隙或者用低导磁率材料否则容易饱和。变压器次级输出端建议并联一个1MΩ左右的电阻给电荷提供泄放回路否则换能器上容易积累直流偏置影响稳定性。我用的是EE13磁芯初级3匝、次级30匝反馈绕组不接驱动频率40.3kHz微调了一下让输出幅度最大因为实际换能器的谐振频率可能略有偏差最好上电后用示波器看次级波形幅度来微调频率幅度最大的点就是实际谐振点。你看发射链路其实不只是“给个方波那么简单”它牵扯阻抗匹配、驱动能力、升压变压器的设计和谐振频率校正。发射效率上去了回波信噪比才有保证。这就像喊话你先得喊得够响对方才听得清。3. 接收链路设计微伏级回波怎么一步步变成MCU认识的脉冲接收链路是整个电路的核心难点不是因为原理有多复杂而是因为信号太小、噪声太多稍不小心就被淹没。完整的接收链路包括前置放大、带通滤波、主放大/自动增益、整形比较几个环节。3.1 前置放大第一级放大器决定了整个链路的信噪比天花板接收换能器的输出阻抗比较高容性负载特征明显信号幅度又小所以第一级放大器必须满足几个硬性条件输入阻抗要高、等效输入噪声要低、增益要适中、带宽要覆盖40kHz但不需要太高。运放的输入噪声密度和偏置电流是首要指标不能随便拿个741去测那种运放自身噪声比信号还大。可选的低噪声运放像AD797、OP27、LT1037这些都能用但对40kHz来说其实还有更对口的选择。ADI的AD8099、TI的OPA847这类宽带低噪声运放也可以不过性能过剩价格偏高。我做实测比较之后性价比最高的是用TI的OPA365或者OPA2376GBW 5.5MHz以上、输入电压噪声密度在7.5nV/√Hz左右增益做到40dB没问题而且单电源供电还能保持输出接近轨到轨。如果你手头只有LM358这类通用运放也不是完全不能用只是噪声会大一些近距离还行远距离回波会很难分辨。第一级电路拓扑用同相放大输入直接接接收换能器正极换能器负极接地输入端到地接一个1MΩ的偏置电阻同相端还需要通过电阻分压给一个半电源偏置。增益设计在100倍左右也就是40dB这样几毫伏的输入信号放大到几百毫伏。第一级放大器的反馈电阻大小会影响带宽我用的是10kΩ和100Ω的搭配增益101倍带宽足够覆盖40kHz且高频噪声不至于放得太大。3.2 带通滤波把40kHz附近的有用信号“捞”出来环境噪声频谱很宽日光灯、电机、空气流动都会产生干扰其中低频成分尤其强。如果不过滤直接放大电路很容易产生虚假触发。带通滤波器的中心频率就是40kHz带宽窄一点更好但Q值太高又会导致响应慢接收信号到来后建立稳定输出需要更长时间近距离响应会变差。带通滤波设计有两种常用路径。第一种是无源LC带通电容电感选型不方便频率偏低时电感体积又大在40kHz这个频段不太划算。第二种是有源RC带通运放加几个电阻电容就能实现多路负反馈或Sallen-Key拓扑都行。我选用的是多路负反馈带通滤波器中心频率40kHzQ值约8到10通带带宽4到5kHz。这个带宽既能较好地抑制带外噪声也不会对40kHz脉冲串的包络造成太大畸变。有源滤波器的运放同样需要低噪声、足够带宽增益带宽积至少要几MHz才行。为了减少温漂影响电阻选1%精度的金属膜电阻电容选C0G或者NPO材质的这个频段用X7R问题也不大但C0G更稳。滤波放在放大器前面还是后面这是个关键决策。我的建议是前置放大和带通滤波分开做第一级放大40dB紧接着做带通滤波然后如果增益不够再补一级放大。这样低频干扰不会在第一级就被放大到饱和同时第二级放大的是经过滤波的有用信号信噪比更好。有些设计把带通滤波放到第一级前面好处是抗干扰最强但信号太小的时候滤波器的插损和噪声会恶化信噪比不是最优解。3.3 主放大级与自动增益控制远近距离都能稳定检测经过两级放大之后近距离回波可能已经到伏特级而远距离回波只有几百毫伏甚至更低。如果固定增益近距离信号过大容易让后级饱和远距离信号又不够触发比较器。这时候就需要自动增益控制让电路的增益随回波信号幅度自动调整。实现的方案有几种用数字电位器改变反馈电阻、用模拟乘法器、用JFET作为压控电阻。对40kHz信号来说JFET压控电阻方案简单可靠。我在放大器的反馈回路里串联一个N沟道JFET比如2SK30ATM用检波电路检测输出幅度幅度越大经过反馈控制电路输出的控制电压越负JFET的导通电阻越大放大器增益越低。这样形成一个负反馈回路自动把输出稳定在一个合适的电平范围内。说了这么多可能有人觉得“我一个人做项目不需要这么复杂”。确实如果测距范围只在0.5到3米做固定增益就够了增益调到60dB后级比较器用滞回比较就不会有问题。但如果想测5米、6米以上或者目标反射率变化很大自动增益就非常有必要。我在自己的方案里做了AGC实测下来近距离2厘米到6米都能稳定检测比起固定增益方案的近距饱和远距触发不了的情况体验完全是两回事。3.4 比较器整形把模拟回波变成干净的数字脉冲比较器的输入是经过放大滤波的模拟回波信号输出一个高电平脉冲给MCU。这里最大的坑是“振铃”。回波信号是包络形状的信号幅度超过阈值时输出高电平低于阈值时输出低电平如果阈值设置得太低噪声尾巴会产生多次触发MCU拿到一堆乱脉冲。解决方法是加滞回比较也就是阈值的上升和下降不是同一个值迟滞窗口宽度可以根据信号幅度调整一般设置在50到200mV。比较器的选型要考虑传输延迟和输出类型。TLV3501是高速比较器4.5ns延迟轨到轨输出可以直接接MCU不放心的话加个10kΩ上拉电阻。如果只是做普通的40kHz测距用LM393或者TL3116这类常见比较器也够用。我实际用了TLV3501输出波形非常干净这点在长距离微弱信号场景尤其重要因为信号幅度小噪声稍微触发一次就会引起距离跳变。如果不想用比较器也可以把放大后的信号直接送进MCU的ADC周期采样用软件做峰值检测或者FFT处理。这个方案的优点是可以在数字域做更复杂的滤波和算法对硬件链路的要求降低一些但代价是MCU的采样率要足够高。STM32F103的ADC最高采样率1Msps对40kHz信号来说一个周期能采25个点做峰值检测还是可以的但程序复杂度上去了。我建议初学者还是用比较器方案简单可靠后面再慢慢改成ADC方案做增强功能。4. STM32的时间测量与数据处理别让精度死在后端前面硬件链路输出的是一路脉冲信号宽度或者相位跟飞行时间相关剩下的工作就是MCU准确测量时间、计算距离、排除干扰。4.1 输入捕获还是外部中断为什么输入捕获更稳STM32的定时器输入捕获可以直接测量脉冲宽度精度到微秒甚至亚微秒级别。以STM32F103的72MHz定时器时钟来说一个计数周期约13.9纳秒40kHz一个周期约25000纳秒也就是说一个声波周期大约1800个计数。用输入捕获模式测量回波脉冲的上升沿和下降沿之间的间隔换算成距离分辨力可以达到零点几毫米级别当然实际分辨力受换能器带宽和声速波动限制没这么夸张但时间测量的精度本身是足够高的。外部中断也能测但软件执行延迟不稳定中断触发后进入中断处理到启动定时器读数之间的时间抖动可能达到几微秒甚至十几微秒换算成距离就是几个毫米到几个厘米的误差而且抖动随机无法校准。所以正经设计肯定用输入捕获把测量交给硬件软件只做解读。4.2 声速补偿温度才是最大的误差来源距离计算公式是d v × t / 2v是声速。很多人直接写v340m/s这在15℃左右误差不大但在夏天40℃环境和冬天-10℃环境下声速差多少呢用公式v 331.4 0.6×T估算40℃时声速355.4m/s-10℃时325.4m/s相差约30m/s也就是将近10%的误差。测3米距离时误差可能到30厘米完全不可接受。所以做实用超声波测距温度补偿是标配。方案很简单板上放一个DS18B20或者NTC热敏电阻测到环境温度后实时修正声速。代码里维护一个函数输入温度输出声速每一轮测距时调用一次。如果对精度要求更高还要考虑空气湿度和气压的影响但对一般民用场景温度补偿已经能覆盖90%以上的误差来源。4.3 滤波算法单次测量值根本不能用超声波回波信号受环境干扰、目标形状、目标角度的影响巨大单次测量结果经常有跳变。即使电路层面做了滤波数字端也建议加上均值滤波或者中值滤波。我的做法是连续测5次去掉最大值最小值剩下3次取平均这样一可以减少随机误差二可以滤掉偶发性的尖峰干扰。对于运动目标的应用这个延迟大约50到100毫秒完全能接受如果要求快速响应可以改成滑动窗口均值滤波窗口大小根据场景调。另外测距结果超过预定最大量程时比如超过5米还没收到回波MCU要能正确处理超时。发射脉冲后启动定时器如果超过一个最大往返时间比如40毫秒那肯定没有回波或者目标太远这时直接返回无效值不要卡在等待状态。处理这一步对系统稳定性很重要尤其适合连续扫描的应用场景。5. 实测调通那些图纸上画不出来、但真机一定会遇到的问题电路从原理图到PCB再到点火调试一定会遇到各种意料之外的问题。这里把我实际踩过的坑整理成清单按优先级从高到低列出来希望能帮大家少走弯路。5.1 收发串扰和“余振”造成的近距离盲区发射脉冲结束后发射换能器不会立刻停止振动而是有余振同时收发换能器如果安装位置太近声波和振动会直接通过结构和空气耦合到接收端。这两者叠加起来表现为接收端在发射结束后一小段时间内依然能检测到一个较大的信号看起来像极近距离的回波。这个现象就是近距盲区的根源。处理办法有几种可以组合使用。首先是硬件上发射和接收换能器之间加隔声屏障我用的是在PCB上开槽加一个硅胶垫隔开效果明显。然后是电路上在发射瞬间到回波到达前的这段时间让接收链路衰减——做法是在前置放大器的耦合电容处放一个模拟开关发射时开关导通把放大器的输入端短接到地发射结束后释放。不过我后来发现用软件也能实现类似效果就是发射结束后的前1毫秒内MCU不对接收脉冲做响应直接忽略。单纯软件方案简单但代价是近距离的直接盲区就被拉大了配合硬件隔声之后软件屏蔽时间可以缩短到0.5毫秒左右对应盲区大约17厘米。5.2 示波器实测如何判断放大链路是否真的在正常工作调试接收链路时示波器探头不要接在比较器输出上瞎猜要从前往后逐级排查。先把探头换成10x档接在接收换能器两端发射脉冲后观察有没有微弱的衰减振荡波形如果没有检查发射是否正常、换能器是否接反。然后再移到前置运放输出端看波形幅度有没有放大到几百毫伏。逐级看下来哪个环节没有信号就知道问题出在哪。有一点必须是示波器的触发源设为发射脉冲边沿然后用单次触发模式抓回波。因为回波是一次性的瞬态信号自由运行模式下画面会闪得看不清。把时间轴拉开到10ms或者20ms一屏水平位置配合触发延时能看到完整的发射-回波时间差。我曾经因为忘记切换单次触发看了半天都以为电路没输出这事千万别再犯。5.3 PCB布局走线模拟小信号电路最容易在案板上翻车接收信号是微伏到毫伏级别发射驱动是几十伏、峰值电流安培级别的脉冲这两者在同一块板上共存布局走线做不好接收链路会被发射脉冲和电源纹波干扰得根本没法用。我的布局原则是这样发射驱动电路和变压器放板子的一角接收放大链路放另一角中间用地线带或者大面积铺铜隔开。接收链路的地要和发射驱动的地分开走最后在电源输入端单点汇合不要形成地环路。电源要从供电入口处先经过一个磁珠或者10Ω电阻再分配给接收放大电路再并联一个100nF和10μF电容到地。接收换能器的信号走线尽可能短且远离数字信号线尤其是晶振引线和MCU的IO线。如果板子面积允许接收放大区域的正反面都铺地铜过孔稀疏打几个连接地平面就行。因为在案板上飞线调试的时候那真是“满屏噪声、寸步难行”。一旦把布局规则做对很多莫名其妙的干扰、误触发、距离跳动就自己消失了。EMC这块不是玄学是好布局的自然结果。5.4 换能器指向性和目标反射率的工程现实实测下来你会很快发现对着平整墙面测距离很准很稳定但对着一个圆角椅子腿、或者一盆绿植测读数就开始跳了。这不是电路故障而是超声波测距本身的物理局限。换能器有指向性发射和接收波束角一般在60度到80度之间目标表面跟声波束不垂直时反射能量急剧下降表面粗糙散射强的目标也一样。工程上有几个应对思路。一个是多换能器阵列用两三个接收头分开放置哪个信号强用哪个覆盖更广的角度。另一个是调整阈值和AGC参数牺牲一些灵敏度来换稳定性。还有一个是不能忽略的安装时尽量让换能器平面垂直朝向需要测的物体表面很多“测不准”其实只是安装角度不对跟电路完全无关。对于反射率这个问题我有个教训之前拿超声方案去测篮球近距离还行距离一远因为球面反射让回波散开信号根本收不回来。后来换了更大的换能器还是不太理想。所以选型之前一定要想清楚目标物是什么材质、什么形状、反射特性如何这比纠结电路设计更重要。6. 进阶方向还能把超声波测距用到什么程度如果你已经把基础电路跑通距离显示稳定了可以沿着下面的方向继续深入每个方向都能让这套方案的价值打一个滚。6.1 从单点测距到扫描成像把换能器固定在一个舵机或者步进电机上每转一个角度测一次距离就能合成出一圈的环境距离数据也就是2D雷达。这个玩法在扫地机器人、AGV避障里已经大量使用。硬件改动不大关键是数据融合算法和驱动时序要处理好。我用一个SG90舵机加之前做好的测距板子做了一个360度扫描的桌面雷达配合上位机画出来的轮廓图效果非常直观。6.2 多通道并行测距如果应用需要同时测好几个方向的距离可以布置多个接收换能器配一个发射头或者多对换能器轮流工作。这样硬件成本增加不多但MCU的资源开销和时序调度要重新设计。我做过一版双通道方案两个接收通道交替启用测量周期压缩到60ms以内已经能支撑一些轻型移动机器人的避障需求。6.3 数字信号处理方向如果不想被模拟AGC的复杂度限制住可以考虑把放大后的模拟信号直接送MCU的ADC进行数字解调。用数字方法做相关运算或者Goertzel算法提取40kHz频点能量可以省掉比较器和部分滤波器而且算法可以不断迭代优化。STM32F4或者更高性能的MCU跑起来毫无压力。这个方向适合软件能力比较强、想往嵌入式信号处理走的开发者。做个简单的成本估算基础方案的物料成本一对换能器大约几块钱运放和比较器加起来十几块钱MCU用STM32F103C8T6差不多几块钱所有阻容加上PCB批量做整套成本能压到二三十块钱以内。比起动辄上百的现成工业测距模块自己做出来的东西虽然折腾但换来的是对每个环节的理解和自主定制能力这笔账怎么算都不亏。