)
做电子DIY的朋友都知道铅酸电池也好、锂电池组也好最怕的就是过放和过充。过放一次电池寿命直接打骨折过充更危险轻则鼓包重则出安全事故。所以我在不少项目里都会加一级电池电压监测不用单片机一颗几毛钱的比较器芯片就能把事办了。今天要聊的就是LM339比较器实战——从零搭一个电池电压监测电路把工作原理、参数计算、实际接线、调试排障全部过一遍文末会给一份完整的连接关系表照着焊就能用。这套方案我实测下来非常稳成本不到十块钱不需要写任何代码适合电子入门爱好者、DIY玩家也适合想给手头设备加保护功能的应用开发者。哪怕你之前完全没接触过比较器跟着这篇文章走一遍也能弄明白它是怎么“想问题”的而且能自己算阈值、调滞回把电路改成你想要的样子。1. 为什么电压监测要用比较器而不是ADC1.1 比较器到底在做什么比较器的英文叫Comparator干的事就一件比较两个输入电压的大小然后输出一个高电平或者低电平。你可以把它理解成一个“电压裁判”——同相输入端标着“”的电压高它就判赢输出高电平反相输入端标着“-”的电压高它就判输输出低电平。就这么简单没有中间态不是0就是1。这个“不是0就是1”的特性正好用来做电压阈值监测。我们想要的不过是“电池电压低于11V就开始报警”或者“高于14.5V就提示过压”这种需求本质上就是一个判断题不需要知道电压具体是多少只需要知道它过没过线。用ADC去采样电压当然也行但为了一个开关量去写代码、调滤波、跑算法性价比太低了。还要区分一下比较器和运放。经常有人问我能不能用LM358这种运放直接当比较器用能是能但不推荐。运放是按闭环负反馈线性放大设计的你把它开环用输出会进入饱和翻转速度慢而且很多运放输出不是推挽结构驱动力弱。专用比较器就不一样LM339的输出级是集电极开路结构设计目标就是快速翻转、直接驱动外部负载天生就是干这个的。1.2 为什么选LM339和LM393怎么选LM339是一颗经典的四路电压比较器芯片DIP-14封装里面有四路独立的比较器供电范围宽到离谱单电源2V到36V都能工作双电源还能正负1V到正负18V。输入偏置电流典型值只有25nA这意味着你前面接一个几百千欧的分压电阻误差也很小。输出是集电极开路需要外部上拉电阻好处是你可以自己决定输出高电平接几伏灵活性很大。我经常被问到的一个热词就是LM393它和LM339是什么关系LM393是双路版本DIP-8封装里面只有两路比较器其他参数和LM339基本一致。选型逻辑很直接需要几路就选几路。我这套电路要用两路比较器一路欠压、一路过压用LM339的话还有两路富余以后想加温度保护、电流保护都还有位置而且四路的价格比两路的贵不了多少所以直接用LM339更划算。还有一个细节LM339的共模输入电压范围是0到Vcc减去1.5V。也就是说12V供电时输入端最高只能到10.5V超过这个范围比较器就不“理智”了。这就是为什么监测12V电池时不能直接拿电池电压去接比较器输入必须先分压后面详细说。2. 电路设计思路分压、基准、滞回2.1 整体架构与信号流这套电池电压监测电路的架构非常清晰电池电压先经过电阻分压得到一个在比较器输入允许范围内的采样电压Vsense这个Vsense同时送给两个比较器一个负责欠压判断一个负责过压判断每个比较器的另一端接一个预设好的基准电压比较器输出经过上拉电阻变成标准的高/低电平再驱动LED指示灯或者外部继电器。信号流就是电池电压 - 分压网络 - 比较器判断 - 指示灯。这里没有单片机、没有ADC、没有复杂的外围核心就靠比较器自己“思考”。我见过不少新手一上来就想着用ADC加OLED显示电压值其实如果是做保护电路真没必要比较器方案反应快、结构简单、功耗还低长期挂在电池两端也不心疼。2.2 采样分压怎么设计为什么必须分压以12V铅酸电池为例正常工作电压范围大概在10.5V到14.8V之间。前面提到LM339的输入共模范围最高只能到Vcc-1.5V12V供电时就是10.5V电池满电14.8V直接怼进去肯定超了。所以需要先把电池电压按比例缩小。我用的是两颗10kΩ电阻串联分压一颗接电池正极R1一颗接地R2中间抽头就是采样点Vsense。分压比k 10 / (10 10) 0.5也就是Vsense始终是电池电压的一半。电池12V时Vsense是6V电池14.8V时Vsense是7.4V都在10.5V范围以内很安全。这里有个容易被忽略的点分压网络的等效内阻。从采样点往左看R1和R2是并联关系等效内阻是10kΩ并10kΩ等于5kΩ。这个5kΩ会跟后面的滞回反馈电阻一起参与电压叠加运算算滞回的时候必须把它考虑进去否则算出来跟实测差很远这就是很多人照着网上教程做出来阈值对不上的根本原因。功耗方面也要算一下。12V电池接10k加10k的分压网络回路电流是12/20k 0.6mA功耗不到7.2mW。对于几十安时的大电池来说这点损耗完全可以忽略但你要是监测的是小容量锂电池就得把分压电阻加大到100k级别把静态电流压下去。2.3 滞回比较器原理不加会怎样加了怎么算用比较器做阈值监测最大的坑就是阈值点附近的抖动。想象一个场景电池电压慢慢降到11V附近由于负载波动电压在10.98V和11.02V之间来回晃。如果没有滞回比较器输出就会在高和低之间疯狂切换LED闪烁不停要是驱动继电器继电器触点会噼里啪啦响用不了多久就报废了。解决办法就是引入滞回也叫迟滞。思路很简单把输出信号通过电阻反馈到同相输入端让比较器的翻转阈值不再是一个固定的点而是两个点。电压从上往下降低到“低阈值”时触发电压从下往上升高到“高阈值”时才恢复中间形成一个“死区”。在这个死区里输出状态保持不变不管输入怎么小幅抖动输出都稳如老狗。滞回的量用回差电压来表示就是两个阈值之间的差值。回差太窄滤波效果不好回差太宽又会造成检测迟钝告警不准确。实际项目中我一般把回差设在0.2V到0.5V之间折算到电池电压既能有效抑制抖动又不至于让告警失真。后面参数计算部分我会一步步演示怎么把回差算出来。3. 完整电路搭建原理图、参数、接线3.1 元件清单BOM这套电路需要的元件非常少而且都是常见的直插件电子市场随便找。我把清单整理成表格照单抓药就行。序号元件规格/参数数量备注1LM339DIP-141片四路比较器2U型IC座DIP-141个推荐用座方便换芯片3R110kΩ 1/4W1颗采样分压上臂4R210kΩ 1/4W1颗采样分压下臂5R3、R410kΩ 1/4W2颗输出上拉电阻6R5、R61kΩ 1/4W2颗LED限流电阻7R7、R8270kΩ 1/4W2颗滞回反馈电阻8W1、W210kΩ多圈电位器2个阈值调整多圈好调9LED1红色1颗欠压指示10LED2黄色1颗过压指示11C10.1μF瓷片电容1颗供电去耦12接线端子2P螺丝端子2个电池输入、输出可选多圈电位器这里要特别强调一下。如果你是新手千万别用那种单圈旋转的蓝色小电位器调阈值的时候手抖一下电压就偏出去0.5V能把你调到崩溃。用3296W那种多圈精密电位器旋一整圈只变化一点点能精准定在目标电压上价格也就差几毛钱体验完全不同。3.2 关键参数计算全过程现在进入正题把参数一个一个算清楚。这套电路的阈值目标是电池电压低于11V时红色LED亮欠压告警高于14.5V时黄色LED亮过压告警中间范围两颗LED都不亮。采样分压比是0.5所以电池11V对应Vsense5.5V电池14.5V对应Vsense7.25V。先从欠压比较器U1A开始算。同相输入端接Vsense反相输入端接电位器W1设好的基准电压Vref_low。我把Vref_low设为5.5V对应电池11V。输出高到低翻转时因为反馈电阻的存在实际触发点会比5.5V低一点这是刻意为之。滞回电阻R5我选270kΩ接在输出端和同相输入端之间。计算翻转点时要考虑Vsense源内阻5kΩR1并R2用叠加定理列式当输出高电平约12V时同相端电压V等于 V Vsense × R5/(R55k) 12V × 5k/(R55k)翻转条件是V等于5.5V。把R5270kΩ带进去 V Vsense × 270/275 12 × 5/275 Vsense × 0.9818 0.2182令V5.5V解得Vsense约等于5.38V对应电池电压10.76V。也就是说电池电压降到10.76V时欠压比较器翻转红色LED点亮。当输出是低电平约0V时同相端只由Vsense决定 V Vsense × 270/275同样令V5.5V解得Vsense约等于5.60V对应电池电压11.20V。这意味着电池从低压状态充电回升到11.2V以上时红色LED才会熄灭。回差就是11.2减去10.76约0.44V。这个宽度对付负载波动引起的电压抖动已经足够了LED不会闪也不会误报。再来算过压比较器U1B。这里接法要反过来反相输入端接Vsense同相输入端接电位器W2设定的基准电压Vref_high我设为7.25V。正常情况下Vsense小于Vref_high输出高电平黄色LED不亮当电池电压高到Vsense超过Vref_high时输出翻转为低电平黄色LED点亮。过压比较器的反馈电阻R7也选270kΩ。因为反馈是接到同相输入端的电位器节点源内阻取电位器在中点位置时的等效内阻约2.5kΩ10k电位器四分之一处到二分之一处大概这个量级。当输出高12V时同相端被抬高翻转点会略高于7.25V。代入计算 Vsense 7.25 × 270/272.5 12 × 2.5/272.5 ≈ 7.18 0.11 7.29V对应电池电压14.58V。也就是说电池充到14.58V时过压比较器才会翻转报警。当输出低0V时同相端只由电位器分压决定 Vsense 7.25 × 270/272.5 ≈ 7.18V对应电池电压14.36V。电池从过压状态回落到14.36V以下时黄色LED才会熄灭。回差约0.22V符合预期。上拉电阻R3和R4取10kΩ。LM339输出高电平时输出管截止输出端靠上拉电阻拉到12V。LED限流电阻计算方法LED工作电流取10mA正向压降约2V电源12VR (12-2)/0.01 1kΩ正好取标准值1kΩ。LM339输出低电平灌电流能力是20mA左右10mA的LED电流完全扛得住。3.3 完整连接关系表与接线步骤下面是完整的连接关系表按LM339的引脚号列出照着连线就能完成整个电路。这里用的是DIP-14封装。LM339引脚引脚名称连接到说明1OUT2R410kΩ上拉到VCCR61kΩ串联LED2到VCCR8270kΩ反馈到引脚7过压输出2OUT1R310kΩ上拉到VCCR51kΩ串联LED1到VCCR7270kΩ反馈到引脚5欠压输出3VCC电池正极12VC1一端供电正4IN1-W1电位器滑片Vref_low欠压基准输入5IN1采样节点VsenseR7反馈电池采样输入6IN2-采样节点Vsense电池采样输入7IN2W2电位器滑片Vref_highR8反馈过压基准输入8IN3-悬空未用9IN3悬空未用10IN4-悬空未用11IN4悬空未用12GND电池负极C1另一端供电负13OUT4悬空未用14OUT3悬空未用接线顺序我建议这样来第一步先把LM339插到IC座上注意缺口方向。这一步很基础但我就见过有人把芯片插反一上电直接冒烟。第二步接电源和去耦电容。12V正极接芯片第3脚负极接第12脚0.1μF电容尽量靠近芯片安装跨接在电源正负之间。去耦电容非常重要它能把电源线上的高频噪声滤掉防止比较器误翻转千万别省。第三步搭采样分压。R1从正极接到Vsense节点R2从Vsense节点接到地中间抽头引出线缆备用。第四步接基准电位器。W1和W2都接成电位器分压模式一端接VCC另一端接GND滑片输出。W1滑片接到第4脚W2滑片接到第7脚。第五步接反馈电阻。R7从第2脚接到第5脚R8从第1脚接到第7脚。这两颗270kΩ的电阻就是实现滞回的核心别漏了。第六步接输出上拉和LED指示。第2脚接10kΩ上拉到VCC再接一个1kΩ电阻串联红色LED到VCCLED阳极接VCC阴极接电阻一端电阻另一端接第2脚。第1脚接同样的结构LED用黄色。第七步检查所有连线后用万用表量一下VCC和GND之间有没有短路确认无误再上电。3.4 用AD绘制电路图的实用要点很多读者问“怎么用AD画LM339的电路图”。其实LM339这种经典芯片在Altium Designer的库文件里直接搜“LM339”就能找到Miscellaneous Devices库里有现成的原理图符号和封装。如果用的是AD的新版本在线元件库搜索更方便直接搜LM339就能拉到带3D模型的完整元件。画原理图时有个小技巧LM339的四个比较器单元在原理图符号上是独立模块你只用了两路可以只放两个比较器单元另外两个不用的不画这样图面干净得多。原理图符号上会标出U1A、U1B这样的位号电源引脚第3脚和第12脚一般会自动归到一个隐藏的电源端口上不用每个单元都重复画电源脚。从原理图更新到PCB的时候需要注意几个细节。第一去耦电容C1要放在芯片的电源引脚旁边距离越近越好走线先用一小段粗线到电容再到芯片引脚俗称“星形接地”。第二采样分压电阻R1、R2要靠近LM339第5脚和第6脚因为Vsense是高阻节点走线太长容易捡到噪声。第三LED可以放得远一点毕竟它是人机交互界面要装在板子边缘方便观察。如果你不想用AD立创EDA也是不错的选择完全免费浏览器打开就能画元件库在线搜索LM339直接放置还能一键下单打样对国内玩家非常友好。我自己现在很多小项目都用立创EDA效率不比AD差。4. 实测调试与故障排查实录4.1 上电前的检查清单焊好电路先别急着上电花两分钟检查一遍能省很多事。用万用表通断档量一下电源正负极有没有短路确认LM339方向没有插反确认两个电位器初始状态都旋在中间位置防止滑片在端点导致对比器初始输出异常确认LED极性没有接反阳极接VCC、阴极接电阻的方向别弄反了。上电后第一件事测芯片第3脚和第12脚之间的电压应该是电池电压12V左右。然后量两个电位器的滑片电压一边旋动一边看电压变化是否顺畅确认能在0到12V之间连续调整。这两个基础检查过了再进入阈值校准环节。校准欠压阈值时最好准备一台可调直流电源模拟电池。把可调电源调到11V接在电路输入端然后缓慢旋动W1电位器直到红色LED刚好点亮。再把电源调到11.5V确认红色LED熄灭。如果LED还在亮微调W1让它在11.5V时熄灭。这样反复调整两次欠压阈值就稳定在11V附近了。校准过压阈值同理把可调电源调到14.5V旋动W2电位器直到黄色LED刚好点亮。再把电源调到14V确认黄色LED熄灭。多调几次找到一个临界区间让阈值正好落在14到14.5V之间。这里用多圈电位器的优势就体现出来了可以非常精细地找到翻转临界点。4.2 常见故障现象与排查方法我把实际调试中遇到的典型问题整理成一个表格大家照方抓药。故障现象可能原因排查方法上电后LED全不亮电源没接对或芯片没工作测芯片第3脚和第12脚电压确认芯片方向测LED两端电压判断是否正常某一路LED常亮不灭基准没设好或反馈没接量对应电位器滑片电压检查对应的滞回反馈电阻是否虚焊LED在阈值附近闪烁滞回不够或电源纹波太大增大滞回电阻R7、R8确认0.1μF去耦电容是否靠近芯片阈值和计算值差很多忽略了采样源内阻把R1、R2并联等效内阻5kΩ代入滞回计算电池满电时过压灯就亮W2调得太后旋回W2重新用可调电源标定14.5V翻转点接上继电器后电路工作异常继电器线圈反电动势干扰输出级加续流二极管或把上拉电阻减小到4.7kΩ最常遇到的就是第一种LED全不亮。新手往往第一反应是LED坏了其实十有八九是芯片没工作。我经历过最奇葩的一次是IC座接触不良芯片压上去没压实第3脚虚接结果电源量得到、LED就是不亮折腾了半天最后发现是座子没插到底。所以用IC座的时候芯片插进去一定要用力按到底听见“咔”一声才算到位。还有一个很容易踩的坑LM339输出低电平时可以灌电流点亮LED这没问题但如果你想让输出高电平时驱动什么东西比如给单片机的IO口上拉电阻就必须接。开集电极结构决定了输出管只能把电平拉低不能主动输出高电平全靠上拉电阻把电平抬起来。很多人不理解这个以为芯片输出是推挽的结果高电平飘忽不定下游电路误动作。4.3 功能扩展思路这套电路验证通了以后扩展空间其实很大。LM339还剩下两路没用你可以再加一路监测电池温度用NTC热敏电阻分压替代其中一个输入端搞一套过温保护或者再加一路监测充放电电流用采样电阻加比较器做过流保护。反正芯片引脚都富余硬件改几根线就行。如果嫌LED指示不够可以在输出端加一个三极管或者直接接继电器驱动蜂鸣器做声音告警或者控制充电回路的风扇。继电器驱动要注意加续流二极管不然线圈断电瞬间的反电动势容易把比较器输出端打坏。我通常用1N4148二极管反向并联在继电器线圈两端效果很好。还有一条路是把监测信号送给单片机。LM339的输出已经是标准0到5V或0到12V的数字电平加个电阻分压或者光耦就能安全地接到单片机GPIO上。单片机收到电平变化后可以做更精细的处理比如记录事件时间、通过蓝牙推送告警到手机。这样比较器负责实时监测、单片机负责信息处理各司其职整机可靠性反而更高。一个我踩过之后才发现的关键细节最后分享一个我做了好几版电路之后才真正想明白的细节滞回电阻的取值不是越大越好。虽然从计算上看加大R7、R8能让回差变小感觉上更“灵敏”但实际电路里电阻温漂、电位器接触噪声、比较器自身输入失调电压这些因素都会叠加在阈值上。R7、R8太大反馈电流太小对同相端电压的“拉偏”作用就弱滞回效果被噪声吃掉输出依然可能抖动。我现在的经验是滞回电阻选100k到470k之间比较合适折中用270k。如果你希望回差更大比如驱动继电器怕频繁通断可以把滞回电阻减小到100k回差大概能翻一倍。这个数值不需要精确到什么理论最优根据实际抖动情况微调一两轮就能找到舒服的区间。调试的时候用可调电源从阈值上下缓慢扫过观察输出有没有临界抖动顺手就把电阻值定下来了。这篇文章从比较器原理、LM339选型、滞回设计、参数计算到实际接线和故障排查基本把一套电池电压监测电路从零到能用的全过程走了一遍。你在做的时候如果碰到其他奇怪的问题量一下各个关键节点的电压对照连接关系表逐脚排查大概率能自己找出来。电子这东西就是这么回事上一个项目踩过的坑下一个项目就能绕开走。