智能温度计这类小设备续航翻车是特别常见的一类问题。我前后拆过不下二十款不同方案的智能温度计从早期用两节7号电池的到后来用CR2032纽扣电池的再到内置锂电加充电仓的几乎每一款在续航上都踩过坑。有意思的是用户反馈的续航差往往不是单一原因而是电池选型、供电电路、测量策略、固件逻辑这几层问题叠加出来的结果。这篇就把我排查智能温度计续航问题的完整思路拆开讲从电池内阻、电压测量、供电切换电路到ADC采样、低功耗策略一层层往下挖。不管你是做硬件设计的、写固件的还是单纯想搞明白自己手上那台温度计为什么半个月就没电都能从里面找到对应的排查路径。1. 先搞清楚续航差到底差在哪一层很多人一上来就换电池换完发现还是撑不了多久然后就怀疑是设备漏电。这个顺序其实是反的。排查续航问题第一步不是动手换而是先把问题定位到具体层级否则你换十次电池也找不到根因。1.1 把续航问题拆成三个可测量的维度我习惯把续航问题拆成三个维度来量化静态功耗、动态功耗、电池实际可用容量。这三个维度对应的是完全不同的排查方向。静态功耗指的是设备在待机或休眠状态下的电流消耗单位通常是微安。这个数值直接决定了设备放着不用能撑多久。动态功耗是设备在工作状态比如点亮屏幕、驱动传感器、无线传输时的电流单位是毫安。电池实际可用容量则是电池在设备实际工作条件下的放电能力它和标称容量往往差得很远尤其是低温环境或者大电流脉冲放电场景。举个实际例子。我之前测过一款用CR2032供电的温度计标称待机电流5微安理论上CR2032的220mAh容量能撑好几年。但实测待机电流是80微安直接差了16倍。后来发现是休眠时有一个分压电阻网络一直在耗电这个网络本来是用来做电池电压检测的设计时没考虑它在休眠状态下的漏电流。这就是典型的静态功耗问题。1.2 用万用表串联测电流的正确姿势测静态功耗最直接的方法是把万用表串在电池和电路之间。但这里有个坑很多万用表的微安档内阻比较大串进去之后会导致电路供电电压下降设备可能直接进入欠压保护或者反复重启测出来的电流根本不准。我的做法是分两步。第一步用毫安档粗测确认设备能正常启动和工作。第二步切到微安档但要在万用表两端并联一个开关测量时先闭合开关让设备正常上电等设备进入休眠后再断开开关让电流全部流过万用表。这样能避免上电瞬间的大电流冲击损坏万用表保险丝也能保证休眠电流测量的准确性。注意有些设备的休眠是周期性的比如每10秒唤醒一次采样。这种情况下万用表读数会跳变你需要用带数据记录功能的万用表或者用示波器配合电流探头来抓平均电流。1.3 电池内阻才是隐藏的续航杀手电压测量只能告诉你电池还剩多少电但内阻测量能告诉你电池还能不能带得动负载。智能温度计虽然平均功耗低但在无线传输或者屏幕刷新瞬间会有几十毫安的脉冲电流。如果电池内阻偏高这个脉冲电流会在内阻上产生压降导致MCU瞬间欠压复位。我遇到过一款温度计用新电池一切正常用了两个月后开始频繁重启。测电压还有2.8V看起来没问题但一测内阻已经超过50欧姆。脉冲电流一来电压瞬间掉到1.8V以下MCU直接复位。复位后重新启动又消耗一波电流形成恶性循环续航自然崩了。电池内阻的测量方法有两种常见思路。一种是开路短路法先测电池开路电压然后接一个已知负载电阻测负载两端电压通过电压差和负载电流算出内阻。另一种是交流注入法给电池注入一个已知频率的交流小信号测响应来算内阻。前者电路简单但精度一般后者精度高但需要专门的交流激励电路。对于温度计这类低功耗设备开路短路法基本够用。2. 供电电路里那些偷偷吃电的设计定位到功耗层级之后下一步就是看供电电路本身。智能温度计的供电电路通常包含电池、稳压电路、电压检测电路、以及可能的备用电源切换电路。这里面每一个环节都可能成为漏电点。2.1 分压电阻网络最容易被忽视的静态功耗来源用ADC测电池电压是最常见的方案但很多人直接用两个电阻分压然后接到ADC引脚。这个分压网络在设备休眠时依然在耗电。假设你用1MΩ和1MΩ分压电池3V那么分压网络电流是1.5微安。看起来不大但如果电池是CR20321.5微安意味着每年消耗13mAh占标称容量的6%左右。如果电阻选得更小比如100kΩ电流就是15微安一年消耗131mAh直接干掉一半以上容量。正确的做法是在分压网络和地之间加一个MOS管开关只在需要测量电压时才导通。或者选用更大阻值的电阻比如10MΩ级别但要注意ADC输入阻抗和漏电流的影响。STM32F103的ADC输入漏电流在常温下大约是50nA级别用10MΩ电阻分压时漏电流引起的误差大约在0.5mV左右对于电池电压检测来说完全可以接受。2.2 外接电源和电池供电自动切换电路的漏电陷阱有些温度计设计成可以用USB供电也可以用电池供电这就需要自动切换电路。常见的方案是用两个肖特基二极管做ORing或者用PMOS做理想二极管。肖特基二极管方案简单但反向漏电流在高温下可能达到几十微安。PMOS方案漏电小但如果控制逻辑没设计好可能出现两个电源同时导通的情况导致电池被反向充电或者电流倒灌。我见过一个案例设备插着USB时一切正常拔掉USB后电池续航只有标称的三分之一。后来发现是切换电路里的PMOS栅极驱动电阻选得太小导致PMOS没有完全关断电池通过PMOS的体二极管持续漏电。把栅极电阻从10kΩ改成100kΩ并增加一个下拉电阻确保关断漏电从200微安降到了2微安以下。2.3 LDO的静态电流规格书上的数字和实际差多少LDO的静态电流Quiescent Current是另一个关键参数。很多LDO规格书上写着静态电流几微安但那是特定条件下的典型值。实际应用中如果LDO的输入输出压差大、负载电流变化范围宽静态电流可能会显著上升。更隐蔽的问题是LDO的关断电流。有些LDO标称关断电流只有0.1微安但那是EN引脚拉低、输入电压在特定值下的测量结果。如果你的电路里EN引脚没有干净地拉低或者输入电压高于规格书测试条件关断电流可能达到几十微安。我习惯在选型时直接看规格书里的Ground Current vs. Load Current曲线并且留出至少3倍的余量。3. 电压测量与ADC采样中的续航陷阱电压测量本身不耗电但测量策略和ADC配置会直接影响功耗。很多温度计的续航问题根源就在电压测量的实现方式上。3.1 STM32F103的ADC采样时间与功耗权衡STM32F103C8T6是这类设备里非常常见的MCU。它的ADC在采样时消耗的电流和采样时间直接相关。采样时间越长ADC内部采样保持电容充电越充分精度越高但功耗也越大。很多人在配置ADC时直接用了最长的采样时间觉得精度优先结果每次采样多消耗几百微安。我的经验是对于电池电压这种变化缓慢的信号采样时间可以适当缩短。STM32F103的ADC采样时间从1.5周期到239.5周期可调。在12位精度下如果信号源内阻小于10kΩ用13.5周期或28.5周期就能达到足够的精度。实测下来采样时间从239.5周期降到28.5周期单次采样电流从大约1.2mA降到0.8mA虽然看起来差别不大但如果你的设备每秒采样一次一年下来就是好几毫安时的差距。3.2 电压跳变问题是电池问题还是采样问题电压跳变是排查续航时经常遇到的现象。设备显示电池电量忽高忽低或者MCU在电压看起来正常的情况下突然复位。这时候要区分是电池真实电压在跳还是采样电路引入了噪声。区分方法很简单用示波器直接测电池两端电压同时用MCU的ADC读电压对比两者的波形。如果示波器上电压平稳但ADC读数跳变那就是采样电路或者软件滤波的问题。如果示波器上电压本身就在跳那就是电池内阻或者负载突变的问题。我遇到过一次典型的采样问题ADC读数每隔几秒跳一次幅度大约0.3V。查了半天发现是ADC参考电压用的VDDA而VDDA上并联的滤波电容容量不够无线模块发射时引起的电源波动耦合到了参考电压上。把滤波电容从100nF增加到10微法跳变就消失了。3.3 用电压跟随器隔离采样电路如果分压电阻网络阻值较大ADC采样时的输入电流会导致分压点电压下降测量就不准了。这时候可以在分压点和ADC之间加一个电压跟随器。电压跟随器输入阻抗极高几乎不取电流输出阻抗极低能很好地驱动ADC输入。但电压跟随器本身也有静态电流。运放的静态电流从几百纳安到几毫安不等。选型时要选低功耗运放比如静态电流在1微安以下的型号。另外运放的供电也要考虑如果运放一直供电它的静态电流就会持续消耗电池。更好的做法是用一个MOS管控制运放的供电只在测量时给运放上电。4. 固件层面的低功耗策略与常见反模式硬件排查完之后固件层面的策略往往才是决定续航的最后一公里。同样的硬件固件写得好和写得差续航可能差好几倍。4.1 休眠模式选对了电流差一个数量级STM32F103支持三种低功耗模式Sleep、Stop、Standby。Sleep模式下内核停止但外设还在跑电流大约几毫安。Stop模式下所有时钟停止保留寄存器和SRAM电流大约20微安。Standby模式下除了备份域全部断电电流大约2微安。很多温度计的固件只用了Sleep模式因为唤醒快、代码改动小。但Sleep模式的电流是Stop模式的几百倍。如果设备大部分时间都在待机用Stop模式能把平均功耗降下来一个数量级。代价是唤醒后需要重新配置时钟和外设代码复杂度会增加。我的建议是如果采样间隔大于1秒果断用Stop模式。如果采样间隔在几百毫秒级别可以评估一下Stop模式的唤醒开销是否可接受。Standby模式虽然最省电但每次唤醒相当于复位RAM数据全丢适合那种完全不需要保留状态的场景。4.2 无线传输的功耗优化不是传得越快越好带无线的温度计无线传输往往是最大的功耗来源。很多人觉得传输时间越短越省电所以拼命提高速率。但实际上无线芯片的功耗和传输速率不是线性关系。高速率虽然缩短了传输时间但射频前端的功耗会显著上升而且高速率对信号质量要求更高重传概率也更大。更有效的优化是减少传输次数和数据量。比如温度变化缓慢没必要每秒传一次可以设置成温度变化超过0.5度才传或者固定每5分钟传一次。数据包也可以压缩把温度值从浮点数转成定点数一个包就能多塞几个采样点。4.3 那些看起来省电实际上费电的固件写法有几个常见的固件反模式我在排查续航时经常遇到。第一个是忙等待延时。用for循环做延时CPU一直在跑电流下不来。正确做法是用定时器或者RTC唤醒让CPU在等待期间进入低功耗模式。第二个是频繁唤醒。有些固件用RTC每10毫秒唤醒一次检查按键或者传感器状态。10毫秒的唤醒周期意味着CPU大部分时间都在唤醒和休眠之间切换而每次切换本身就有功耗开销。如果按键响应要求不高把唤醒周期改成100毫秒甚至500毫秒续航能明显改善。第三个是外设没关。ADC采完不关、SPI接口用完不关、GPIO配置成输出但状态不对导致漏电。这些细节在调试时不容易发现但累积起来很可观。我习惯在进入休眠前把所有外设时钟关掉GPIO配置成模拟输入或者带上拉的输入避免悬空引脚漏电。5. 电池选型与BMS思路在小型设备上的简化应用温度计这类设备虽然不需要完整的BMS但BMS里的一些核心思路可以借鉴尤其是电池保护和电量估算部分。5.1 CR2032、AAA、锂电不同电池的放电特性差异CR2032标称3V容量大约220mAh但它的内阻比较大通常在10到40欧姆之间而且随着放电会快速上升。这意味着CR2032不适合有大脉冲电流的应用。如果温度计有无线功能CR2032可能撑不了多久。AAA电池标称1.5V容量大约1000mAh内阻小得多通常几百毫欧。但需要两节串联才能达到3V体积也大。锂电标称3.7V容量可以做得很大内阻也小但需要充电电路和 protection IC成本和复杂度都上去了。选型时要根据设备的峰值电流和平均电流来算。如果峰值电流超过10mACR2032就要慎重。如果峰值电流超过50mA基本只能选锂电或者AAA。5.2 电池等效电路模型理解内阻和容量的关系电池可以等效成一个理想电压源串联一个内阻再并联一个自放电电阻。理想电压源代表电池的开路电压内阻代表电池对电流的阻碍自放电电阻代表电池自己慢慢放电的特性。这个模型能解释很多现象。比如为什么电池用了一段时间后电压看起来还有电但设备已经带不动了——因为内阻变大了负载电流在内阻上的压降变大负载两端电压就不够了。再比如为什么低温下续航变差——低温下内阻增大自放电也加快。对于温度计这种低功耗设备自放电电阻的影响在长期待机时不可忽视。CR2032的自放电率大约是每年1%到2%但如果设备本身静态功耗就有几十微安自放电反而是小头了。5.3 防止电池并联短路环流的思路有些设计为了增加容量会把电池并联。并联电池如果电压不一致高压的会给低压的充电形成环流。这个环流可能很大轻则浪费电量重则发热甚至损坏电池。防止环流的方法是在每节电池上串联一个MOS管做理想二极管或者用专用的电池并联管理芯片。对于温度计这种小设备最简单的做法是不要并联直接用一节容量更大的电池。如果非要并联确保两节电池来自同一批次、电压差小于50mV并且在每节电池上串联一个小的均流电阻。6. 一套可复现的续航排查流程把上面的内容串起来我整理了一套实际排查时用的流程。这套流程从现象出发逐步缩小范围最后定位到具体原因。6.1 从现象到根因的排查链路第一步记录现象。设备能撑多久是突然变短还是逐渐变短换新电池后能撑多久这些信息能帮你判断是电池老化还是电路问题。第二步测静态电流。用前面说的方法测休眠电流和设计值对比。如果静态电流超标重点查分压网络、LDO关断电流、GPIO漏电。第三步测动态电流。用示波器抓工作时的电流波形看峰值电流和持续时间。如果峰值电流超过电池的承受能力考虑增加电容缓冲或者换电池。第四步测电池内阻。如果静态和动态电流都正常但续航还是短测电池内阻。内阻高的电池直接换掉。第五步检查固件策略。确认休眠模式、唤醒周期、外设关闭逻辑是否正确。6.2 常见问题与对应解决方案速查现象可能原因排查方法解决方案待机电流大分压电阻网络持续耗电断开分压网络测电流加MOS开关或增大电阻频繁复位电池内阻大导致脉冲压降示波器抓复位瞬间电压换低内阻电池或加缓冲电容电压读数跳变ADC参考电压受干扰示波器测VDDA增加滤波电容或改用内部参考无线传输后续航骤降传输电流超出电池能力测传输时电池电压降低传输功率或换电池休眠后电流不降外设未关闭或GPIO漏电逐个关闭外设测电流关闭时钟、配置GPIO状态6.3 几个我踩过的坑和对应的经验第一个坑是忽略温度对电池的影响。有一次冬天测一款温度计续航只有夏天的三分之一。查了半天发现是CR2032在低温下内阻急剧上升导致MCU在无线传输时欠压复位。后来在电池两端并联了一个100微法的电容复位问题解决了但续航还是短。最终方案是换成锂电问题彻底解决。第二个坑是ADC采样时间配置错误。有一次为了省电把采样时间设到最短结果电压读数偏差很大导致电量显示不准用户以为还有电结果突然关机。后来发现是采样时间太短采样保持电容没充满。把采样时间加长到28.5周期后精度和功耗都满意。第三个坑是LDO选型只看静态电流。选了一款静态电流0.5微安的LDO但没注意它的关断电流在输入电压4V时是10微安。而电池满电时电压正好是4V左右导致刚换电池时关断电流偏大。后来换了一款关断电流在全电压范围内都小于1微安的LDO。6.4 用SPWM思路理解电压调节的稳定性虽然温度计里一般用不到SPWM但SPWM电压环的稳定性思路对理解供电电路有帮助。SPWM通过调节脉冲宽度来控制输出电压本质上是一个闭环系统。如果环路带宽设计不当输出电压会振荡。温度计里的LDO或者DC-DC虽然没有SPWM那么复杂但同样存在稳定性问题。LDO的输出电容ESR不合适会导致振荡DC-DC的反馈电阻和补偿网络设计不当也会振荡。振荡时功耗会上升因为电路在反复调整。我遇到过一款温度计DC-DC在轻载时进入PFM模式但PFM的阈值设置不当导致在某个负载区间频繁在PWM和PFM之间切换功耗反而比纯PWM模式还高。后来调整了PFM阈值问题解决。排查智能温度计的续航问题说到底是一个系统性的活。电池、供电电路、ADC采样、固件策略每一层都可能有问题而且往往是多层问题叠加。我的经验是不要跳步按流程一层层测用数据说话。静态电流、动态电流、电池内阻这三个数据拿到手大部分问题都能定位。剩下的就是针对具体原因做优化该加开关的加开关该换电池的换电池该改固件的改固件。最后再分享一个小技巧如果你手头没有高精度电流表可以用一个已知阻值的采样电阻串联在电池回路里用示波器测电阻两端电压通过欧姆定律算电流。这个方法虽然精度不如专用电流表但能抓到脉冲电流的波形对于排查动态功耗问题特别有用。