尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MCU内置资源实现电感感应测量:原理、方案与实战

MCU内置资源实现电感感应测量:原理、方案与实战 提到电感感应不少工程师的第一反应是专用芯片比如TI的LDC系列。我也曾经这么想直到一个成本敏感的项目把我逼到墙角——一颗专用感应芯片的采购价比我整个MCU还贵。于是我开始认真研究MCU自身的资源到底能不能扛下电感测量的活。结果发现大多数场景下答案是肯定的利用MCU内置比较器、定时器和GPIO的组合完全能完成LC振荡的激励、整形和测量。精度虽然比不上专用芯片但胜在成本低、灵活性高而且信号处理、闭环控制都能在同一个MCU里完成。这篇文章会把这几年我在MCU电感感应方案上的积累尽量完整地讲清楚从物理原理到电路选型从固件实现到量产标定再到常见坑的解决办法。目标是让准备用这个方案的朋友少走弯路。哪怕是刚入门嵌入式开发只要手头有一块带比较器和输入捕获定时器的板子再画一个简单的PCB线圈就能把整个链路复现出来。1. 为什么一颗普通MCU能测金属电感变化到电信号的通路1.1 目标物靠近线圈时到底发生了什么事电感量L的物理定义说穿了就是单位电流变化引起的磁链变化L N·Φ/i。它取决于线圈匝数N、几何形状、磁路结构以及磁路中介质的磁导率。在线圈结构固定的前提下能让L发生改变的外部因素就是线圈周围的介质。金属目标靠近时线圈周围空间的等效磁导率发生变化具体有两种机制同时存在。第一种是铁磁性材料比如铁、镍、钴及其合金。这类材料的相对磁导率远大于1铁块通常在200到几千之间。把铁块放进线圈的磁场范围磁路径的磁阻显著变小相同电流能建立的磁通更多于是线圈表现出的电感量明显增大。这个效应非常强成熟的设计甚至在几十毫米外都能测到。第二种是非铁磁性但导电的材料比如铜、铝、不锈钢。交变磁场会在金属表面感应出涡流涡流自身产生的磁场方向与原激励磁场相反等效于在线圈旁边放了一个短路的次级线圈。结果是把磁通顶回去一部分同时涡流在金属电阻上损耗能量宏观上表现为电感量减小、等效串联电阻增大。这里要强调一个容易被忽略的设计细节这两种机制是并存的只是谁强谁弱的问题。铁磁性材料靠近时虽然也有涡流衰减效应但磁导率增强效应通常占主导所以铁块表现为电感增大而铜铝这类没有磁导率增强效应的材料只有涡流损耗表现为电感减小。做检测算法之前先确定目标材料再根据电感变化的极性判断来了还是没来逻辑才能写对。1.2 从L到频率再到MCU内部资源的协作路径电感量是模拟量里比较难直接处理的量你没法像读电压一样用ADC去读它。但在电路层面把L和一个固定电容C并联组成谐振回路后L的变化会直接体现在谐振频率上f 1 / (2π√(LC))MCU最擅长的事情就是计数和计时频率、周期正好是它的主场。所以整个方案的核心思路浓缩成一句话让目标物引起的电感变化最终表现为一个可数的频率变化然后用定时器把这个频率差数出来。具体到MCU内部需要几个单元协同工作比较器LC回路产生的振荡信号是近似正弦波MCU的数字引脚读不了正弦波的中间电平。比较器负责把正弦波变成同频率的方波它的滞回电压还能顺带滤掉一部分毛刺噪声。定时器输入捕获方波送到定时器的捕获通道记录每个上升沿的计数器值两个连续上升沿的差值就是振荡周期。周期取倒数换算成频率。GPIO负责整个测量链路的电源管理。测量时给LC回路供电测完立刻断电降低整体功耗多通道设计时也是靠GPIO切换线圈通路复用同一套定时器和比较器。这只是一个基本骨架。实际工程里还会用额外的GPIO控制激励脉冲、用DMA搬移数据、用多个定时器做不同测量模式但原理都一样把电感变化最终变成计数器里的数字。MCU方案不适用的情况我也直接说。如果应用要求亚微米级位移分辨率或者测量速度要求每秒上万次采样又或者系统本身的电磁噪声已经大到把频率信号淹没在抖动里这时候专用电感数字转换器会明显更强。专用芯片内部有高精度激励源和窄带滤波器这些确实是通用MCU不具备的。做方案选型时先问自己分辨率要求到底是多少大多数金属接近检测场景MCU方案完全够用。2. 三种测量方案怎么选振荡测频、衰减计时与直接采样的对比2.1 振荡测频法电路最简单位置测量最稳振荡测频法的电路结构大概长这样被测线圈L和一个高品质电容C并联再接一个反相放大器或者比较器构成正反馈整个回路开始自激振荡。测量目标物靠近前后振荡频率的变化就能反推电感的变化。电路搭建上有两种常见做法。一种是施密特触发器接法用一个施密特缓冲器配合反馈电阻给LC回路提供偏置和能量补偿。成本最低但振荡波形畸变相对大频率抖动也大一些。另一种是MCU内部比较器接法把比较器输出经一个电阻反馈到LC回路利用滞回特性维持振荡。这种方式波形更干净而且比较器阈值由芯片内部参考决定不同批次的一致性更好。选电容的时候要特别小心。LC回路的电容必须用C0G/NP0材质温度系数只有±30ppm/°C非常稳定。不要用X7R或者更差的Y5V它们的容值会随温度和直流偏压剧烈变化直接把你测量的频率漂移淹没。我见过不少项目测不准最后查出来就是一颗X7R电容在作怪换成C0G之后数据立刻稳定下来。灵敏度的推算思路是这样的对f 1/(2π√(LC))求微分可以得到Δf/f -(1/2)·(ΔL/L)也就是说电感变化1%频率大约变化0.5%。如果你的目标是检测5%的电感变化频率上能看到的相对变化大约2.5%。在1MHz的振荡频率下这就是25kHz的变化量用定时器测周期绰绰有余根本不需要额外的硬件。2.2 衰减计时法对导电金属更灵敏特别省电衰减计时法的思路和测频法完全不同。它先给LC回路一个短促的脉冲激励让回路储存能量然后断开激励让回路自由振荡。由于线圈的等效串联电阻和涡流损耗振荡幅度会按指数规律衰减。金属目标靠近时涡流损耗增大等效Q值下降衰减速度明显变快。实现起来比测频法多两个步骤GPIO输出一个激励脉冲比如5μs的高电平确保覆盖多个谐振周期让回路充分储能随后立刻切换成高阻输入模式比较器一直在监视振荡幅度等幅度衰减到阈值以下时输出翻转定时器记录从激励结束到翻转的时间差。这个方法有两个很吸引人的特点。第一是灵敏度对导电金属特别好因为涡流损耗直接参与衰减过程哪怕是很薄的铜箔也能拉出明显的时间差。第二是功耗低整个测量窗口只有一两百微秒测完整个回路断电特别适合电池供电的可穿戴设备。它的代价是测量线性度比较差衰减时间与距离、材料性质之间不是简单线性关系往往需要查表或拟合曲线。所以衰减计时法适合做定性检测——比如有没有金属靠近锅放上来了没有这类开关量判断不太适合做高精度的连续位置测量。2.3 直接采样法需要ADC适合特殊场景还有一条路是直接用ADC采样。思路分成两种一种是用固定频率的正弦信号激励线圈然后采样线圈两端的幅度和相位金属靠近时幅度和相位都会变化。另一种是把RL回路串在回路里测瞬态响应曲线上的一个点。直接采样法对MCU的ADC分辨率和采样率要求比较高一般需要12位以上ADC采样率至少几百kSPS而且激励信号需要一个DAC或者PWM加滤波产生硬件复杂度上去了。优点是能在同一个采样周期里同时获得幅度和相位两个信息对区分不同金属材料有帮助。我的经验是除非确实需要区分金属材料否则尽量别走这条路。振荡测频和衰减计时是性价比最高的两个方案大多数项目这两个就能覆盖。2.4 三个方案的横向对比方案测量量需要的外设金属灵敏度线性度功耗典型场景振荡测频法频率/周期比较器输入捕获定时器中高较好中可关断位置测量、金属接近、液位衰减计时法衰减时间GPIO比较器定时器高导电金属差低锅具检测、低功耗接近直接采样法幅度/相位ADCDAC/PWM可区分材质较好高材料识别、复杂检测选择时我的建议很简单第一优先考虑振荡测频法因为它最稳、最好标定如果功耗卡得紧且检测目标是导电金属换成衰减计时法只有需要识别材料时才上直接采样法。3. 我可复现的金属接近检测Demo线圈设计、代码与实测数据3.1 PCB线圈怎么画一个实际可用的设计电感感应的第一颗零件就是线圈。绕制方式很多但量产场景下我最推荐用PCB线圈结构一致性好、不用额外的绕组骨架、加工成本几乎为零。一个我常用的设计参数供参考外形外径12mm内径4mm的圆形线圈层数4层每层8匝走螺旋线线宽/线距0.15mm / 0.1mm过孔连接各层最终电感量实测约22μH与1nF的C0G电容并联理论上谐振频率为f 1/(2π√(22μH × 1nF)) ≈ 1.073MHz画板时有几个细节要特别注意。第一线圈下方尽量不要有完整的地平面。完整地平面会大幅降低线圈Q值并且屏蔽磁场向目标方向的辐射。如果结构上必须要铺地就在线圈正下方的地平面做开窗或者开槽。第二线圈的两根引线尽量短不要在同一层长距离并行否则会引入寄生电感和不必要的耦合。第三普通PCB阻焊层就够用不需要额外加厚绝缘。想把检测距离拉长的话优先加大线圈外径而不是增加匝数。检测距离大致与线圈外径成正比外径翻倍检测距离大约也能翻倍。增加匝数对检测距离的贡献很小但会推高Q值、增大谐振阻抗对信号的稳定性影响比较复杂。这个经验我踩过好几次坑以前总想着加匝数提灵敏度结果距离没增加多少频率倒是抖得厉害。3.2 固件怎么测频率输入捕获代码实例以STM32为例定时器配置成输入捕获模式。核心思路是让定时器自由计数捕获通道记录每个上升沿的计数器值在中断里计算相邻两个上升沿的差值。只要MCU主频已知周期时间的计算就出来了。/* 定时器输入捕获配置以TIM2_CH1为例 */ static void ic_config(void) { GPIO_InitTypeDef gpio {0}; TIM_IC_InitTypeDef ic {0}; __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); gpio.Pin GPIO_PIN_0; gpio.Mode GPIO_MODE_AF_PP; gpio.P
返回列表