基于STM32的超声波测厚仪:从脉冲回波原理到工程落地
简介基于STM32单片机设计的超声波测厚仪完整解决方案面向嵌入式开发者、电子竞赛参赛者及测控类课程设计人员解决在1.2mm225mm范围内对物体厚度的非接触式精准测量问题设计误差控制在(±1%H0.1)mm以内。资源共44个文件压缩包约95.83MB包含完整的AD原理图、PCB设计文件、可编译的STM32源程序、演示视频以及BOM表等另附PCB工程预览与日志文件便于快速检索与二次开发。核心代码涵盖超声波发射接收时序控制、厚度数值显示和按键交互功能配合视频演示可直观核对硬件调测效果。包内还整理了stm核心板资料与原理图/PCB压缩包为理解传感器选型、反射回波处理及整机装配提供闭环参考。目前已有101人学习下载适合需要从零搭建超声波测厚仪并完成实物调试的工程师参考。1. STM32 超声波测厚仪为什么不是“拿个探头就能量”钢板从生产现场到复验台超声测厚是设备维护里上手最快的一项但现场经常出现“同一个人、同一块试块读数隔两分钟就差 0.3mm”的情况。这不是探头没放平而是换能器激励、回波放大、比较器整形到 MCU 计时这条完整信号链上每个环节都在贡献误差。基于 STM32 单片机设计的超声波测厚仪核心是用一颗 STM32F103 级芯片把高压激励、飞行时间采集、声速校准和数值显示全部接管而配套的原理图、PCB、源程序、演示视频和 BOM 表本质上都是围绕这个信号链展开的。这套方案之所以常见是因为它把硬件和软件切成了三条线索发射端解决“怎么激励探头”接收端解决“怎么从噪声里捞回波”固件解决“捞回来的边沿怎么算成厚度”。拿到资料后最忌讳直接开 Keil 编译因为原理图里一个阻尼电阻的取值、PCB 上一段敏感走线的位置、源程序里的检测门限彼此都会互相牵连。下文按一个完整落地顺序展开先把测厚公式和探头选型算清楚再对照原理图画出发射/接收链路接着讲 PCB 走线和晶振参数然后进源程序的定时器捕获与滤波最后一章给出现场调试和演示视频里该录的验证流程。2. 测厚原理先行脉冲回波模型、声速表和换能器选型2.1 脉冲回波测厚的核心公式与分辨力边界超声波测厚仪基本都沿用脉冲回波原理探头贴在被测件一侧压电晶片发出超声波声波穿过材料后在底面反射回到晶片测厚仪测量从发射到接收的时间差。厚度等于声程除以“往返时间”的一半源程序里最常见的写法是这个公式float thickness_mm sound_speed_mps * time_us / 2000.0f;这里的 2000.0f 来自量纲换算time_us 是往返时间先乘声速得到回路声程除以 2 才是单程厚度再除以 1000 把米换算成毫米。以钢为例纵波声速约 5920m/s1mm 钢板的往返时间只有约 0.338μs这也就是为什么测厚设备里最怕的不是算术而是那零点几微秒的时间测量误差。分辨力也不能只看定时器位数。一套 5MHz 探头的接收信号带宽约在 3~7MHz回波前沿受探头阻尼影响上升时间通常有几十到上百纳秒。STM32F103 的定时器工作在 72MHz一个计数脉冲约 13.9ns换算到钢材料上相当于 0.041mm这是“数值分辨力”不是系统精度。系统精度还取决于晶振偏差、声速随温度变化、耦合剂状态以及比较器阈值因此验收时要用标准试块复测而不是只看屏上小数位数。2.2 换能器频率、晶片直径和单晶/双晶的取舍探头是整套解决方案里最不该省的部分。频率决定衰减和分辨率的平衡低频探头穿透深但回波宽高频探头分辨细但不耐衰减。工程上常用的选型区间可以按表和被测材料来定。探头频率钢中适用厚度范围典型应用场景1MHz ~ 2.25MHz20mm ~ 200mm 以上大锻件、铸铁、厚壁管道5MHz1mm ~ 50mm钢结构和压力容器常规测厚10MHz0.5mm ~ 10mm薄壁管、板材分层检测晶片直径影响声束指向性和近场长度。5MHz、直径 10mm 的探头在钢中波长约 1.18mm能兼顾耦合面积和小曲率表面的贴合是测厚方案里出现最多的配置。如果被测表面是小管径的曲面直径 6mm 的小晶片更合适。单晶探头用一个压电晶片既发又收电路简单但发射后的余振会拖长表面回波薄工件底波容易被表面余振掩盖双晶探头把发射晶片和接收晶片分开各自带声延迟块接收通道在发射时基本听不到自己的余振盲区可以做得很小。DIY 测厚仪通常选 5MHz 双晶探头源程序里的最小测厚门槛也要按照探头的盲区来设。2.3 STM32F103 定时器测量飞行时间的实际分辨力把探头回波整形后的脉冲接到 STM32 的定时器输入捕获是最直接的“时间到数字”转换办法。STM32F103C8T6 的 TIM2 在 72MHz 时钟下捕获值单位是 13.9ns。对 15mm 钢板往返时间约为 5.07μs对应约 365 个计数对 2mm 薄板往返约 0.676μs对应约 49 个计数。这说明即便是资源最普通的 F103也能覆盖常规测厚范围。不过“计数够密”不等于“测得到”。回波经过 60dB 放大后噪声基底同样会被放大比较器在噪声上的抖动范围往往远大于一个定时器计数所以固件里要加中值滤波和回波窗口也就是后面章节会写的 MIN_GATE_US 与 MAX_GATE_US。若项目要求 0.01mm 级别的重复精度常见做法是外接 TDC7200 或 GP22 这类时间数字转换芯片再将测量结果返给 STM32但这就不再是纯粹“STM32 解决计时”的轻量路线成本和复杂度都会上升。3. 从原理图到源程序发射、接收与回波检测电路设计3.1 发射驱动STM32 怎样送出 5MHz 脉冲串激励探头压电换能器需要一个短促的激励信号。常见做法有两种一种是产生单极性高压尖峰脉冲用几百纳秒的窄脉冲去敲晶片适合供电简单的便携表另一种是由 MCU 产生 5MHz 附近的脉冲串再用 MOSFET 和脉冲变压器把幅度抬升到几十伏以上对回波带宽更友好。这套方案里通常采用后一种链路TIM1 输出 PWM → 逻辑电平 MOSFET 栅极 → 脉冲变压器初级 → 次级并联后接探头。void send_ultrasound_burst(uint8_t cycles) { TIM1-ARR 13; // 计数值 1311472MHz/14 ≈ 5.14MHz TIM1-CCR1 7; // 占空比接近 50% __HAL_TIM_SET_COUNTER(htim1, 0); HAL_TIM_PWM_Start_IT(htim1, TIM_CHANNEL_1); HAL_DelayUs(2); // 约 10 个周期足够让探头起振 HAL_TIM_PWM_Stop_IT(htim1, TIM_CHANNEL_1); }代码里 ARR 写 13是因为定时器输出周期是 ARR1 个时钟计数。注释里的 5.14MHz 与探头标称频率略有偏差但探头本身有一定带宽这个误差通常可以接受如果源程序里做编码激励或相关运算则要让定时器时钟与探头频率精确对齐。发射级一定要有阻尼设计。脉冲变压器次级并联一个电阻常在几百欧到 2kΩ 之间用来吸收探头自由振荡缩短表面余振电阻太小会吃掉发射能量太大则回波拖尾变长。这个值是电路调试中反复试出来的BOM 表里该电阻的功率和封装也要留余量不能只看阻值。3.2 接收链路限幅、放大和比较器整形回波回到探头时通常只有数毫伏到几十毫伏而发射端可能有上百伏高压所以接收放大器输入端必须先做钳位保护。钳位二极管要选开关速度快的 BAT54S 或 BAS70物理位置紧贴探头插座让多余能量在进入放大器之前被泄放掉。放大链路常见采用两到三级结构第一级低噪声固定增益后续用可变增益实现对不同深度回波的补偿。比较器把模拟回波变成数字边沿再送到 STM32 定时器输入捕获。下面是简化后的 BOM 参考具体数值要以实际原理图为准。位号器件参考型号/参数作用U4低噪声放大器AD8331 或 THS4304第一级固定增益U5对数放大器AD8310压缩回波动态范围辅助阈值判断U6比较器TLV3501回波过阈值输出上升沿D1/D2钳位二极管BAT54S发射高压限幅R11阻尼电阻500Ω~2kΩ抑制探头余振接收链路里最容易忽略的是自动增益或阈值自适应。固定阈值只能在一个很小的测厚深度内有效深度大时回波衰减需要更高增益而近表面回波强又容易造成比较器提前触发。因此很多源程序会实时统计一段时间的噪声峰值动态给比较器一个略高于噪声的阈值或者在模拟端用 AGC 引脚控制增益。3.3 把回波时间送进 STM32输入捕获与检测窗口比较器输出的上升沿接到 STM32 的捕获输入脚例如 TIM2_CH2 对应的 PA1。发射脉冲发出瞬间把定时器清零回波边沿到达时捕获寄存器自动记录当前计数值。关键点是在中断里判断“这个回波是不是本次发射产生的”避免把上一次发射的余振或电源噪声当成有效回波。void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2 htim-Channel HAL_TIM_ACTIVE_CHANNEL_2) { uint32_t ticks HAL_TIM_ReadCapturedValue(htim2, TIM_CHANNEL_2); float time_us ticks * (1.0f / 72.0f); if ((time_us MIN_GATE_US) (time_us MAX_GATE_US)) { g_valid_echo 1; g_last_us time_us; __HAL_TIM_SET_COUNTER(htim2, 0); } } }MIN_GATE_US 和 MAX_GATE_US 就是测厚仪里的“检测闸门”。MIN 由探头盲区决定比这更小的时间差来自表面串扰或探头延迟块耦合不是底波MAX 对应系统能测的最大厚度。软件窗口比硬件门控更灵活是源程序里第一个值得反复调试的参数。4. PCB 布局与走线把回波干扰压到比较器能抗住的程度4.1 高压发射区与微弱回波区怎么分区原理图能跑通往往只代表电路及格真正决定回波稳定性的常常是 PCB。超声波测厚仪里同时存在高压小电流的发射支路、毫伏级回波和数字逻辑三类信号如果混在同一块地上回波很容易被电源和数字开关噪声淹没。常见做法是把 PCB 划成三个区高压发射区、模拟接收区、数字控制区。发射区放在板边靠近探头插座模拟接收区与发射区之间保持至少 2~3 毫米间距STM32 和显示、按键电路离两个区最远。整套方案通常带 LCD 和按键这个分区要在布局阶段就确定不要等布线时才发现运放和 PWM 输出挤在一起最后只能靠飞线救火。4.2 回波通道的 PCB 走线要求与板层设置模拟接收通道的走线要求可以概括成三个词短、直、包地。比较器输出之前的所有信号都属于敏感信号走线尽量不超过 20mm避免穿过数字区域需要转弯时用 45° 或圆弧不用直角。接收通道两侧加接地过孔栅栏能把板内噪声耦合压低。下面的自查表可以直接在打样前逐条核对。检查项要求原因回波输入走线距发射级 ≥ 5mm不足则包地防止高压脉冲串入接收通道比较器输出靠近 STM32 引脚线宽不小于 0.2mm数字边沿不需要阻抗控制但要短电源退耦每个运放电源脚 100nF 紧靠引脚高频退耦路径越短越有效晶振区域下方禁止布敏感信号晶振走线和回波放大线会互相干扰探头插座尽可能靠近模拟前端探头引线越长等效天线效应越明显至于板层设置四层板可以直接采用 TOP-GND-POWER-BOTTOM 叠构信号参考面完整回波走线放在 TOP 层底层只放少量器件若用双层板降成本则 TOP 层走信号BOTTOM 层做完整地平面并尽量减少过孔数量因为每个过孔都会打断回流路径。用 Cadence PCB Editor 设置层叠时要注意 GND 层网络必须铺完整不能只靠几根宽线当代替导出 Gerber 前再做一次 AD20 或对应工具的 DRC 检查重点看不连接网络和丝印压盘。4.3 最小系统的晶振电容计算与供电滤波STM32 最小系统不止是“芯片能跑”还要保证串口和 SWD 稳定。外部晶振的负载电容会直接影响起振余量和频率精度电容不是随意取的。晶振两侧对地电容和寄生电容的关系如下CL (C1 * C2) / (C1 C2) Cstray假设晶振规格标称 CL12pFPCB 走线寄生电容 Cstray 取 3pF则 C1、C2 各取 18pF 时并联后约 9pF加上寄生 3pF 正好约 12pF。如果手头只有 20pF 标称值电容实际 CL 会被推到 13pF 左右差异不大可以起振但晶振标称 CL20pF 而板子上只放了 10pF实际负载就明显偏低可能起振慢甚至不起振。供电方面模拟前端建议用 LDO 单独供一路 3.3V数字电源经磁珠或小电阻把高频噪声隔开比较器电源脚要放 100nF 加 10μF 双电容并且紧靠引脚。STM32 的 BOOT0 下拉和复位电容不要省否则现场烧录时会遇到“error: no STM32 target found”一类问题排查方向就会从“程序写错了”变成“硬件根本没进入调试状态”。5. 源程序测量骨架定时器捕获、厚度计算、滤波和校准5.1 STM32CubeMX 里的输入捕获配置与引脚分配源程序里最核心的流程是“发射脉冲 → 定时器清零 → 等待捕获 → 处理回波”。用 STM32CubeMX 配置时TIM2 选择 Input Capture direct mode通道 2 映射到 PA1时钟不分频捕获极性是上升沿。这样才能保持 13.9ns 一个计数的原生分辨力而不是随手把 prescaler 拉到 71 变成 1μs 分辨率。TIM_IC_InitTypeDef ic {0}; ic.ICPolarity TIM_INPUTCHANNELPOLARITY_RISING; ic.ICSelection TIM_ICSELECTION_DIRECTTI; ic.ICPrescaler TIM_ICPSC_DIV1; ic.ICFilter 0x0F; HAL_TIM_IC_ConfigChannel(htim2, ic, TIM_CHANNEL_2); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_2);ICFilter 设为 0x0F表示捕获引脚上做 8 个时钟周期的数字滤波能滤掉比较器输出边沿附近的高频毛刺。副作用是让边沿延迟几个周期这个固定延迟会被声速校准覆盖掉如果回波幅度小、边沿很钝滤波可以调小否则真实回波可能被当成毛刺丢掉。打开工程前还要确认 Keil5 里安装对应的 STM32F1xx 芯片包如果电脑里同时装了 C51 和 STM32 两个环境安装路径要分开否则工程打开后看不到芯片型号编译和烧录都会出问题。5.2 厚度计算、中值滤波和坏回波剔除把捕获回调里的时间值转成厚度公式就是第二章那个量纲换算。实际源程序里通常封装成一个函数避免主循环里到处写魔法数。#define SOUND_SPEED_STEEL 5920.0f static float echo_time_to_thickness(float time_us, float sound_speed) { return sound_speed * time_us / 2000.0f; }单次回波不稳定是正常的最常见做法是连续采集 5 次取中位数而不是平均值。中位滤波器对耦合剂偶发气泡造成的单次短回波免疫力强平均值则会被一个大的毛刺直接拉偏。如果连续 5 次测量里最大值和最小值之差超过 0.3mm通常认为本次结果不可信继续保留上一次显示值并在串口打一个不确定标记。这个坏回波剔除逻辑在薄壁件上尤其重要因为薄板底波和表面波之间的间隔本来就小。5.3 声速校准与 LCD/UART 输出不同批次钢材的声速可能有 1%~3% 偏差而测厚仪的绝对误差里声速误差往往比定时器分辨力大得多。因此源程序必须有校准入口在一块已知厚度 D_std 的试块上测出飞行时间 t_cal反推当前探头与材料的声速。常见材料可以先用默认值实际测量以校准结果为准。材料纵波声速m/s备注碳钢5850 ~ 5950以标准试块校准后使用铸铁4500 ~ 4600灰口铁差异较大铝6250 ~ 6350轻金属中声速较快铜4650 ~ 4750声速受合金成分影响亚克力/塑料2300 ~ 2700衰减较大适合低频探头校准的要点是试块厚度尽可能接近被测厚度。只做单点校准近区回波和远区回波的时间基准仍可能有差异如果手头有两块标准试块比如 5mm 和 40mm可以实现两点线性校准把声速曲线斜率一起修正。温度修正一般按线性系数折算但 0~50°C 范围内的工业测厚声速温漂往往小于耦合状态带来的误差可以先不做复杂补偿。输出方式对演示效果影响很大。最直观的是 UART 按 CSV 格式打印例如uint16_t d10 (uint16_t)(thickness_mm * 10.0f); printf(d:%u.%u mm\r\n, d10 / 10, d10 % 10);先乘 10 再拆成整数和小数是为了避免浮点格式化占用太多开销也符合常见嵌入式串口库的能力。如果串口用 USB 转 TTL 接到电脑在 Windows 设备管理器里看到“STM32 Virtual COM Port 叹号”要先查驱动而不是反复改源程序驱动装好后还要确认串口号被占用否则演示视频里抓不到实时数据。6. 现场验证与排错演示视频里该录的流程和检查单6.1 验证流程试块、耦合剂和重复性拿到打样回来的板子和烧录好的源程序先不要急着拍视频。验证顺序可以固定为先准备已知厚度试块再用砂纸或锉刀处理被测面让表面尽量平整接着涂耦合剂常用的是甘油或超声耦合凝胶把探头轻轻放上去不要用力压等读数稳定后连续记录 5 次看最大值和最小值的差。只有这个差值小于 0.1mm 到 0.2mm 时才说明整条信号链是可信的。演示视频也应该按这个顺序拍先展示标准试块再显示屏幕上经过校准的厚度值接着换第二块厚度不同的试块重新测一遍。如果视频里能同时拍到探头、试块、液晶屏或串口助手说服力会明显强于只对着屏幕拍。录制过程中如果数值跳动先检查耦合剂是否涂满探头底面再检查探头是否倾斜而不是马上动代码。6.2 常见故障现象对应的检查路径现场最容易遇到的不是代码编译失败而是“能烧录但测不到数”。下面这几个现象和排查顺序可以做成检查单。现象可能原因排查顺序完全无回波高压没建立、探头断线、比较器阈值过高示波器看发射极波形再看运放输出读数每次都不一样耦合不良、表面粗糙、比较器阈值太低重新涂耦合剂增大 IC Filter数值偏大或带毛刺把表面回波当成底波或窗口起点太小调大 MIN_GATE_US确认探头双晶特性数值缓慢漂移探头发热、声速温度漂移、晶振不稳定校准时连续测 30 分钟观察极差ST-Link 连不上目标接线反了、芯片锁死、BOOT0 悬空用 ST-LINK Utility 全擦除再查 SWD 三线比较器阈值是最容易被忽视的一项。阈值低噪声会频繁触发捕获阈值高小回波直接丢失。用示波器同时看比较器输入和输出能快速判断是模拟端回波太小还是数字端滤波过度。6.3 Gerber 导出与 BOM 一致性检查源程序调试稳定后打样前要把原理图和 PCB 再对照一遍每条信号网络的位号是否在 BOM 表里出现封装和实际元件能不能对上。导出 Gerber 时要确认钻孔文件已包含板厂默认会做全部贯穿孔未设置的盲孔或埋孔不会自动生成。用 Gerber 查看器转成图形后重点检查探头插座、比较器、晶振三处器件是否有丝印压盘或过孔打在焊盘上。最后一个实用技巧是录制演示视频之前用一个高频示波器探头夹在接收放大器输出端观察是否有稳定的底波回波包络。只要这一步看到波形再去看屏幕数值就有底气如果示波器上已经是一团噪声就别急着拍视频回头先查发射级阻尼电阻和接收通道钳位二极管是否装反。把这一步当作每次改板后的固定动作测厚仪的排错效率会高很多。本文还有配套的精品资源点击获取