1. 一块温度计引发的续航排查战
智能温度计这东西,看着简单,真用起来续航拉胯的时候,能把人折腾得够呛。我手上这个项目,客户反馈是“新换的电池,用了不到两周就报低电量”,但拆开测电池电压,空载还有2.9V以上,看着不像没电。这种“电压看着够、实际带不动”的情况,十有八九是电池内阻上来了,或者供电链路里某个环节在偷偷吃电。智能温度计本身功耗不高,主控加传感器加显示,正常设计下两颗纽扣电池撑半年到一年是常态,如果两周就趴窝,那一定是有地方出了问题。
这篇文章适合谁看?如果你正在做低功耗电池供电的温湿度采集设备,或者手头有个智能温度计、电子标签之类的产品续航不达标,又或者你只是好奇“为什么万用表量着有电、装上去就不行”,那这篇排查记录应该能帮到你。我会从供电架构、电池内阻、电压测量方法、低功耗设计几个角度,把这次排查的完整思路和实操过程拆开讲,包括我踩过的坑和最后怎么定位到根因的。核心关键词就几个:智能温度计、续航、电池、内阻、电压,围绕这几个词把问题讲透。
先交代一下背景。这个温度计用的是两颗CR2032纽扣电池串联,标称3V供电,主控是一颗低功耗MCU,带段码LCD屏,温度传感器是I2C接口的数字传感器,另外还有一个蜂鸣器做超温报警。整机正常工作电流在十几微安左右,刷新间隔5秒,蜂鸣器不常响。按这个功耗算,CR2032的容量大概220mAh,理论续航应该在一两年。但实际客户反馈是两周左右就低电量报警,差距太大,必须系统性排查。
2. 供电链路拆解与问题定位思路
2.1 从电池到负载的完整路径
排查续航问题,第一步不是急着换电池,而是把整条供电链路画出来。这个温度计的供电路径是这样的:CR2032串联电池组 → 电池座弹片 → PCB走线 → 一个PMOS做电源开关 → LDO稳压到2.8V → MCU和传感器。另外还有一路直接从电池电压分压后进MCU的ADC,用来做电量检测。蜂鸣器是挂在LDO输出上的,通过三极管驱动。
这条链路里,每一个环节都可能出问题。电池本身的内阻、电池座接触电阻、PMOS的导通电阻、LDO的静态电流、分压电阻的漏电流,甚至PCB表面的助焊剂残留导致的微短路,都会影响续航。我的思路是先分段测量,把问题范围缩小,再逐个深挖。
注意:不要一上来就换新电池然后观察几天,那样效率太低。先用可调直流电源模拟电池电压,串一个电流表看整机静态电流,这是最快的初筛方法。
2.2 为什么电压正常不代表电池健康
很多人判断电池有没有电,就是拿万用表量一下空载电压,看到2.9V就觉得电池没问题。这个做法在低功耗设备上非常不可靠。电池的等效电路模型可以简单理解为一个理想电压源串联一个内阻。空载时没有电流流过内阻,所以万用表读到的是接近理想电压源的值。但一旦带上负载,电流在内阻上产生压降,实际加到电路上的电压就会低于空载值。
CR2032这种纽扣电池,新电池内阻一般在10到20欧姆左右,随着放电和老化,内阻会逐渐升高,有些劣质电池或者存放时间长的电池,内阻能到50欧姆甚至上百欧姆。假设整机平均电流是20微安,50欧姆内阻上的压降只有1毫伏,看起来可以忽略。但问题在于,温度计不是一直处于微安级睡眠状态,它每隔5秒要唤醒一次,唤醒时MCU全速运行、传感器采集、LCD刷新,瞬时电流可能冲到几毫安甚至十几毫安。这时候内阻上的压降就是几十毫伏甚至上百毫伏,如果电池内阻再大一点,瞬间电压可能直接跌到MCU的欠压复位阈值以下,导致设备反复复位或者工作异常。
更隐蔽的是,有些MCU在电压跌落时会进入一种“半死不活”的状态,电流反而比正常工作时大很多,形成恶性循环。所以续航崩了,不一定是电池容量没了,很可能是内阻大了导致带载能力下降。
2.3 排查工具与最小测试系统搭建
这次排查我用到的工具清单如下:
| 工具 | 用途 | 备注 |
|---|---|---|
| 可调直流电源 | 模拟电池供电 | 带电流显示,分辨率到微安 |
| 六位半万用表 | 精确测量电压和电阻 | 普通四位半也够用 |
| 示波器 | 看唤醒瞬间电压跌落 | 带宽100MHz以上 |
| 电子负载 | 测电池内阻和带载能力 | 支持恒流模式 |
| 热风枪和烙铁 | 拆焊电池座和元件 | 可调温 |
| 无水酒精和棉签 | 清理PCB | 去除助焊剂残留 |
最小测试系统很简单:把可调电源调到3V,串入万用表电流档,接到温度计的电池正负极输入端。注意电源的负极要和温度计的地连在一起。然后观察睡眠电流和唤醒电流。如果睡眠电流明显高于设计值,比如超过50微安,那就有漏电或者某个器件没进入低功耗模式。如果睡眠电流正常但唤醒电流异常大,那就要查唤醒期间的负载。
我实测下来,这个温度计睡眠电流在18微安左右,算是正常范围。但唤醒电流峰值到了8毫安,而且持续时间有200毫秒,这就有点长了。正常设计下,唤醒后MCU处理加传感器采集加LCD刷新,应该在50毫秒内完成,然后迅速回到睡眠。200毫秒的8毫安,平均下来每次唤醒消耗的电量是8mA × 0.2s = 1.6mAs,每5秒一次,一天就是17280次,总电量约27648mAs,换算成mAh是7.68mAh。光唤醒这一项,一天就吃掉7.68mAh,CR2032的220mAh容量,理论上28天就没了。这还没算睡眠电流和其他开销。所以问题很可能出在唤醒时间过长或者唤醒电流过大上。
3. 电池内阻与电压测量的实操细节
3.1 电池内阻的两种测量方法
测电池内阻,常见的有两种方法:交流注入法和直流负载法。交流注入法需要专用内阻仪,比如常见的电池内阻测试仪,原理是给电池注入一个1kHz左右的交流小信号,测交流压降来算内阻。这种方法精度高,不受极化影响,但设备贵。直流负载法更接地气,用电子负载或者功率电阻,让电池放一个已知电流,测电压跌落,然后算内阻。
具体操作:先测电池空载电压V1,然后接一个已知阻值的负载电阻R,测负载两端电压V2,同时测流过负载的电流I。内阻r = (V1 - V2) / I。注意负载电阻的选择要让电流在合理范围,对于CR2032,可以用100欧姆左右的电阻,电流大概30毫安,测完立刻断开,避免过度放电。
我手头没有专业内阻仪,就用直流负载法。拿了一颗客户退回的温度计里的CR2032,空载电压2.91V,接100欧姆电阻后电压跌到2.62V,电流约26.2毫安。算下来内阻r = (2.91 - 2.62) / 0.0262 ≈ 11欧姆。这个内阻其实不算大,新电池水平。那问题可能不在电池本身,而是电池座接触电阻或者PCB上的漏电。
实操心得:测纽扣电池内阻时,接触压力很关键。电池座弹片如果氧化或者变形,接触电阻可能比电池内阻还大。我遇到过电池座弹片氧化导致接触电阻超过50欧姆的情况,表现和电池没电一模一样。
3.2 电压测量中的隐藏陷阱
用万用表测电压,看起来简单,但在低功耗设备排查中,有几个坑很容易踩。第一个坑是万用表输入阻抗。普通万用表直流电压档输入阻抗是10兆欧,这个阻抗并联在电路上,对于高阻抗节点会有明显影响。比如电池电压分压到ADC的电路,分压电阻如果是1兆欧级别,万用表一搭上去,分压比就变了,读到的电压不准。
第二个坑是测量点选择。测电池电压要在电池座输出端测,不要直接在电池表面测。电池座弹片和PCB焊盘之间的接触电阻,在带载时会产生压降,这个压降在空载时测不出来。正确做法是让设备处于唤醒状态,用示波器探头点在MCU的VDD引脚上,看唤醒瞬间的电压波形。如果看到明显的跌落和振铃,说明供电链路阻抗偏大。
第三个坑是地线回路。用示波器测电压时,探头地线夹的位置很重要。如果地线夹在远离被测点的地方,地线回路上的压降会叠加到测量结果里。我一般把地线夹在MCU的GND引脚附近,探头尖端点在VDD引脚,这样测到的才是MCU真正看到的电压。
这次排查中,我用示波器在MCU的VDD引脚上抓唤醒瞬间的波形,发现电压从2.8V瞬间跌到2.3V,持续大概50微秒,然后慢慢恢复到2.8V。这个跌落幅度已经接近MCU的欠压复位阈值了。但电池内阻只有11欧姆,按8毫安电流算,压降应该只有88毫伏,不至于跌500毫伏。说明供电路径上还有额外的阻抗。
3.3 从电压跳变定位到接触电阻
顺着电压跌落这个线索,我分段测量。先测电池座输出端到PCB走线之间的压降,发现电池座弹片两端的压降在唤醒瞬间有200多毫伏。拆下电池座,用放大镜看弹片表面,发现有一层淡淡的氧化层,用酒精擦洗后重新装上,压降降到50毫伏以内。但总压降还是有400多毫伏,说明还有别的地方。
继续查,发现PMOS电源开关的导通电阻偏大。这个PMOS是SOT-23封装的,型号标称导通电阻在4.5V驱动下是50毫欧,但这里是3V驱动,导通电阻会大很多。查数据手册,3V驱动时导通电阻大概200毫欧。8毫安电流下压降只有1.6毫伏,可以忽略。那问题在哪?
最后把怀疑点放到LDO上。这个LDO是低静态电流型号,但它的负载瞬态响应比较差。当负载电流从微安级突然跳到毫安级时,LDO的输出电压会有一个跌落,恢复时间取决于输出电容。我查了输出电容,只有0.1微法,太小了。正常应该用1微法以上。把输出电容换成1微法后,唤醒瞬间的电压跌落从500毫伏降到150毫伏左右,效果立竿见影。
注意:LDO的输出电容不是越大越好,要看数据手册的稳定区间。有些LDO要求输出电容在特定ESR范围内才稳定,盲目加大可能引起振荡。这个项目用的LDO手册推荐1到10微法,我选了2.2微法,实测稳定。
4. 低功耗设计与唤醒时间优化
4.1 唤醒时间为什么这么长
电压跌落问题缓解后,续航有所改善,但客户反馈还是不到一个月。说明还有别的问题。回到之前测到的唤醒时间200毫秒,这个太长了。正常低功耗设计,唤醒后应该尽快完成采集和显示,然后回到睡眠。我逐段测量唤醒后的时间分布:MCU内核启动和时钟稳定花了20毫秒,传感器上电和第一次转换花了80毫秒,LCD刷新花了60毫秒,剩下40毫秒是蜂鸣器自检和逻辑处理。
传感器第一次转换慢,是因为它上电后需要一段稳定时间,而且默认配置是最高精度,转换时间本身就长。我把传感器配置改成低功耗模式,转换时间从80毫秒降到15毫秒,精度损失在温度测量上只有0.1度,完全可以接受。LCD刷新60毫秒是因为用了软件模拟的段码驱动,改成硬件LCD驱动后降到10毫秒以内。MCU启动时间可以通过优化时钟配置来缩短,比如直接用内部高速时钟,跳过外部晶振稳定等待,但这样会影响时间精度,需要权衡。
优化后,唤醒时间从200毫秒降到45毫秒左右,唤醒电流还是8毫安,但持续时间短了,每次唤醒消耗的电量从1.6mAs降到0.36mAs,一天下来从7.68mAh降到1.73mAh。加上睡眠电流18微安,一天0.43mAh,总功耗约2.16mAh每天,CR2032的220mAh容量,理论续航超过100天。实际因为电池自放电和温度影响,打个七折,也有70天左右,比之前的两周好太多了。
4.2 电量检测电路本身的功耗
这个温度计有一个电量检测功能,用两个电阻分压后进ADC。分压电阻是1兆欧和1兆欧,分压比1比1,电池电压3V时,分压点电压1.5V,流过电阻的电流是1.5V / 2兆欧 = 0.75微安。这个电流看起来很小,但它是持续存在的,一天24小时不停,一天消耗0.75微安 × 24小时 = 18微安时,也就是0.018mAh。相对于总功耗2.16mAh每天,占比不到1%,可以接受。
但有些设计为了省事,分压电阻用得比较小,比如100千欧和100千欧,那电流就是15微安,一天0.36mAh,占比就大了。更合理的做法是用MOS管控制分压电路的通断,只在测量电量的时候接通,测完就断开。这样平均电流可以降到纳安级。这个项目里我没改,因为0.018mAh每天的影响很小,改电路要动PCB,不划算。
实操心得:电量检测的分压电阻,能大则大,但要注意ADC输入阻抗和漏电流。如果分压电阻太大,比如10兆欧级别,ADC的输入漏电流和PCB表面的漏电流都会影响精度。一般1兆欧到2兆欧是比较平衡的选择。
4.3 电池供电自动切换与防倒灌
这个温度计没有外接电源,所以不需要自动切换电路。但我在排查过程中想到一个问题:如果客户用可调电源模拟电池,电源和电池同时接在电路上,会不会有倒灌?答案是会。如果电源电压高于电池电压,电流会倒灌进电池,不仅测不准,还可能损坏电池。所以测试时要么断开电池,要么在电源和电池之间串一个理想二极管电路。
理想二极管电路可以用PMOS加比较器实现,也可以用专用的理想二极管芯片。原理很简单:比较器检测输入和输出端的电压,如果输入端电压高于输出端,就打开PMOS,让电流通过;如果输入端电压低于输出端,就关断PMOS,防止倒灌。这个电路在电池和外部电源共存的设备里很常见,比如BMS电池管理系统里就有类似设计。
对于这个温度计的排查,我直接用可调电源替代电池,没有同时接电池,所以不存在倒灌问题。但如果读者要复现这个排查过程,建议用电池座加假电池(就是两端是金属的塑料棒)来接电源,避免直接焊线到电池座弹片上,那样容易导致弹片变形。
5. 常见问题速查与避坑指南
5.1 续航问题排查速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 新电池两周就没电 | 唤醒时间过长 | 示波器测唤醒电流持续时间 | 优化传感器配置和LCD驱动 |
| 电压正常但设备不工作 | 电池内阻大 | 直流负载法测内阻 | 更换低内阻电池或改善电池座接触 |
| 唤醒瞬间复位 | 电源跌落过大 | 示波器测MCU VDD引脚 | 加大LDO输出电容或优化供电路径 |
| 睡眠电流偏大 | 某个器件未进低功耗 | 分段断开负载测电流 | 检查上拉电阻、分压电阻、传感器配置 |
| 电量显示不准 | 分压电阻或ADC基准问题 | 万用表对比分压点电压 | 校准ADC或改用内部基准 |
| 低温下续航骤降 | 电池低温性能差 | 低温箱测试 | 改用低温电池或增加加热措施 |
5.2 我踩过的三个坑
第一个坑是迷信万用表电压。前面说过,空载电压正常不代表带载正常。我一开始就是被2.9V的空载电压骗了,以为电池没问题,白白浪费了一天时间。后来用示波器看唤醒瞬间波形,才找到真正的问题。
第二个坑是忽略PCB清洁度。这个温度计是手工焊接的样品,PCB上残留了不少助焊剂。助焊剂在潮湿环境下会轻微导电,导致漏电流。我用酒精清洗后,睡眠电流从25微安降到18微安。虽然降幅不大,但对于微安级功耗的设备,每一微安都很重要。
第三个坑是LDO输出电容选型。我一开始换了一个10微法的电容,结果LDO振荡了,输出电压反而更不稳。后来查手册才知道这个LDO要求输出电容ESR在0.1到10欧姆之间,10微法陶瓷电容的ESR太低,不满足稳定条件。换成2.2微法后正常。所以换电容前一定要看数据手册的稳定区间。
5.3 电池选型与使用建议
CR2032电池品牌很多,质量参差不齐。我实测过几个常见品牌,内阻从10欧姆到80欧姆都有。对于低功耗设备,建议选内阻低、自放电小的品牌。另外,电池的存放时间也很关键,库存超过两年的电池,内阻会明显升高,即使没用过,容量也会下降。
如果设备工作温度范围宽,比如零下20度到零上60度,那CR2032的低温性能会是个问题。低温下电池内阻急剧升高,带载能力大幅下降。这种场景建议用宽温电池,或者改用超级电容加电池的组合方案。超级电容负责提供唤醒瞬间的大电流,电池负责长期供电,这样可以避开电池内阻的影响。
提示:超级电容加电池的方案,需要注意超级电容的漏电流和均压问题。如果超级电容串联使用,必须加均压电路,否则电压不均会导致某个电容过压损坏。
6. 从这次排查中沉淀下来的经验
这次排查前后花了大概一周时间,从最初的怀疑电池,到定位到LDO输出电容和唤醒时间,中间走了不少弯路。最大的体会是:低功耗设备的续航问题,不能只看电池,要把整个供电链路和负载行为结合起来分析。电池内阻、接触电阻、LDO瞬态响应、唤醒时间、分压电阻漏电,任何一个环节出问题,都会在续航上放大。
另外,测量工具的选择很重要。万用表适合测静态值,示波器才能抓到瞬态行为。对于低功耗设备,唤醒瞬间的电压跌落和电流波形,往往藏着最关键的信息。我现在的习惯是,拿到一个低功耗设备,先用可调电源加电流表看睡眠和唤醒电流,再用示波器看电压波形,基本能快速判断问题方向。
最后分享一个小技巧:如果你手头没有专业的内阻仪,可以用一个简单的电路来测电池内阻。找一个100欧姆的电阻和一个开关,串联后接电池,用示波器或者带峰值保持的万用表测开关闭合瞬间的电压跌落,然后算内阻。这个方法精度不如专业仪器,但足够判断电池能不能用。我试过,和电子负载测出来的结果偏差在20%以内,对于现场排查够用了。
这个温度计后续还可以做进一步优化,比如把蜂鸣器改成压电陶瓷片,降低驱动电流;把LCD背光去掉,用反射式段码屏;MCU在睡眠时把不用的外设时钟全部关掉。这些措施叠加起来,续航还能再提升一截。不过那是另一个项目的事了,这次先把续航从两周拉到两个月,客户已经满意了。