自制低成本电感测量仪:基于ATmega328P与LC振荡原理

发布时间:2026/5/25 22:11:25

自制低成本电感测量仪:基于ATmega328P与LC振荡原理 1. 项目概述为什么你需要一个自制的电感表在电子制作的路上我们手边的万用表几乎成了“第三只手”。测电压、量电阻、查通断这些功能早已是标配好一点的表还能测电容帮我们筛选那些老化的电解电容。但当你开始捣鼓开关电源、收音机、或者任何带线圈的电路时一个尴尬的问题就出现了手头这个电感它到底是多少微亨µH市面上绝大多数消费级万用表哪怕价格不菲都吝啬于加入电感测量功能。专业级的LCR电桥精度高但价格也足以让初学者和业余爱好者望而却步而且对于偶尔用一次的场景买它实在不划算。于是自己动手做一个低成本、够用的电感测量仪就成了很多电子爱好者进阶路上的一个标志性项目。它解决的不仅仅是一个测量需求更是一个“认知”问题。电感不像电阻它的值很少印在体上自己绕制的线圈匝数对不对磁芯材料有没有用对这些都需要一个量化的工具来验证。今天要分享的这个项目核心成本可以控制在10欧元以内约合人民币80元不含外壳核心是一块常见的ATmega328P单片机就是Arduino Uno用的那颗芯搭配一个LM339比较器和一个小巧的OLED屏。它的原理不复杂但足够让你理解电感测量的基础并且能实实在在地测出手边大多数电感的值从几微亨到几十毫亨对于调试射频电路、电源滤波电感、自制变压器等场景已经能提供非常有价值的参考。这个项目的魅力在于它的“透明性”。你不是在用一个黑盒子你是在搭建并理解一个测量系统。从单片机发出一个充电脉冲到测量LC振荡的衰减时间再到通过一个简单的公式计算出电感值——整个过程你都能通过代码和电路清晰地看到。这对于初学者理解LC谐振、单片机定时器捕获、以及模拟数字电路如何协同工作是一次绝佳的实践。接下来我会拆解整个设计思路、电路原理、制作步骤并分享我在调试过程中踩过的坑和总结的技巧让你能一次成功做出属于自己的实用工具。2. 核心测量原理与电路设计解析2.1 基于LC自由振荡的测量方法这个电感表的核心原理是利用LC电路的自由振荡频率来反推电感L的值。我们知道一个理想的电感L和一个理想的电容C并联如果给这个回路一个初始能量比如给电容充电就会产生一个正弦振荡。这个振荡的频率f由电感和电容的数值共同决定其公式为[ f \frac{1}{2\pi\sqrt{LC}} ]如果我们能精确知道电容C的值并测量出这个振荡的频率f或者周期T那么电感L的值就可以通过公式变形计算出来[ L \frac{1}{(2\pi f)^2 C} \frac{T^2}{(2\pi)^2 C} ]在实际电路中由于电感和电容都存在等效串联电阻ESR这个振荡不会是永久的而是一个振幅逐渐衰减的正弦波。我们这个项目采用的方法不是直接测量完整的正弦波频率而是巧妙地测量这个衰减振荡中电压超过某个阈值的脉冲宽度。具体来说电路会先给待测电感并联的电容充电然后断开充电回路让LC开始自由振荡。这个衰减的正弦波会经过一个电压比较器LM339与一个设定的参考电压进行比较。每当正弦波电压高于参考电压时比较器就输出高电平低于时则输出低电平。这样一个衰减的正弦波就被转换成了一个个宽度逐渐变窄的方波脉冲。单片机ATmega328P的任务就是测量第一个或前几个这样的脉冲宽度。因为振荡开始时振幅最大第一个脉冲的宽度最接近理想LC回路在对应电压阈值下的半周期或部分周期时间。通过测量这个时间pulse并结合已知的电容C就可以计算出电感L。这种方法规避了直接测量高频正弦波的困难利用单片机自带的pulseIn()函数就能轻松实现高分辨率的时间测量成本低廉且可靠性不错。2.2 电路框图与关键元件作用整个系统的电路可以划分为几个清晰的功能模块控制与计算核心ATmega328P负责整个系统的流程控制。它通过一个IO口例如D8控制一个MOSFET或晶体管对测量电容进行充电。充电结束后它切换到测量状态在另一个IO口例如D2配置为输入等待并测量由比较器产生的脉冲宽度。最后它执行计算程序将结果发送到OLED屏幕显示。LC振荡与脉冲形成模块这是测量的核心物理部分。待测电感Lx与一个高精度的基准电容C_ref项目中为2µF并联构成LC谐振回路。一个MOSFET开关在单片机的控制下将电源电压5V连接到这个并联回路两端为电容充电。充电完成后开关断开LC回路开始自由衰减振荡。信号调理与比较模块LM339衰减的正弦波信号从LC回路中取出通常通过一个简单的电阻分压以保护比较器输入送入LM339比较器的一个输入端。比较器的另一个输入端连接到一个由电阻分压设置的参考电压例如2.5V。LM339将正弦波与参考电压进行比较输出对应的方波脉冲。这个方波信号被送入单片机的输入捕获引脚。人机交互模块0.96英寸OLED用于显示测量结果。相比原作者参考设计中可能使用的LCD1602OLED屏幕更小巧、功耗更低、显示效果更佳且采用I2C接口只需要两根信号线SDA, SCL即可驱动大大简化了布线。电源模块设计为USB 5V供电。这极大地提升了实用性你可以用任何手机充电器、充电宝或电脑USB口为其供电无需担心额外的电池电路。2.3 关键设计考量与原作者改进点原参考设计来自Electronoobs但本项目作者Olivier进行了几处关键改进这些改进直接影响了仪器的性能和易用性充电时间延长至20ms原设计使用delay(5)即充电5毫秒。作者改为delay(20)。延长充电时间是为了确保在测量较大电感感值大阻抗高时并联的2µF电容能够被充分充电至接近电源电压。如果充电不充分振荡的初始振幅会变小可能导致第一个脉冲无法被可靠检测或者引入测量误差。20ms对于绝大多数在测量范围内的电感来说都足以保证充足充电。采用高精度基准电容作者特别强调那个2µF的电容必须尽可能精确并且需要用一台好的电容表实测其容值然后将实测值如1.991µF填入代码的capacitance变量中。这是因为在公式L ∝ 1/C中电容C是已知基准它的任何误差都会直接、线性地传递到电感测量结果中。使用一个普通的、误差±20%的电解电容是无法接受的。应选用薄膜电容如CBB或聚酯薄膜电容这类电容容量稳定精度相对较高。OLED屏幕替换LCD这是一个非常实用的改进。LCD1602需要焊接较多排针且需要调节背光对比度。OLED即插即用显示更清晰尤其是在显示三位数如“100µH”和小单位如“mH”时观感更好。这降低了组装难度提升了成品的美观度。USB供电设计将供电方式固定为USB 5V使得设备完全摆脱了对9V电池或特定电源适配器的依赖使用场景更加灵活也符合现代电子设备的使用习惯。3. 元器件选型、电路搭建与焊接要点3.1 核心元器件清单与选型建议要成功复现这个项目元器件的选择至关重要。以下是一份详细的清单和选型说明元器件规格/型号数量关键选型说明与替代方案单片机ATmega328P-PU (DIP-28封装)1核心控制器。务必选择带“-PU”后缀的DIP封装方便插拔。你也可以直接使用一片拆机的Arduino Uno上的芯片但需先烧录好Bootloader。晶体振荡器16MHz直插负载电容18-22pF1为单片机提供系统时钟。选择直插封装两脚。负载电容需匹配常见的20pF即可。振荡电容22pF瓷片电容精度±5%或±10%2连接在晶体两端到地。对精度要求不高普通瓷片电容即可。基准电容2.0µF薄膜电容如CBB22精度尽可能高1这是精度关键必须使用薄膜电容。购买时可选精度±5%或±1%的。务必在焊接前用一台可靠的数字电桥或电容表测量其实际值。电压比较器LM339N (DIP-14封装)1四路比较器我们只用其中一路。选择常见的DIP-14封装。MOSFET开关管2N7000 或 BS1701用于控制对LC回路的充电。两者都是常见的N沟道增强型MOSFET引脚兼容GDS2N7000更易获得。OLED显示屏0.96英寸I2C接口SSD1306驱动1注意区分I2C和SPI接口本项目需选用I2C接口的。通常有蓝、白、黄蓝双色可选。电源接口Micro-USB或USB Type-A母座1根据个人喜好和外壳选择。Micro-USB更通用Type-A母座则可以直接插入USB公头线。电阻10kΩ 1/4W 碳膜或金属膜若干用于上拉、分压等。其中两个用于为LM339设置参考电压如两个10kΩ对5V分压得2.5V。电阻100Ω - 1kΩ 1/4W1-2用于MOSFET栅极限流、信号限流等值要求不严格。电解电容10µF - 100µF 16V1-2用于电源滤波放置在USB电源入口和单片机VCC附近提高稳定性。轻触开关6x6mm 或 12x12mm 四脚按键1用作测量启动按钮。ISP编程座6针2x3直插排母1用于给裸片ATmega328P烧录Bootloader和程序。如果计划在Arduino Uno上烧好再移植则非必须但强烈建议保留便于后期更新程序。万能板/PCB洞洞板或定制PCB1洞洞板适合手工焊接练习若想更精致可根据原理图绘制PCB去打样。连接线杜邦线公对公、母对母或导线若干用于连接OLED屏、按钮等。注意关于基准电容的精度这是影响测量精度的最核心因素。如果你手头没有精度尚可的电容表有一个替代思路购买多个比如5个标称2.2µF的薄膜电容价格低廉。用你的电感表原型配合一个已知感值、精度尚可的电感例如一个色环电感标称100µH ±10%去反推这组电容中哪个的“表现值”最接近标称电感。将这个电容的“表现值”作为你的capacitance值填入程序。这相当于用了一个已知电感来校准你的基准电容虽然不够严谨但对于业余使用可以大幅提升测量可信度。3.2 电路原理图分析与焊接顺序由于原始资料未提供完整原理图我们基于描述可以重构出核心部分的连接逻辑。下图是关键的信号流和电源部分示意注意以下为文字描述用于指导焊接电源部分USB口的5V和GND接入万能板。首先焊接电源滤波电解电容如47µF正极接5V负极接GND。然后将5V和GND线布设到板子各处为所有芯片供电。单片机最小系统焊接ATmega328P的28脚IC座。连接VCC7脚和AVCC20脚到5V连接GND8脚 22脚到地。在VCC和GND之间靠近芯片处焊接一个0.1µF的瓷片去耦电容。焊接16MHz晶振两端分别接芯片的9脚XTAL1和10脚XTAL2每个脚再通过一个22pF电容接地。LC测量回路将基准电容2µF的一端接地。准备两个测试夹或接线柱作为Lx端子用于接入待测电感。将这两个端子分别称为Lx_High和Lx_Low。将基准电容的另一端、MOSFET2N7000的漏极D、以及一个10kΩ电阻的一端三者连接在一起。这个节点我们称为Node_A。将Lx_High端子连接到Node_A。将Lx_Low端子直接接地。这样待测电感Lx和基准电容C_ref就并联在了Node_A和地之间。充电控制回路MOSFET的源极S接地。MOSFET的栅极G通过一个100Ω-1kΩ的电阻连接到单片机的一个IO口例如PD8 对应Arduino的D8。这个电阻用于限制栅极充放电电流保护单片机IO口。当单片机D8输出高电平5V时MOSFET导通将Node_A点通过MOSFET的DS通道拉到地GND。但由于Node_A另一端通过电感Lx接在5V上这里需要澄清原描述是“提供充电脉冲”。更常见的接法是Node_A通过一个限流电阻如1kΩ连接到5V。当MOSFET断开时5V通过电阻给LC并联回路充电当MOSFET导通时它将Node_A快速拉低到地为LC回路提供一个阶跃激励从而引发振荡。但原文描述稍显模糊。一个更可靠的经典电路是采用“充电-放电”激发模式。鉴于原参考链接可能采用此种方式强烈建议在焊接前先访问参考链接[1]electronoobs.com查看其确切原理图。这是避免返工的关键。信号比较回路从Node_A通过一个较大的分压电阻例如100kΩ连接到LM339的同相输入端比如芯片的5脚。用两个10kΩ电阻对5V分压得到2.5V连接到LM339的反相输入端-比如芯片的4脚。LM339的输出端对应4、5脚的那一路通常是2脚连接到单片机的外部中断或输入捕获引脚例如PD2 Arduino的D2。同时该输出端需要通过一个10kΩ电阻上拉到5V称为上拉电阻以确保输出高电平稳定。显示与交互OLED屏的VCC接5VGND接地。OLED的SDA接单片机的PC4Arduino A4SCL接PC5Arduino A5。轻触开关一端接地另一端接单片机的另一个IO口如PD9 D9并在该IO口与5V之间连接一个10kΩ上拉电阻。这样按键未按下时单片机读到高电平按下时读到低电平。焊接顺序建议先焊接电源USB座、滤波电容、电源走线再焊接单片机最小系统IC座、晶振、复位电路确保单片机能上电。然后焊接LC回路和MOSFET部分。接着焊接LM339及其周边分压、比较电路。最后焊接OLED和按钮的接口。每完成一个模块都检查一下电源和地是否有短路。3.3 硬件调试与验证要点焊接完成后不要急于烧录程序先进行关键的硬件静态检查电源短路测试用万用表蜂鸣档测量5V和GND之间的电阻不应有蜂鸣声短路。确认无误后再接入USB电源。电压测试上电后用万用表测量USB座输出电压是否在5V左右。ATmega328P的VCC引脚720是否为5V。LM339的电源引脚3脚接VCC 12脚接地电压是否正确。LM339反相输入端-的分压点是否为2.5V左右。信号通路初测不接电感Lx。用示波器探头如果有的话测量Node_A点。当按下按钮假设程序已烧录D8输出脉冲时应该能看到一个电压跳变。如果没有示波器可以用万用表直流电压档观察Node_A电压是否有变化。用一根导线短暂触碰Lx_High和Lx_Low端子模拟一个极小电感。观察LM339输出端接单片机D2的那一点的电压变化。当Node_A有跳变时这里可能也会有瞬间的脉冲变化。OLED屏测试可以单独编写一个简单的I2C扫描和显示测试程序烧录到单片机确认OLED屏接线正确能够正常点亮并显示内容。实操心得洞洞板布局技巧在万能板上焊接这类数模混合电路布局是成功的一半。建议遵循“左电源、右信号、模拟数字分开”的原则。将USB电源入口放在板子左侧电源滤波电容紧挨着。单片机放在中部偏上。LC测量回路基准电容、Lx端子、MOSFET和LM339比较器电路放在板子的右侧区域尽量远离数字部分的晶振和高速信号线。模拟地LC回路、比较器和数字地单片机、OLED可以最后在一点汇合例如连接到USB口的GND引脚。这样可以减少数字噪声对微弱模拟测量信号的干扰。4. 软件程序详解与Arduino IDE配置4.1 程序逻辑流程图与核心函数整个Arduino程序Sketch围绕着一次测量周期展开。其核心逻辑如下初始化(setup()):初始化串口用于调试。初始化OLED显示屏设置字体、清屏、显示欢迎信息如“Inductor Meter”。配置引脚模式控制MOSFET的引脚如D8为OUTPUT测量脉冲的引脚D2为INPUT按键引脚D9为INPUT_PULLUP启用内部上拉。将MOSFET控制引脚置为低电平确保初始状态为断开。主循环(loop()):持续检测按键是否被按下digitalRead(BUTTON_PIN) LOW。一旦检测到按键按下执行一次完整的测量序列 a.充电阶段将MOSFET控制引脚D8置为高电平然后执行delay(20)。这使MOSFET导通将LC回路的一端Node_A拉低或拉高取决于电路从而让电流流过电感为并联的电容充电。 b.放电与振荡触发将MOSFET控制引脚置为低电平使其迅速关断。LC回路脱离驱动源开始自由衰减振荡。Node_A点的电压开始以正弦衰减波形变化。 c.脉冲测量立即调用pulseIn(MEASURE_PIN, HIGH, 5000)函数。该函数会阻塞等待直到在测量引脚D2上检测到一个从低到高的上升沿然后开始计时直到检测到下降沿停止最后返回高电平脉冲的宽度单位微秒。参数5000是超时时间5000微秒5毫秒如果5ms内没测到脉冲函数会返回0。这个测量到的pulseWidth就是LM339输出的第一个正脉冲的宽度。 d.计算电感值利用公式进行计算。核心代码类似于cpp // C_ref 是已知的基准电容值单位法拉(F) // pulseWidth 是测量到的脉冲宽度单位微秒(us)需要转换为秒(s) float t pulseWidth / 1.0e6; // 转换为秒 // 根据LC振荡周期与脉冲宽度的关系推导公式 (具体系数需根据电路调整) // 常见公式: L (t^2) / (C_ref * k) 其中k是一个与电路和阈值相关的常数 // 例如如果脉冲宽度对应1/4周期则 k (PI/2)^2 ≈ 2.467 float inductance (t * t) / (C_ref * 2.467); // 单位亨利(H) inductance inductance * 1.0e6; // 转换为微亨(uH)e.显示结果将计算得到的inductance值单位µH或mH格式化成字符串显示在OLED屏幕上。测量结束后程序回到等待按键的状态。4.2 关键代码段剖析与参数校准// 定义引脚 #define CHARGE_PIN 8 #define MEASURE_PIN 2 #define BUTTON_PIN 9 // !!! 最关键的一步填入你实测的基准电容值单位法拉 float capacitance 1.991e-6; // 示例实测为1.991微法 void setup() { Serial.begin(115200); // 初始化OLED... pinMode(CHARGE_PIN, OUTPUT); digitalWrite(CHARGE_PIN, LOW); // 初始确保MOSFET关闭 pinMode(MEASURE_PIN, INPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { if (digitalRead(BUTTON_PIN) LOW) { delay(50); // 简单按键消抖 if (digitalRead(BUTTON_PIN) LOW) { // 开始测量 digitalWrite(CHARGE_PIN, HIGH); delay(20); // 充电20毫秒确保电容充满 digitalWrite(CHARGE_PIN, LOW); // 关断MOSFET激发振荡 // 测量脉冲宽度超时时间5ms unsigned long pulseWidth pulseIn(MEASURE_PIN, HIGH, 5000); if (pulseWidth 0) { // 计算电感 float t pulseWidth / 1e6; // 微秒转秒 // 注意这个公式是核心可能需要根据实际电路校准系数k float inductance_H (t * t) / (capacitance * 2.467); float inductance_uH inductance_H * 1e6; // 显示在OLED上 displayInductance(inductance_uH); // 也可通过串口打印调试 Serial.print(Pulse Width (us): ); Serial.println(pulseWidth); Serial.print(Inductance (uH): ); Serial.println(inductance_uH); } else { // 超时未检测到有效脉冲 displayError(Timeout/No Pulse); Serial.println(Measurement timeout.); } while(digitalRead(BUTTON_PIN) LOW); // 等待按键释放 } } }参数校准详解capacitance变量这是必须修改的。用你的电容表测量你焊在板子上的那个2µF薄膜电容的实际值。假设测得1.992µF就改为float capacitance 1.992e-6;。填入的值越准最终测量越准。delay(20)这是充电时间。对于非常大的电感如几亨可能需要更长的充电时间才能让电容电压接近饱和。如果测量大电感时结果不稳定或偏小可以尝试增加到50ms或100ms。但注意整个测量周期会变长。pulseIn超时时间5000代表5000微秒5毫秒。对于非常小的电感振荡频率高脉冲很窄很快就能测到。对于非常大的电感振荡周期长脉冲宽度可能接近甚至超过5ms。如果测量大电感时总是超时可以适当增加这个值例如1000010ms。但也要注意如果电感开路或值极大振荡可能无法建立会导致永久等待所以超时机制是必要的。计算公式中的常数2.467这个常数k来源于理论推导(π/2)^2其前提是假设我们测量的是衰减正弦波第一次超过比较器阈值的那一段弧长所对应的时间约为1/4周期。然而这个常数会受到实际电路中比较器参考电压、LC回路寄生电阻等因素的影响因此它可能是一个需要微调的“校准常数”。最准确的校准方法是找一个已知感值、精度相对较高的电感例如一个标称100µH ±5%的色环电感用你的仪器测量然后反推这个常数k。公式变形为k (t^2) / (C_ref * L_known)。用已知的L_known、C_ref和测得的t计算出一个k值用它替换代码中的2.467。4.3 烧录程序与Bootloader处理如果你使用的是全新的ATmega328P芯片它内部是空的没有Bootloader。你有两种选择方案A使用Arduino作为ISP编程器推荐准备一块Arduino Uno或兼容板。在Arduino IDE中打开示例程序File - Examples - 11.ArduinoISP - ArduinoISP。将此程序烧录到你的Arduino Uno上。现在这块Uno就变成了一个ISP编程器。按照接线图用6根杜邦线将Uno的特定引脚连接到你的电感表板上的6针ISP接口Uno D10 - 目标板 RESETUno D11 - 目标板 MOSI (PB3)Uno D12 - 目标板 MISO (PB4)Uno D13 - 目标板 SCK (PB5)Uno 5V - 目标板 VCCUno GND - 目标板 GND在Arduino IDE中选择板卡类型为Tools - Board - Arduino Uno。选择编程器为Tools - Programmer - Arduino as ISP。点击Tools - Burn Bootloader。这将给目标芯片烧录Uno兼容的Bootloader。Bootloader烧录成功后你就可以像给普通Uno一样上传你的电感表程序了选择正确的端口点击上传。但注意上传时仍需通过ISP连接或者将芯片插回Uno板子再上传。方案B在Arduino Uno上开发并移植将一片空的ATmega328P芯片插入你的Arduino Uno板。在Uno上直接开发、调试你的电感表程序可以先用一些简单代码测试OLED、按键等。程序调试无误后将芯片从Uno板上小心取下安装到你的电感表项目的IC座上。这种方式省去了单独烧录Bootloader的步骤因为Uno在正常使用时已经包含了Bootloader。注意事项程序移植的引脚定义如果你采用方案B务必注意在Uno上调试时你用的引脚编号如D8, D2, D9, A4, A5对应的是Uno板载芯片的引脚。当你把芯片拔下来焊到自己的板上时这些引脚在物理芯片上的位置是固定的。你需要确保在你的万能板电路上OLED的SDA、SCL MOSFET控制脚测量脚等连接到了芯片正确的物理引脚上而不是仅仅遵循“D8”这样的Arduino逻辑编号。最好根据ATmega328P的引脚图来核对硬件连接。5. 校准、测试与常见问题排查5.1 校准流程从相对准确到绝对可靠硬件焊接无误、程序烧录成功后第一次上电很可能显示的数字是混乱的。别急我们需要进行系统校准。校准分为两步硬件零偏校准和软件常数校准。硬件零偏短路清零不接任何电感将两个测试夹Lx_High和Lx_Low直接短接。理论上这相当于测量一个接近0亨的电感。按下测量键记录屏幕显示的值。这个值可能不是0而是几微亨甚至几十微亨。这是由于测试线本身的寄生电感、PCB走线电感以及测量系统的固有偏移造成的。在程序中我们可以引入一个“偏移量”来修正。例如测得短路时显示为L_offset 0.5µH。那么在最终显示电感值之前执行L_display L_calculated - L_offset。如果结果为负则显示为0或一个很小的值。这能确保在短路时读数接近零。软件常数校准使用已知参考电感这是提高精度的关键一步。你需要至少一个已知感值且精度较好的电感作为参考。优先选择色环电感或工字电感标称精度在±5%或±10%的。避免使用未知的、拆机的或形状不规则的电感。假设你有一个标称L_standard 100µH ±10%的电感。将其接在测试端子上。测量并记录仪器显示的原始值L_measured_raw未减偏移量的计算值。根据公式L_calculated (t^2) / (C * k) 其中t是测量到的脉冲宽度C是你填入的基准电容值k是程序中的常数初始为2.467。我们可以反推出一个更准确的k_calibrated [ k_{calibrated} \frac{t^2}{C \times L_{standard}} ] 但是我们无法直接从程序里得到t。更简单的方法是采用比例法设程序当前常数k_old 2.467 显示值为L_display_old。我们知道理论关系是L ∝ 1/k。因此为了让显示值等于标准值新的常数k_new应满足 [ \frac{L_{standard}}{L_{display_old}} \frac{k_{old}}{k_{new}} ]所以 [ k_{new} k_{old} \times \frac{L_{display_old}}{L_{standard}} ]将计算出的k_new值替换程序中的常数例如2.467重新编译并烧录程序。再次测量那个100µH的标准电感读数应该非常接近100µH。你还可以用其他已知电感如10µH 470µH进行验证观察测量值是否在其标称误差范围内。5.2 测量范围与精度评估这个自制电感表的测量范围主要由两个因素决定下限最小可测电感受限于系统的寄生电感和噪声。测试线本身的电感可能在0.1-0.5µH量级。因此测量几微亨以下的小电感会非常不准确读数可能主要反映的是测试夹具的寄生参数。实际有效下限可能在1µH左右。上限最大可测电感受限于LC振荡的衰减速度和脉冲检测超时时间。电感越大振荡频率越低周期越长。pulseIn函数的超时时间默认5ms限制了可检测的脉冲周期。对于非常大的电感衰减过快可能无法形成稳定的、能被比较器识别的过阈值脉冲。实际有效上限可能在100mH (100,000µH)量级。可以通过增加充电时间(delay)和脉冲检测超时时间来尝试扩展上限但会牺牲测量速度。精度方面在进行了良好的校准基准电容精确、常数k校准后在1µH到10mH的核心范围内达到±5%到±10%的相对精度是合理且可实现的。这足以满足绝大多数业余电子制作的需求例如判断一个电感是10µH还是22µH或者验证自己绕制的线圈是否在目标值附近。它不是一个计量级仪器而是一个高效的、定性的“侦探工具”。5.3 常见问题、故障现象与排查表在制作和调试过程中你可能会遇到以下问题。下表列出了常见现象、可能原因和解决思路故障现象可能原因排查与解决步骤上电无任何反应OLED不亮1. 电源未接通或短路。2. OLED接线错误或损坏。3. 单片机未正常工作。1. 检查USB线、端口测量板子5V和GND间电压。2. 检查OLED的VCC、GND、SDA、SCL连接确认I2C地址正确通常0x3C。3. 检查单片机最小系统晶振、复位电路、电源。OLED亮但无显示或显示乱码1. I2C通信失败。2. 程序未成功运行或跑飞。1. 用I2C扫描程序检查设备地址。2. 检查SDA、SCL线上拉电阻OLED模块通常自带。3. 重新烧录程序确认Bootloader正确。按下按键无反应不测量1. 按键接线错误或损坏。2. 按键引脚模式设置错误应为INPUT_PULLUP。3. 程序卡死在某个环节。1. 用万用表通断档检查按键按下时是否导通。2. 检查程序中的按键引脚定义和读取逻辑按下为LOW。3. 在代码中添加串口打印看程序执行到哪一步。测量结果始终为0或显示超时1. 未检测到脉冲pulseIn返回0。2. LC振荡回路未起振。3. 比较器LM339工作不正常。1.短路测试短接测试端子应有一个很小的非零读数。若仍为0查脉冲通路。2.示波器检查观察Node_A点在按键后应有衰减振荡波形。若无检查MOSFET开关、基准电容、电感连接。3. 检查LM339供电、参考电压2.5V、输入输出信号。测量结果不稳定数值跳动大1. 电源噪声大。2. 接触不良。3. 外界电磁干扰。4. 电感本身有磁芯受外界影响。1. 加强电源滤波在单片机、LM339的VCC附近加0.1µF瓷片电容。2. 检查所有焊点、接线端子是否牢固。3. 远离手机、开关电源等干扰源进行测量。4. 对于带磁芯的电感测量时不要用手或金属工具靠近。测量值系统性地偏大或偏小1. 基准电容C_ref值填写错误。2. 程序中的计算公式常数k不准确。3. 比较器参考电压偏离2.5V。1. 反复确认capacitance变量值是否为电容实测值单位法拉。2. 使用已知标准电感进行软件常数校准见5.1节。3. 用万用表测量LM339反相输入端-的电压确保为稳定的2.5V左右。测量大电感10mH不准或超时1. 充电时间不足。2. 振荡衰减过快脉冲宽度超过pulseIn超时时间。1. 尝试增加delay(20)中的充电时间例如改为delay(50)或delay(100)。2. 增加pulseIn的超时参数例如从5000改为2000020ms。实操心得没有示波器如何调试对于大多数爱好者示波器可能不是标配。当测量没有反应时可以借助 Arduino 的串口打印进行“软件示波器”调试。在代码的关键点添加Serial.println()语句例如在充电前打印“Charging...”充电后打印“Discharging...”在pulseIn函数后打印测得的pulseWidth值。通过观察串口监视器输出的数据和顺序可以判断程序执行到哪一步卡住以及是否测量到了有效的脉冲宽度。这是成本最低且极其有效的调试手段。6. 性能优化与扩展思路完成基础版本并成功测量后这个电感表还有不少可以打磨和提升的空间。以下是一些优化和扩展的方向可以让你的工具变得更加强大和易用。6.1 软件滤波与多次测量取平均原始的代码每次按键只进行一次测量容易受到随机噪声的干扰导致读数最后几位数字不停跳动。一个显著的软件优化是实施多次测量取平均值。void loop() { if (digitalRead(BUTTON_PIN) LOW) { delay(50); if (digitalRead(BUTTON_PIN) LOW) { int numReadings 10; // 测量10次 unsigned long sumPulseWidth 0; int validReadings 0; for (int i 0; i numReadings; i) { digitalWrite(CHARGE_PIN, HIGH); delay(20); digitalWrite(CHARGE_PIN, LOW); unsigned long pw pulseIn(MEASURE_PIN, HIGH, 5000); if (pw 0) { sumPulseWidth pw; validReadings; } delay(10); // 每次测量间稍作延迟 } if (validReadings 0) { unsigned long avgPulseWidth sumPulseWidth / validReadings; // 使用avgPulseWidth进行计算... displayInductance(calculatedInductance); } else { displayError(No Valid Signal); } while(digitalRead(BUTTON_PIN) LOW); } } }同时可以加入简单滤波比如在循环中舍弃与中值偏差过大的奇异值再用剩下的值求平均这样结果会更加稳定可靠。屏幕刷新也可以等到所有测量计算完成后再进行避免闪烁。6.2 自动量程与单位切换目前的代码直接计算并显示以微亨µH为单位的数值。对于几亨的大电感显示会变成很大的数字如 1000000 µH阅读不直观。可以增加自动单位切换功能void displayInductance(float inductance_uH) { char buffer[16]; if (inductance_uH 1000) { // 显示微亨 sprintf(buffer, %.1f uH, inductance_uH); } else if (inductance_uH 1e6) { // 显示毫亨 sprintf(buffer, %.3f mH, inductance_uH / 1000.0); } else { // 显示亨利 sprintf(buffer, %.3f H, inductance_uH / 1e6); } // 在OLED上显示buffer中的字符串 }更进一步可以尝试自动量程切换硬件。这涉及在基准电容C_ref两端并联一个由继电器或模拟开关控制的、不同容值的电容。当检测到脉冲宽度太短电感太小时切换到更小的基准电容以提高分辨率当脉冲宽度太长或超时电感太大时切换到更大的基准电容以扩展量程。但这会显著增加硬件复杂度和成本属于进阶玩法。6.3 增加外壳与提升便携性一个裸板虽然能用但既不安全也不美观。你可以为它设计或选择一个合适的外壳。3D打印外壳如果你有3D打印机可以设计一个包含上下盖的外壳。需要留出USB口、测试端子孔、OLED窗口和按键孔的位置。在内部设计支柱来固定万能板。成品塑料盒改造电子市场常见的塑料防水盒或仪表盒是很好的选择。在盒子上开孔安装香蕉插座作为测试端子、Micro-USB母座、轻触按键和OLED屏。将OLED屏用热熔胶或螺丝固定在开好的窗口后面。内部布局与屏蔽将LC振荡回路和比较器部分用一小块铜箔或铁皮包裹起来并接地可以一定程度上屏蔽外部干扰。确保测试端子到板子的引线尽量短且粗以减少引线电感带来的误差。供电优化虽然使用USB供电很方便但在一些噪声大的USB电源下测量可能不稳定。可以考虑在板内增加一个简单的LC滤波或三端稳压器如AMS1117-5.0为模拟测量部分提供更干净的5V电源。6.4 扩展功能设想这个基于ATmega328P的平台还有不少潜力可挖电容测量模式原理是相似的只需将已知的基准电容换成已知的基准电感然后测量未知电容。可以通过一个拨动开关切换测量模式并在软件中切换计算公式和显示单位。数据保持与相对测量增加一个“Hold”功能键锁定当前显示值。或者增加“相对测量”模式先测量一个参考电感如短路将其值存储为零点后续测量显示与参考值的差值适用于筛选配对电感。串口数据输出将每次的测量结果通过串口发送到电脑可以用Python或LabVIEW编写一个简单的上位机程序实现数据记录、绘制趋势图或统计分析。电池供电与低功耗如果想做成完全便携的可以改用锂电池供电并增加充电管理电路如TP4056。在软件上当长时间不操作时让单片机进入休眠模式仅通过按键中断唤醒可以极大延长续航。制作这样一个电感表最大的收获远不止于得到一个测量工具。从理解LC振荡原理到搭建混合信号电路再到调试单片机程序并完成校准整个过程是对电子工程师基本功的一次全面锻炼。当你第一次用它测出自己绕制的线圈电感并成功应用于一个谐振电路中时那种成就感是购买成品仪器无法比拟的。这个项目就像一个起点你可以根据自己的想法不断改造它让它更精准、更易用、功能更强大这本身就是电子DIY最大的乐趣所在。

相关新闻