ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于STM32的超声波测厚仪:从原理图到源程序的完整设计

基于STM32的超声波测厚仪:从原理图到源程序的完整设计 简介基于STM32单片机设计的超声波测厚仪解决方案面向嵌入式系统课程设计、电子竞赛及工业测控项目参考利用超声波反射原理实现1.2mm-225mm范围内物体厚度的非接触测量误差控制在(1%H0.1)mm以内兼顾体积小、操作方便等要求。整套资料共44个文件压缩包约95.83MB包含Altium Designer原理图与PCB工程、STM32源程序、BOM物料清单及演示视频文件目录按原理图、PCB、源码等维度分类便于快速定位与复用。源程序覆盖厚度数值显示、按键调整等功能模块结合硬件设计可完整学习超声波发射接收电路、传感器选型以及单片机软件时序控制的过程演示视频展示了从硬件焊接、程序烧录到实物测量的调试流程帮助规避常见接线与配置错误。方案对影响测厚示值的因素和误差抑制思路进行了针对性梳理对关键参数调整与排错有较强借鉴意义。已有101人参与学习适合电子竞赛备赛、毕业设计及工程验证对需要掌握非接触测厚技术的开发者具有较高参考价值。1. 超声波测厚仪到底难在哪先搞清楚要测的不是厚度是时间辐射巡检、压力容器检验、船舶钢板腐蚀评估这些场景里测厚仪是刚需。拿超声波测厚仪和常见的超声波测距模块放一起对比就很直观测距模块要测的是回波到达的时刻精度到毫秒级就能用测厚仪要测的也是回波到达时刻但反射面是钢板底面声程短到只有几毫米对应的时间差是微秒甚至亚微秒级别误差 1 微秒就相当于钢铁里 3 毫米左右的偏差。所以这个标题里的关键不是超声波而是 STM32 能不能把这个时间差测准、测得稳。基于 STM32 从零做超声波测厚仪核心链路是单片机产生脉冲串激励探头 → 压电晶片振动发出超声波 → 声波在材料底面反射回来 → 同一只探头接收回波 → 前端电路把微伏级信号放大整形 → 定时器捕获回波到达时刻算出厚度。这个方案不需要专用超声芯片比如思比科或 TDC 系列STM32 的输入捕获加上合理的前端设计就够用。原理图、PCB、源程序、BOM 表一条链路下来本质上是把一套完整的模拟前端和小信号处理流程打通。这篇就按实际项目里会遇到的环节把发射、接收、定时捕获、声速校准和常见坑位逐个说清楚。2. 原理图设计要点发射激励、回波接收与 STM32 最小系统做原理图之前先明确一个系统层面的分工。STM32 负责的事是按设定频率生成一串猝发脉冲burst驱动发射电路然后立刻切到接收状态等回波进入定时器的输入捕获通道剩下那些高压产生、信号放大、波形整形的事全部由模拟电路完成。STM32 的引脚不直接驱动探头也不直接接收探头信号这两条都容易出事120V 以上的激励脉冲会打坏引脚而探头返回的微伏信号不放大根本触发不了捕获。2.1 探头的选型与等效模型工业测厚仪常用探头频率在 2.25MHz 到 5MHz 之间。频率越高近场分辨力越好能测更薄的板但衰减也快2.5MHz 是穿透力和分辨力的一个常用折中能测 1mm 到 200mm 的钢制构件。压电晶片在电气上等效为一个电容串一个电阻典型电容值在 1nF 到 3nF 之间。这个参数决定了发射电路要怎么给它充电、以多快的速度放电也决定了接收前端用什么输入阻抗去匹配。探头在原理图里不能只画一个两脚连接器了事。以最常见的单晶探头为例它工作时既当发射器又当接收器因此发射电路、接收电路和探头三者交汇的那个节点是这张原理图里最重要的一个点。交汇点需要做高压隔离与限幅否则发射脉冲直接灌进后级放大器就是烧器件的结果。2.2 发射电路电容储能加 MOSFET 快速放电发射电路常见的做法是用一只高压 DC-DC 把电源升到 80V 到 150V给储能电容充电然后用 MOSFET 把储能电容的能量瞬间释放到探头上产生一个阻尼衰减振荡激励压电晶片振动。简化原理图里通常包含三部分高压源、储能电容与放电开关、阻尼电阻。用图来描述就是下面这种结构这里给出对应的关键数值表格。元件推荐参数作用升压芯片MC34063 或 MT3608输出 100V 档位提供高压激励源储能电容 C1nF ~ 10nF耐压 200V 以上储存单次发射能量放电 MOSFET2N7002 不够用换 BSS138 或 IRLML6344快速泄放储能电容阻尼电阻 R10Ω ~ 50Ω抑制余振缩短盲区限幅二极管1N4148 两支反并联或 BAV99保护接收放大器输入端关于阻尼电阻多说一句。阻尼越大探头振动停得越快意味着盲区发射脉冲结束后无法接收回波的时间段越短近表面小缺陷的分辨力越好代价是灵敏度下降。第一次打样时这个电阻建议用可调电阻或者预留多套焊盘实测后再固定阻值。另外 MOSFET 的栅极驱动电阻也要给否则开关尖峰会耦合到接收通道。发射程序的时序和这里有关STM32 输出一串方波去驱动 MOSFET 并不合适因为激励脉冲只需要很短的一下。常见做法是IO 输出一个窄脉冲200ns 到 500ns打开 MOSFET储能电容放电一次探头自己振荡出超声频段的波。所以发射电路本质上是单脉冲激励不是连续方波驱动代码里TIM 输出比较的脉宽要按这个来调。参数脉宽 300ns、幅值 100V常见的 2.5MHz 探头用这套参数就有足够强的回波信号。2.3 接收前端限幅、放大与整形回波信号从探头回到接收端时幅度变化范围很大从紧挨着发射脉冲的近表面回波盲区之后的几百微伏到深处或衰减严重时的几十微伏再到强反射界面的几伏。这要求前端增益足够高且有动态范围但工程上常用两条腿走路一是固定高增益放大后靠比较器的阈值来挑选有效回波二是加一级可调增益用数字电位器或模拟开关切换反馈电阻。前一种原理图简单后一种调试灵活。接收链路的典型顺序是限幅二极管 → 低噪声运放第一级约 20 到 40 倍增益→ 带通滤波 → 第二级可变增益约 10 倍→ 比较器整形输出方波送给 STM32 定时器输入捕获通道。这里有两个容易踩的坑第一级运放的输入偏置电流和电压噪声会直接叠加到弱回波上选型的底线是 GBP 至少 50MHz、输入电压噪声密度低于 10nV/√Hz 的运放比如 OPA838、ADA4891 这类。比较器的滞回要留 10mV 到 30mV否则噪声会引起捕获通道上的一连串误触发。整形输出送给 STM32 的那根线上要串一个 1kΩ 电阻不是用来限流的是用来配合 STM32 引脚的内部施密特触发器消除振铃。2.4 STM32 最小系统与电源设计STM32F103C8T6 是这个标题里最常见的主控96MHz 的定时器时钟让它能捕获到大约 10ns 级别的时间分辨率对应钢中声速 5920m/s 时约 0.03mm 的厚度分辨力够用且经济。最小系统里电源、晶振、复位和下载接口这四个部分每个都不能省。电源设计上模拟前端和数字部分建议分开供电从 USB 或电池进来的 5V 经一级 LDO 降到 3.3V 给 STM32再经 LC 滤波或第二级 LDO低噪声类型如 LP5907单独给运放供电。原因是数字电路的工作电流波动会通过电源内阻耦合到模拟放大器里。晶振用 8MHz 配合内部 PLL 到 72MHz 主频晶振的负载电容按器件手册给定的 CL 值计算典型值是两个 20pF 电容并联到地。注意不要用在网上搜晶振电容计算公式时常用的C1C22CL-Cstray这句——实际打样时如果器件手册标的 CL 是 12pF两个 10pF 电容通常更接近最佳起振条件18pF 到 20pF 反而可能导致起振困难或振荡幅度过高。BOM 表里晶振电容这一项宁可用数据手册推荐值也不要拍脑袋。复位电路用简单的 RC 复位就能满足但 SDIO、USB 等外设场景注意 NRST 引脚不要直接接大电容上电时序容易出奇怪问题。SWD 下载口在原理图里预留 4 针或 5 针排针SWDIO、SWCLK、GND、3V3最好加一个可选串联电阻方便调试时断开。3. PCB 布局与布线发射高压区和接收微弱信号的物理隔离原理图画完只是第一步超声波测厚仪的性能有六七成是 PCB 布局布线决定的。原理图上干干净净的放大链路到了 PCB 上如果发射回路和接收回路在物理上靠得太近打一次脉冲就够接收端饱和半天电路板直接失灵。这里的原则不是好看是该隔的必须隔开。3.1 板层选择双面板够用四层板好在哪这个项目双面板完全能跑通关键前提是正面走信号、背面铺地。但如果追求更好的信号完整性和更小体积四层板是更稳的选择顶层放元器件信号第二层整层铺地给回波信号提供连续回流路径第三层走电源底层再补一些信号和地过孔。四层板对模拟前端的好处非常直接回流面积小发射脉冲的共模干扰不容易串进放大链路。被问到最多的板厚问题也在这里1.6mm 标准板厚对测厚仪没有特殊影响但探头连接器如果选用 BNC 座焊盘到板边的距离要留够。层叠结构上四层板按信号-地-电源-信号排布是标准做法不要为了省成本把电源放第二层那样第三层的信号回流路径会被切断。3.2 分区布局发射、接收、数字三区一字排开PCB 布局按信号流向一字排开最保险左侧是高压 DC-DC 和发射电路中间是探头连接器与接收前端右侧是 STM32 与显示/按键。发射区和接收区之间用地过孔栅栏隔离尽管理论上模拟地和数字地要单点汇合但具体做法比原则更重要。地平面的处理上常见做法是整块 PCB 不做大面积切割而是保持地平面连续在发射区下方和接收区下方用多个过孔连接到底层地。接收回路只允许在地平面的一个点上连接到主地这个点选在探头连接器的地引脚处最合适。若模拟地和数字地之间用过孔串联磁珠或 0Ω 电阻要记得它们应该放在 STM32 的 AGND 和 DGND 之间而不是放在运放附近。溢出到地平面的发射电流是主要噪声源高压电容的地引脚直接打到主地不要和放大器的地共享过孔。3.3 关键走线规则与间距一条参数表把布线规则列全方便在 Altium Designer 或嘉立创 EDA 里直接建规则网络/区域走线宽度间距要求说明高压 V100V≥ 1.0mm与其他网络 ≥ 1.0mm防止爬电必要时开槽发射脉冲线0.5mm距离接收输入线 ≥ 3mm最关键的隔离间距回波信号线0.3mm两侧包地地线宽 ≥ 0.3mm防止相邻信号串扰模拟电源线0.5mm与数字信号线 ≥ 0.8mm减小电源纹波耦合晶振两条线0.3mm平行段越短越好加地隔离避免晶振谐波串入前端STM32 数字信号0.2mm ~ 0.3mm≥ 0.15mm 常规注意 SWD 差分对回波信号线包地这条要刻意做。从探头连接器到第一级运放这段走线不要直接连通而是先打过孔到地平面层再从地平面另一侧走一小段微带线进入运放输入。这样做的好处是打断发射脉冲通过空间耦合进来的共模电流路径。如果 PCB 面积允许接收前端整个用一个小屏蔽罩盖起来是最有效的屏蔽罩接地焊盘要沿四周连续放置过孔。3.4 元器件摆放顺序与散热问题高压 DC-DC 的功率电感和续流二极管不要放在板子边缘它们产生的磁场会影响邻近走线。储能电容和 MOSFET 的泄放回路要短回路面积越小发射的电感尖峰越小。探头连接器最好放在板边让探头线悬空出来避免探头线成为天线。还有一个容易忽略的地方OLED 显示屏的排线或 FFC 线如果走过了发射区上方显示内容会跳动测量数据也可能突变。显示排线尽量安排在板子底部和 STM32 在同一侧远离发射电路。BOM 表里如果包含蜂鸣器或 LED 指示其驱动线的走线方向也不要和回波信号线平行超过 1cm否则每一次按键提示音都会变成一个假的回波脉冲。4. 源程序设计定时器捕获回波时间与声速校准流程硬件链路搭好之后源程序是决定能不能显示厚度的关键。软件的主要矛盾是要在准确度和实时性之间找一个平衡单次测量受噪声和材料不均匀影响很大必须做多次采样和中值处理但又不能让操作者等太久。程序的核心结构是初始化定时器、发射脉冲、等待捕获中断、计算厚度、数据平滑、显示刷新。4.1 定时器资源分配与输入捕获配置STM32F103C8T6 里注意区分定时器功能的复用关系。常见做法是TIM1 的通道 1 做 PWM 输出用于产生发射激励信号TIM2 的通道 1 做输入捕获接比较器整形输出的回波信号。这里有个隐含的顺序要求必须先启动 TIM1 发射之后立即把 TIM2 的捕获功能打开而且捕获的触发沿选择上升沿还是下降沿要取决于整形电路。比较器整形输出通常是高电平空闲没有回波时输出高阻或固定电平回波到来时产生一个负向脉冲。这种情况下捕获通道应配置为下降沿触发。如果整形电路设计成空闲低电平、回波产生正向脉冲则配上升沿。这个细节在原理图阶段就要决定软件里的时钟极性和电路极性必须一致否则差的就是半个回波周期厚度误差在钢材里就是 1.5mm 左右。捕获时间的起点也要明确回波是从发射脉冲前沿开始计时的但发射脉冲本身要把 MOSFET 打开到探头起振中间存在固有的延迟。可以在软件里做一点补偿先测出零厚度时的收发延迟然后在所有计算结果中减去这个偏置值。这个偏置值的获取方法很简单把探头对准一个厚度已知的薄片比如 1.00mm 塞尺反推出来。4.1.1 发射脉冲的 PWM 配置发射端的关键是发射猝发脉冲束burst中单脉冲的宽度和数量。前面原理图部分说了 MOS 管需要的是窄脉冲激励代码里如果用 PWM 模式持续输出方波是不合理的。推荐的做法是用 PWM 模块输出一个由 N 个脉冲组成的 burstN 通常取 3 到 10 个。脉冲越少带宽越宽探头晶片起振越猛但也会引入更多噪声脉冲越多能量越集中回波越强但盲区也更大。下面用 HAL 库给出一个 TIM1 输出单脉冲的示例注释里写清楚参数void MX_TIM1_Init(void) { TIM_OC_InitTypeDef sConfigOC {0}; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig {0}; htim1.Instance TIM1; htim1.Init.Prescaler 72 - 1; // 72MHz/72 1MHz计数时钟 1us htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period 1000 - 1; // PWM 周期 1ms相当于重复频率 1kHz htim1.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter 0; HAL_TIM_PWM_Init(htim1); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 300; // 脉宽 300ns实测激励最佳值 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; sConfigOC.OCIdleState TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1); }这里 Prescaler 设成 71 是为了得到 1MHz 的定时器计数频率Period 设成 999 是为了发射脉冲的重复周期在 1kHz 左右。实际使用中重复频率要和你期望的测量速度匹配每秒测 100 次已经是人的操作极限1kHz 的触发频率偏高会导致探头持续发热。这个配置在代码调试时先确认能正常输出之后再把 Period 改成 1000010ms 周期降下来。4.1.2 输入捕获的配置与中断处理回波信号经比较器整形之后到达 TIM2 的 CH1输入捕获模式配置如下void MX_TIM2_Init(void) { TIM_IC_InitTypeDef sConfigIC {0}; htim2.Instance TIM2; htim2.Init.Prescaler 72 - 1; // 同样分频到 1MHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 0xFFFF; htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(htim2); sConfigIC.ICPolarity TIM_INPUTCHANNELPOLARITY_FALLING; sConfigIC.ICSelection TIM_IC_SELECTION_DIRECTTI; sConfigIC.ICPrescaler TIM_ICPSC_DIV1; sConfigIC.ICFilter 0x0F; // 数字滤波滤掉窄毛刺 HAL_TIM_IC_ConfigChannel(htim2, sConfigIC, TIM_CHANNEL_1); }ICFilter这个参数值得单独说明。它配置的是输入信号数字滤波器的采样窗口值越大能滤掉的毛刺宽度越宽但也会把真正窄的回波脉宽滤掉。钢材测量中回波脉冲宽度在几百纳秒到几微秒之间设成 0x0F 相当于采样窗口约 60ns能挡住大部分噪声而不丢真实回波。铝合金声速约 6320m/s或塑料声速约 2700m/s中回波更窄这里就应该减小到 0x07 或 0x03否则厚度小于 2mm 时会直接漏掉回波。捕获中断里把定时器的计数值读出来void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { raw_time HAL_TIM_ReadCapturedValue(htim2, TIM_CHANNEL_1); measure_done 1; } } }注意捕获中断更新频率不要太高。如果每次都能抓到一个回波说明前端信噪比良好如果在真实回波之外还频繁抓到噪声脉冲就要回到比较器的滞回电压上做调整这是硬件问题软件加滤波治标不治本。4.2 厚度计算与多点采样策略单次捕获得到的 raw_time 是 1MHz 计数频率下的定时器计数值单位是微秒。钢中的声速是 5920m/s用公式 d (t × v) / 2 计算厚度t 的单位是秒v 是 5920m/sd 是毫米计算时如果 raw_time 单位是微秒结果要先除 1000 再乘 2.96即 5920/2000代码里是float calc_thickness(uint32_t time_us) { float v 5920.0f; // 钢的标准声速 m/s float t_s time_us / 1e6f; // 把us换算成秒 return (t_s * v * 1000.0f) / 2.0f; // 毫米 }实际测量中探头压紧力、耦合剂厚度、材料局部晶粒状态都会让单次测量结果抖动 0.1mm 以上。所以要连续测量 8 次到 16 次排序后取中值。简单平均会引入离群值的偏差中值滤波在厚度测量上的效果远好于平均法。再配合逝去时间滤波超过 1 秒未更新的数据逐渐淡出来避免屏幕上数值跳变。4.3 声速校准试块反推与温度补偿不同材料甚至同一块钢不同温度下声速都不同。出厂的测厚仪都要内置一个校准流程用户选择一个已知厚度的试块把探头放上去测一次仪器反推当前声速。反推公式是 v 2d / t直接改写上面的计算函数void calibrate_speed(uint32_t measured_time_us) { float reference_thickness_mm 10.0f; // 试块厚度按实际写入 float t_s measured_time_us / 1e6f; calibrated_speed (2.0f * reference_thickness_mm / 1000.0f) / t_s; }校准完成后把 calibrated_speed 存入 STM32 的内部 Flash用 HAL_FLASH_Program 写入一个固定地址下次开机读出来继续用。这个流程记得要防呆如果试块厚度输入为 0 或时间差为 0不能执行校准否则会把声速算成无穷大。温度补偿方面钢板每升高 100°C声速大约下降 1% 到 3%。如果这个仪器用来测高温管道就不只是校准一次的问题而是在软件里加一个温度传感器读取常见的 DS18B20 就够了按线性系数修正声速。但这个功能做不做取决于使用场景常温巡检场景开这个功能反而增加用户操作负担。5. 实测验证与三个高频问题排查板子打样回来程序烧进去探头插上拿标准试块开始验证。验证顺序和排查手段决定了一次调试要几天还是几小时这章就把关键验证节点和经常出问题的位置列出来。5.1 示波器上看三个波形第一处看 TIM1 CH1 的 PWM 输出确认脉宽和周期对着示波器读数调重点排除晶振起振不对、PLL 配置错误导致的频率偏大或偏小。第二处看 MOSFET 的漏极波形这里应该能看到振幅接近高压、阻尼衰减的超声激励脉冲。如果漏极波形不振铃而是光滑的充放电曲线检查探头和阻尼电阻是否焊接正常。第三处看 TIM2 CH1 的捕获引脚这里应该出现一串和激励信号相隔一定时间的窄脉冲这段间隔就是超声波在材料里的往返时间。三处波形齐全整个链路就通了一大半。如果第三处没有信号先从第二处往前查因为第三处没有的话就说明回波根本没到整形端后面的代码再改都没用。5.2 厚度读数不准的排查顺序现象诊断方向处理动作厚度偏大捕获到的不是第一次底波而是二次回波增大比较器阈值滤掉幅值偏小的二次回波厚度偏小捕获到的是近表面杂波增大阻尼电阻检查盲区提高比较器滞回电压读数抖动超过 0.2mm探头压紧力不稳或耦合剂量变化重新涂耦合剂垂直压紧增强中值滤波组数换不同材料偏差大声速未校准对每种材料单独校准声速温度升高后读数漂移声速温漂增加温度传感器做补偿或每次测量前用试块校准5.3 探头线缆与连接器带来的衰减坑低成本的 BNC 探头线缆在 2.5MHz 频率下损耗并不大问题通常出在探头本身的老化或内部晶片脱胶。如果直接用手头的试块测出来厚度稳定但和标称差个固定值而声速校准也无法修正这通常不是模拟前端问题而是换一个探头试试就能确认的事。这不是玄学是耦合剂、探头晶片和阻抗匹配几层因素叠加的结果属于现场最常见的误判源。另外一个实际技巧测曲面比如管道外壁时平面探头和曲面之间缝隙会引入耦合误差读数会系统性偏大。常见做法是换用曲面探头或者在小管径场景下用高粘度的耦合剂补缝隙并在软件里对曲率做一个线性修正系数。修正系数可以用一个已知管径的试件反算出来再固化到配置参数里。5.4 盲区、盲区、盲区收尾前先自测最薄试块仪器合不合格先拿一块 1.2mm 的薄板量一次。量不出来就回到阻尼电阻上把阻值改小一点再重新调比较器阈值。这两步同时调整时注意互相影响阻尼小、灵敏度高近表面杂波也大阈值高、抗干扰好但弱回波会丢。这是一个取舍过程没有固定的万能参数需要在实验室里对着已知厚度的试块来回调几次才能定型。整个方案做到这里原理图、PCB、源程序、BOM 表四件套的意义就落在这些参数调整上了。BOM 表里每一个元件的型号和取值都有对应的调试环节改任何一处都会在示波器波形或厚度读数上留下痕迹。项目交付时演示视频里值得拍的也是这些波形和标定的过程一句能测不说明问题拍下高精度试块的稳定读数才是验收下线的依据。本文还有配套的精品资源点击获取
返回列表