资讯动态

用PSoC可编程模拟前端实现电感感测:原理、设计与调试指南

发布时间:2026/8/26 2:59:54 来源:尧图企业网站定制
做金属接近检测、转速测量这类项目时我第一反应往往不是去选专用感应芯片而是把手头那颗PSoC MCU的模拟资源用起来。PSoC里带的可编程模拟前端配合外接一个线圈和电容就能直接做Inductive Sensing电感感测不需要额外堆料PCB上只多两个器件非常干净。这个方案最适合两类人一类是产品里MCU还没定希望用一颗芯片同时搞定主控和电感检测的另一类是已经被专用电感数字转换器LDC的价格和采购周期劝退想看看通用MCU能不能凑合出够用的方案。PSoC做电感感测本质上是在同一个芯片里把“前端激励、谐振检测、信号转换、算法判定”全串起来省掉独立模拟前端和MCU之间的通信开销响应速度还能更快一点。我去年用这个思路做了一个金属物体接近检测的Demo板从画线圈到调完灵敏度前后大概三天。下面把整个方案的原理、硬件设计、软件配置和调试踩坑都整理出来供想抄作业的朋友参考。1. 为什么用PSoC来做电感感测1.1 PSoC在电感感测里到底扮演什么角色先理清一个概念电感感测本身不依赖PSoC任何MCU只要带比较器和定时器理论上都能做。真正的差异在于PSoC把模拟前端做成了可编程的你不用在芯片外面搭一堆运放、比较器、精密电流源而是直接在芯片内部把这些功能模块连起来。PSoC内部的IDAC电流DAC用来给LC谐振回路注入激励脉冲内部比较器检测振荡波形定时器或计数器记录振荡周期数同时DMA自动搬运数据。这套链路几乎不需要CPU干预MCU可以做主控逻辑、通信协议甚至同时跑CapSense触摸感应因为PSoC 4/6系列的这些模拟资源是可以并行配置的。我在项目里用的是PSoC 4系列片上自带一个被称为“电感感测”的专用组件组件内部其实就是由比较器、IDAC、逻辑阵列组合成的。只要在PSoC Creator里把组件拖到原理图上配置好线圈频率和激励电流就可以开始读数了。1.2 为什么不直接上TI的LDC系列市面上有现成的电感数字转换器比如LDC0851、LDC1000、LDC1614性能和功耗都很好适合做极高精度的电感测量。但对我这个项目来说用LDC有几个绕不开的问题第一是独立芯片需要额外的I2C或SPI通信总线上再挂主控MCUBOM多一颗料第二是LDC芯片本身不便宜量大可能还好小批量打样时单颗价格就肉疼了第三是如果项目里本来就需要ADC、电容触摸、通信接口一颗PSoC通吃的话整体方案更简洁。另外还有一个实际原因LDC是数字输出你得把它当作传感器来读但很多实时性要求高的场景比如每分钟几万转的齿轮测速希望检测到金属齿的瞬间就能产生中断此时PSoC的模拟比较器可以直连内部逻辑产生输出事件延迟比走I2C低一个量级。1.3 整体架构一句话描述PSoC内部由IDAC给外接的LC电路一个冲击激励LC振荡后逐渐衰减振荡频率和衰减速度会随着金属物体靠近线圈而改变比较器把振荡波形整形成方波内部计数器在固定时间窗内数方波沿最后把计数值转成原始数据再通过校准和滤波判目标是否存在。整条链路的原理简单但每一环节都有不少细节。2. 电感传感的原理与硬件设计要点2.1 涡流效应为什么金属靠近会让线圈电感变化电感感测的物理基础是涡流效应。线圈通入振荡电流后会在周围的金属导体里感应出涡流这个涡流又会产生反向磁场削弱线圈本身的磁场等效结果就是线圈的电感量变小同时线圈的等效串联电阻变大。如果金属目标越靠近线圈涡流越强电感量下降越明显损耗也越大。体现在电学参数上就是LC谐振频率升高因为频率 ≈ 1/(2π√(LC))以及振荡衰减变快。我刚开始理解这个的时候老是弄反以为金属靠近会增加电感。你可以这么记线圈产生的磁通被金属里的涡流“抵消”了一部分相当于磁路的有效导磁率降低所以等效电感是减小的。2.2 PSoC到底怎么测这些变化根据上面的原理电感变化可以用两种方式测测谐振频率变化金属靠近使LC谐振频率升高比较器输出的方波频率随之升高固定时间内过零次数变多。测振荡衰减速度金属靠近使等效串联电阻增大LC振荡衰减得更快比较器能检测到的有效振荡周期数变少。PSoC的官方电感感测组件主要用了第二种思路由IDAC输出一个电流脉冲给LC回路“打一下”回路开始自由振荡比较器在振荡幅度高于阈值时输出方波组件的计数器记录从激励开始到振荡衰减到阈值以下的周期个数。这个记录值就是原始数据不同距离、不同材质目标会得到不同的读数。我实际测试下来记录周期数比直接测频率更稳定因为频率测量在高Q值回路下对噪声更敏感。2.3 PCB线圈设计形状、尺寸、匝数线圈是整个系统最核心的传感器件设计得好不好直接决定灵敏度。我这次用的是PCB螺旋线圈没有绕制分立电感因为PCB线圈一致性高、批量生产时不需要人工绕线、寄生参数也更可控。我用的参考线圈参数是这样的参数数值说明线圈外形方形螺旋布线方便外圈边长18mm目标检测距离一般小于线圈直径的1/3匝数12匝圈数越多电感越大但寄生电容也越大线宽0.2mm太细绕线电阻大Q值低线距0.2mm与线宽一致即可层数2层串联2层走线进一步增加电感量中心过孔有从外圈进、内圈出实测这样做的线圈电感量大约在8µH到12µH之间具体要看板子的叠层和铜箔厚度。PSoC内部有激励电路对电感量要求比较宽泛从几µH到几百µH都能工作但不同电感量匹配的并联电容值不一样。2.4 并联电容选择与谐振频率计算电感感测需要一个并联电容构成LC并联谐振回路。电容大小直接决定谐振频率而谐振频率又影响系统的功耗、抗干扰能力和检测灵敏度。谐振频率公式就是经典的f 1 / (2π√(L×C))我取线圈电感L10µH并联电容C68pF算下来谐振频率大概是f 1 / (2 × 3.14159 × √(10×10⁻⁶ × 68×10⁻¹²)) ≈ 6.1MHz这个频率范围比较适中。如果频率太高比如超过20MHzPCB走线寄生电容对结果影响很大板子稍长一点读数就飘如果频率太低低于几百kHz线圈容易拾取环境噪声而且检测响应速度变慢。电容建议选C0G/NP0材质的贴片电容温漂小不要用X5R/X7R因为这类高介电常数陶瓷电容在温度变化时容值可能偏掉10%以上直接影响频率稳定性。我第一版随手焊了个X7R的100pF温度升高10度后读数漂了差不多20%换C0G后立刻稳定了。2.5 传感器板布局的关键细节线圈到PSoC引脚之间无论走线还是飞线都要尽量短。这段引线的等效电感和寄生电容会串到LC回路里等于白送的误差源。我做过一个对比测试线圈板与主控板通过5cm的杜邦线连接原始数据噪声是直接贴在同一块板子上的近3倍换成FPC软排线之后噪声虽然小了一些但依然比同板连接高。所以最好是线圈直接画在主板上或者通过极短的PCB连接器连接。另外覆盖在LC回路底下的大面积铜皮会导致严重的涡流损耗降低Q值。画板时注意线圈下方不要铺整片的铜皮尤其是不要直接在底下布置长距离的电源走线。我有一版为了美观把地铜皮铺满了结果灵敏度掉了将近一半后来把线圈正下方的铜皮挖空才恢复。3. PSoC软件配置与数据处理流程3.1 PSoC Creator里的电感感测组件配置如果你用PSoC Creator可以直接在组件目录里搜索“Inductive Sensing”。这个组件会自动配置IDAC电流、比较器阈值、扫描序列和计数器逻辑。你主要配置的参数有激励电流范围根据线圈电感量选择合适的IDAC档位。电感小、谐振阻抗低需要更大激励电流才能起振。比较器输入极性确保比较器能正确检测振荡波形的过零翻转。扫描重复次数每次检测可以重复激励多次取平均值用来降噪。时钟源组件内部的计数器时钟决定了测量周期计数的分辨率。对于我用的10µH线圈和68pF电容激励电流选在200µA级别就能稳定起振。电流太小会导致振荡幅度不够、比较器误触发电流太大则发热明显也会增加功耗。3.2 原始数据的读取方式组件配置好之后读取原始数据本质上是读一个寄存器或者DMA搬运出来的数组。为了更直观理解我通常不用官方组件自带的数据格式而是自己写一个简单的状态机采样序列如下#define SAMPLE_COUNT 16 uint16_t raw_samples[SAMPLE_COUNT]; uint8_t sample_index 0; void inductive_sensor_scan(void) { if (sample_index SAMPLE_COUNT) { // 启动一次激励等待组件完成转换 Inductive_StartScan(); while (!Inductive_IsScanComplete()); // 读取当前周期计数值 raw_samples[sample_index] Inductive_GetRawCount(); sample_index; } }这只是示意实际项目里我会把“等待转换完成”改成中断回调或DMA完成中断避免主循环空转。因为电磁阀、电机这类设备切换时对实时性有要求主循环不能一直阻塞在读数据上。3.3 校准与阈值判定别拿原始数据直接用原始数据会受线圈本身、安装间隙、PCB板材、环境温湿度影响每块板子的值可能不一样所以必须做一个初始化校准流程。我的做法是上电后先等待200ms让电源和振荡器稳定。确保目标物处于“无目标”状态连续采集32次数据。计算32次数据的平均值 mean_baseline 和标准差 sigma。把检测阈值设置为 mean_baseline - 3×sigma。之所以是减是因为金属靠近时振荡衰减更快周期计数会减少。实时数据低于阈值就认为检测到目标否则认为无目标。这个3×sigma的规则在正态分布假设下误报率很低但实际数据不完全是正态的我会在调试时观察实时曲线再微调系数。如果数据抖动大可以提高到5×sigma来避免误触发代价是检测距离变小。3.4 滤波策略移动平均与中值滤波的组合原始数据即使做了校准依然会有周期性噪声和尖刺。我分别试过滑动平均、中值、加权平均最后用的是两步滤波第一步先做3点中值滤波专门干掉尖刺脉冲。中值滤波对“偶尔冒出来的毛刺”很有效而且不会像均值那样把真实突变抹平。第二步再做8点滑动平均平滑周期性噪声。滑动平均对降低高斯白噪声的作用很明显但会带来一定延迟如果检测响应时间要求小于10ms窗口点数不要超过8。伪代码如下uint16_t median3(uint16_t a, uint16_t b, uint16_t c) { if (a b) { uint16_t t a; a b; b t; } if (b c) { b c; } if (a b) { b a; } return b; }注意上面这段只是排序思路的简化示意实际写的时候别写错边界条件。中值滤波接均值滤波实测可以把原始数据的峰峰值噪声从±15左右降到±3以内。3.5 动态目标的响应优化如果目标是运动的比如齿轮齿片扫过线圈每次经过只有几十毫秒那么滤波窗口就不宜太长否则响应跟不上。我在某个测速项目里齿轮的齿宽对应的时间只有约8ms8点滑动平均在2kHz采样率下延迟是4ms刚好能接受。如果觉得滤波延迟依然大可以改用“事件触发式”检测比较器输出直接接内部逻辑当计数结果低于阈值时立即产生中断由中断进入目标处理函数不经过软件滤波。这种方式的响应延迟几乎可以忽略。4. 实际调试过程与效果分析4.1 一步步从零把数据调出来我以金属接近检测为例详细说一下调试步骤。假设你用的是PSoC Creator板子已经画好线圈和电容已经焊上。第一步先给PSoC下载一个最简单的工程只初始化电感感测组件和UART把所有原始周期计数通过UART打印到串口助手。注意串口波特率给到115200以上不然数据刷新率太低看实时曲线会卡。第二步把串口数据的刷新率调高。我一般让PSoC每5ms发送一帧原始数据即200Hz刷新率调参时能看到明显波形。如果数据完全不动优先检查硬件连接LC回路是否焊好、电容有没有虚焊、PSoC引脚配置是否正确。第三步手拿金属物体靠近线圈观察原始数据变化。正常情况是数据值随靠近呈单调变化。如果方向不对检查是否因为电容选择问题导致工作点跑到谐振区之外或者比较器极性反了。第四步找到数据差异最明显的距离区间缓慢移动金属片记录不同距离下的数据画出距离-数据曲线。这个曲线会决定后续校准范围。4.2 实测数据不同材质和距离的读数为了说明效果我记录了一组数据。使用的是上面那款18mm方形线圈、68pF电容、200µA激励电流、无目标时原始周期计数在5800左右。目标物距离1mm距离3mm距离5mm距离8mm钢片 1mm厚4320512054105610铝片 1mm厚3980478051005380铁片 1mm厚4100489052305470塑料片5800579058105800可以看到同等距离下铝片比钢片读数变化更大因为铝的电导率更高涡流更强。铜片理论上比铝还要明显但我手边没有合适的铜片就没放进表里。塑料片对读数几乎没有影响这是电感感测相比电容感测的一个优点不会因为介电常数的变化误触发。因此这个方案非常适合检测金属目标、忽略木头或塑料的背景。4.3 距离-数据曲线怎么用来设阈值无目标基线是58003mm距离的钢片数据是5120差值将近700而噪声峰峰值只有±15所以检测余量非常充足。即使温度漂移让基线偏了100个计数值3mm距离处依然不会误判。如果目标检测距离只有5mm那么阈值可以设在5400到5500之间。我通常按“检测距离的一半”来设置阈值保证可靠性的同时保留响应裕量。4.4 调参时的几个关键观察实际调参过程中有几个点比教科书更容易踩坑。第一个是激励电流不要盲目加大我发现激励电流从200µA加到500µA后原始数据看起来幅度更大但噪声也变大了信噪比反而没有提升多少。原因是IDAC大电流会给LC回路注入更多宽带噪声。第二个是电容容值不能随便换我试过把68pF换成220pF来降低谐振频率结果检测灵敏度明显变差因为频率降低后相同电感变化量引起的频率变化比例变小了计数值变化就没那么明显。第三个是线圈的Q值非常关键。Q值高意味着振荡衰减慢一个扫描周期内能测到更多振荡沿微小的电感变化在计数上会被放大。Q值主要由线圈的串联电阻决定所以PCB线圈走线尽量用宽线同时表面不涂覆阻焊油墨可能也会略好一点但这影响通常很小。5. 常见问题与排查技巧实录这一节我把实际项目中遇到过的、以及同行问我问得最多的问题集中整理出来都可以直接对着排查。5.1 读数跳变厉害数据不稳定的几种原因如果同一个距离下读数跳变超过±30我先去检查电源。PSoC的模拟前端对电源纹波很敏感如果供电是DC-DC开关电源先确认纹波是否大于50mV。我遇到过一版板子用MCU内部LDO供电结果LDO输出噪声大读数跳变严重后来改成外部LDO马上好了。其次看LC回路的电容和电感焊点。虚焊会造成接触电阻不稳定等效于Q值随机变化数据自然飘。还有一个常见坑测试时不要用手直接捏PCB线圈人体电容会影响谐振。要让被测目标物和线圈之间保持固定的间隙测试时用非金属夹具固定。如果以上都没问题考虑是不是PSoC引脚相邻的GPIO在翻转尤其是给LED、蜂鸣器之类的引脚。这些引脚每次翻转产生的电流变化会耦合到模拟前端。解决方案是把模拟引脚和数字引脚分开放或者在数字信号路径上串联电阻限制边沿速率。5.2 温漂问题怎么处理电感感测的温漂主要来自两个方面一是电容C0G虽然温漂小但也不是完全没有二是线圈铜箔的电阻率随温度线性变化温度升高后线圈电阻增大、Q值降低、等效串联电阻变大这会导致振荡衰减变快读数值偏高。为了对抗温漂我的经验是尽量做差分检测放一个参考线圈两个线圈读数做减法。参考线圈周围不放目标物但所处温度环境与检测线圈相同这样温度造成的共模漂移就能被抵消。如果空间紧张只能放一个线圈那就做周期性的慢速基线漂移补偿比如每10分钟在确认无目标时自动更新一次基线。5.3 线圈引线太远导致灵敏度下降前面提到过引线寄生电容问题这里再展开下。长引线等于在线圈两端并联了额外的寄生电容这个电容会改变谐振频率同时也会引入环境噪声。如果出于结构原因必须把线圈和主控板分开我建议用屏蔽线或双绞线连接线圈屏蔽层单端接地而不是悬空。引线长度尽量控制在10cm以内。如果引线长度无法缩短就在线圈端就近并联一个固定电容让引线电容变成微调因素而不是主导因素。我做过一次对比1m引线直接接线圈读数几乎完全失效怎么调激励电流都没用后来在靠近线圈处并联了匹配电容才恢复正常。5.4 灵敏度与检测距离的矛盾电感感测的检测距离和线圈尺寸基本成正比理想的极限大约是线圈外径的1/3到1/2。我的18mm线圈对1mm厚的钢片可以在10mm左右看到读数变化但可靠检测距离建议控制在5mm以内。如果项目要求检测更远的目标就得增大线圈尺寸或者改用电感比更大的磁芯线圈。磁芯线圈的灵敏度高很多但体积大、一致性差、价格也贵。我自己的优先级是先加大PCB线圈面积、增加匝数实在不行再考虑加磁芯。5.5 给后续扩展留的口子如果你做完接近检测还想往转速、位移、液位这些方向扩展其实不用改太多东西。转速检测就是把齿轮靠近线圈读取周期性数据跳变计算单位时间内的跳变次数位移检测需要记录不同金属挡板位置对应不同的电感量再做标定。我个人在实际操作中的体会是电感感测的价值往往不是做一个“高精度传感器”本身而是用一颗通用MCU的模拟资源去替代一颗专用芯片让系统整体的BOM、功耗、调试难度同时降下来。PSoC在这里的优势是配置灵活你能在开发中随时调整激励电流、比较器阈值、扫描序列不需要换芯片。这在项目早期方案变化频繁的阶段特别有用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价