1. 从一块“短命”的智能温度计说起
智能温度计这个品类,看起来简单——一个温度传感器、一颗低功耗主控、一块小电池、一块段码屏或者小尺寸点阵屏,成本压到极致,功能也就测温加显示。但真正做过这类产品的人都知道,续航问题是最容易翻车、也最难排查的一类问题。它不像功能性问题那样“要么能用要么不能用”,续航短往往是多个因素叠加的结果:电池本身的内阻、主控的低功耗策略、传感器的采样占空比、屏幕的刷新频率、电源转换效率、甚至PCB上的漏电流,任何一个环节出问题,都能让标称一年的续航缩水到一两个月。
我最近就接手了一个智能温度计的续航排查项目。产品形态是典型的家用壁挂式温度计,主控用的是ESP32-S3,电池供电,带电量检测功能,屏幕是段码LCD,标称续航12个月,实际用户反馈普遍在2到3个月就需要换电池。这个差距太大了,不是“优化一下”能解释的,一定是某个环节存在实质性缺陷。排查过程持续了将近三周,从电压测量、电池内阻测试、电源切换电路分析,到ADC采集精度、低功耗模式配置,几乎把整个电源链路翻了个底朝天。最终定位到的问题不止一个,而是三个问题叠加在一起,单独解决任何一个都只能延长一点续航,三个一起解决才把续航拉回到接近标称值。
这篇文章我会把整个排查过程完整拆开,包括电池内阻测试电路怎么搭、电压测量怎么做才准、ESP32-S3电池供电电量检测的坑在哪里、外接电源和电池供电自动切换电路的设计缺陷怎么发现、以及电压跳变问题如何影响ADC采集。如果你也在做低功耗电池供电的物联网设备,尤其是带电量检测功能的,这篇内容应该能帮你省下不少试错时间。
2. 续航问题的整体排查思路与方案选型
2.1 为什么不能一上来就换电池
很多人遇到续航短的第一反应是“电池不行了,换电池”。这个思路不能说错,但放在产品排查场景里,它是最容易掩盖真实问题的做法。我见过太多案例,换了低内阻的优质电池,续航确实延长了,但延长后的值依然远低于理论值,因为真正的耗电源头没解决。
排查续航问题的正确顺序应该是:先量化,再定位,最后优化。量化是指用仪器测出实际功耗曲线和电池放电曲线,定位是指找到异常耗电的环节,优化才是针对性地改硬件或改固件。跳过前两步直接优化,基本等于盲猜。
这个项目里,我第一步做的是用高精度电流表配合数据记录仪,连续记录设备在典型工作场景下的电流波形。典型场景包括:待机显示、温度采样、屏幕刷新、无线通信(如果有)、电量检测。记录周期覆盖完整的采样和刷新循环,至少记录24小时,才能看到真实的平均电流。
2.2 理论续航的计算方法
理论续航的计算其实很简单:
续航时间(小时)= 电池有效容量(mAh) / 设备平均电流(mA)
但这里的“电池有效容量”和“设备平均电流”都有讲究。电池有效容量不是标称容量,而是要考虑放电截止电压、温度、放电倍率后的实际可用容量。设备平均电流不是待机电流,而是加权平均,因为设备在不同工作模式下的电流差异可能达到几个数量级。
以这个温度计为例,标称电池是CR2477纽扣电池,标称容量1000mAh,但实际在常温下以微安级电流放电,有效容量大概在850到900mAh之间。如果标称续航12个月,那么平均电流应该是:
900mAh / (12 × 30 × 24) h ≈ 104 µA
也就是说,整个设备的平均电流必须控制在100微安左右。这个数字非常苛刻,意味着待机电流必须在几十微安级别,采样和刷新时的瞬时电流虽然可以高,但占空比必须极低。
实测下来,这台设备的平均电流是380µA左右,是目标值的近4倍。这就是续航缩水的直接原因。
2.3 排查工具的选择与配置
工欲善其事,必先利其器。这次排查我用到的核心工具包括:
- 高精度电流表:能测到微安级,最好带数据记录功能。我用的是六位半台式万用表配合数据采集软件,采样率1Hz,记录24小时。
- 电池内阻测试仪:用来测电池的直流内阻和交流内阻。没有专业内阻仪的话,可以用“开路短路全屏清零和单频清零”那种简易内阻仪,精度差一些但够用。
- 可编程直流电源:用来模拟电池供电,方便做电压扫描和功耗测试。
- 示波器:用来抓电压跳变、ADC采样时序、电源切换瞬间的波形。
- 温湿度试验箱:可选,用来做低温启动和高温放电测试。
工具选型的原则是:测电流要准,测电压要快,测内阻要稳。电流测量精度不够,几百微安和几十微安的差异就看不出来;电压测量带宽不够,电压跳变就抓不到;内阻测量不稳定,电池好坏的判断就会出错。
3. 核心细节解析与实操要点
3.1 电池内阻测试电路的设计与搭建
电池内阻是判断电池健康状态的核心参数。内阻变大,电池在放电时的端电压下降就更明显,设备可能提前触发低压保护而关机,实际可用容量大幅缩水。
测电池内阻的原理是:给电池施加一个已知的负载电流,测量端电压的变化,然后计算内阻:
R_internal = ΔV / ΔI
具体操作有两种方式:直流内阻法和交流内阻法。直流内阻法是用一个已知电阻作为负载,短时间接通,测量电压跌落;交流内阻法是给电池叠加一个交流信号,测量交流电压和电流的比值。
我自己搭的测试电路比较简单,用MOS管做开关,配合一个精密采样电阻和运放电压跟随器,具体结构如下:
- 电池正极接MOS管漏极,MOS管源极接采样电阻一端,采样电阻另一端接电池负极。
- MOS管栅极由MCU控制,产生短时脉冲(比如100ms导通,900ms关断)。
- 采样电阻两端接运放电压跟随器,输出到ADC。
- 电池端电压也接另一个电压跟随器,输出到ADC。
这里用电压跟随器的目的是提高输入阻抗,避免ADC采样时对被测电路造成负载效应。电压跟随器的输出阻抗极低,能驱动ADC的采样电容,保证采样精度。
实测时,我先用内阻仪测了几种不同品牌和批次的CR2477电池,内阻从十几欧姆到上百欧姆不等。内阻超过50欧姆的电池,在设备上的续航明显偏短。这就解释了为什么有些用户反馈续航特别短——他们可能买到了内阻偏大的电池。
注意:测内阻时,脉冲电流不能太大,否则会引起电池极化,测出的内阻偏大。一般建议脉冲电流在1mA到10mA之间,脉冲宽度不超过100ms。
3.2 电压测量与ADC采集的精度陷阱
电压测量看起来简单,实际上坑很多。这个项目里,电量检测用的是ESP32-S3内置的ADC,通过分压电阻采集电池电压。问题出在几个地方:
第一,分压电阻的阻值选择。为了降低待机功耗,分压电阻选得很大,比如1MΩ和1MΩ串联。但ESP32-S3的ADC输入阻抗不是无穷大,大概在几十kΩ到几百kΩ之间,这就会和分压电阻形成并联,导致分压比偏离设计值。实测发现,用1MΩ分压时,ADC读到的电压比实际电压低了将近15%。
第二,ADC的参考电压漂移。ESP32-S3的ADC参考电压不是精确的,而且随温度变化。用内部参考电压做绝对测量,误差可能达到±5%以上。解决方法是使用外部精密参考电压,或者用比例法测量——同时测量一个已知的参考电压和电池电压,通过比值计算电池电压。
第三,电压跳变问题。设备在屏幕刷新或无线通信时,瞬时电流增大,电池端电压会瞬间跌落,如果ADC采样时机不对,就会读到偏低的电压,导致电量显示跳变。解决方法是:在ADC采样前,先让设备进入低功耗状态,等电压稳定后再采样;或者用多次采样取中值的方式滤除跳变。
我最终的方案是:分压电阻改用100kΩ和100kΩ,配合一个0.1µF的滤波电容;ADC采样时连续采16次,去掉最大最小值后取平均;同时用外部3.0V精密参考电压做基准。这样改下来,电压测量误差从原来的±8%降到了±1%以内。
3.3 外接电源和电池供电自动切换电路的设计缺陷
这个温度计支持外接电源供电,同时内置电池作为备用。电源切换电路用的是两个肖特基二极管做“或”逻辑,外接电源和电池分别通过二极管汇合到系统电源轨。
这个电路看起来没问题,但实际上有一个隐藏的耗电路径:当外接电源存在时,系统电压比电池电压高,电池通过二极管反向漏电。肖特基二极管的反向漏电流虽然不大,一般在微安级,但对于平均电流只有100µA的系统来说,几微安的漏电就是几个百分点的续航损失。
更严重的是,当外接电源拔掉后,电池通过二极管供电,二极管的正向压降会导致电池电压被拉低0.3V左右。对于CR2477这种标称3V的电池,0.3V的压降意味着电池还没放到截止电压,系统就已经检测到低压了,实际可用容量大幅减少。
改进方案是改用MOS管理想二极管电路,用P沟道MOS管代替肖特基二极管,导通电阻只有几十毫欧,压降几乎为零。同时增加电源切换检测电路,当外接电源存在时,主动关断电池供电路径,彻底消除漏电。
3.4 ESP32-S3低功耗模式的配置要点
ESP32-S3的低功耗模式有好几种:Light-sleep、Deep-sleep、Hibernation。对于温度计这种应用,大部分时间应该处于Deep-sleep或Hibernation,定时唤醒采样和刷新。
我实测发现,Deep-sleep模式下,ESP32-S3的电流大概在10µA到20µA之间,取决于RTC外设的配置。如果开启了RTC Timer唤醒,电流会高一些;如果只用外部中断唤醒,电流可以更低。
配置低功耗模式时,有几个关键点:
- 关闭不用的外设时钟:比如Wi-Fi、蓝牙、ADC连续采样模式,不用就关掉。
- 配置GPIO状态:未使用的GPIO要设置为输入下拉或输出低,避免浮空输入导致漏电。
- RTC Timer的周期:温度采样不需要太频繁,5分钟一次足够了。每次唤醒后,采样、刷新、然后立刻回到Deep-sleep。
- 屏幕刷新策略:段码LCD的刷新功耗很低,但如果用点阵屏,刷新功耗就高了。可以考虑只在温度变化超过0.5度时才刷新屏幕。
改完低功耗配置后,待机电流从原来的200µA降到了25µA左右,效果非常明显。
4. 实操过程与核心环节实现
4.1 功耗基线测量:从24小时电流记录开始
排查的第一步是建立功耗基线。我把设备设置为正常工作模式,用高精度电流表记录24小时电流波形。记录数据导入电脑后,用脚本计算平均电流、峰值电流、以及各工作模式的占空比。
实测数据如下:
| 工作模式 | 电流 | 持续时间 | 占空比 |
|---|---|---|---|
| Deep-sleep | 25µA | 295s | 98.3% |
| 温度采样 | 8mA | 200ms | 0.07% |
| 屏幕刷新 | 3mA | 500ms | 0.17% |
| 电量检测 | 5mA | 100ms | 0.03% |
| 无线通信 | 120mA | 2s | 0.67% |
加权平均电流计算:
25×0.983 + 8000×0.0007 + 3000×0.0017 + 5000×0.0003 + 120000×0.0067 ≈ 24.6 + 5.6 + 5.1 + 1.5 + 804 ≈ 841µA
等等,这个计算明显不对。无线通信的占空比0.67%乘以120mA,贡献了804µA,这太大了。实际上,这个温度计并没有无线通信功能,我记录的数据里也没有无线通信模式。重新检查后发现,那个120mA的峰值是屏幕背光(如果有)或者某个瞬态电流,不是无线通信。
修正后的数据:
| 工作模式 | 电流 | 持续时间 | 占空比 |
|---|---|---|---|
| Deep-sleep | 25µA | 295s | 98.3% |
| 温度采样 | 8mA | 200ms | 0.07% |
| 屏幕刷新 | 3mA | 500ms | 0.17% |
| 电量检测 | 5mA | 100ms | 0.03% |
加权平均电流:
25×0.983 + 8000×0.0007 + 3000×0.0017 + 5000×0.0003 ≈ 24.6 + 5.6 + 5.1 + 1.5 ≈ 36.8µA
这个结果和实测的380µA差了一个数量级。说明还有别的耗电环节没被记录到。后来用示波器抓电流波形,发现每次唤醒后,有一个持续约50ms的100mA电流脉冲,这是ESP32-S3启动时的浪涌电流。虽然时间短,但每次唤醒都有,累积起来就很可观。
重新计算,加入启动浪涌:
启动浪涌:100mA × 50ms = 5mAs,每次唤醒一次,唤醒周期300s,平均电流贡献 = 5mAs / 300s ≈ 16.7µA
加上之前的36.8µA,总共约53.5µA。还是不到380µA。继续排查,发现屏幕刷新时,段码LCD的驱动电路有一个持续的偏置电流,大约50µA,这个电流在Deep-sleep时也存在。另外,电池分压电阻的漏电流大约30µA。这些加起来,差不多就到380µA了。
4.2 电池内阻测试实操:从开路短路清零到单频清零
电池内阻测试我用了两种方法交叉验证。第一种是简易内阻仪,支持“开路短路全屏清零”和“单频清零”两种模式。开路短路清零是先测开路电压,再测短路电流,然后计算内阻;单频清零是给电池加一个固定频率的交流信号,测交流阻抗。
实测数据:
| 电池品牌 | 开路电压 | 短路电流 | 计算内阻 | 单频内阻 |
|---|---|---|---|---|
| A品牌 | 3.02V | 45mA | 67Ω | 62Ω |
| B品牌 | 3.01V | 80mA | 37.6Ω | 35Ω |
| C品牌 | 2.98V | 30mA | 99Ω | 95Ω |
内阻最小的B品牌,在设备上的续航明显最长。C品牌内阻最大,续航最短。这就验证了内阻对续航的影响。
注意:短路电流测试时间要极短,否则会损坏电池。一般建议不超过10ms。
4.3 电源切换电路的改造与验证
原电路的肖特基二极管方案,实测电池供电路径的压降是0.32V,反向漏电流是3.5µA。改用MOS管理想二极管后,压降降到0.02V,反向漏电流降到0.1µA以下。
改造后的电路:
- 外接电源通过一个P沟道MOS管连接到系统电源轨,栅极由外接电源检测电路控制。
- 电池通过另一个P沟道MOS管连接到系统电源轨,栅极由电池供电路径控制。
- 两个MOS管的栅极互锁,确保同一时间只有一个导通。
实测验证:外接电源存在时,电池供电路径完全关断,系统电流全部来自外接电源;外接电源拔掉后,电池供电路径自动导通,切换时间小于1ms,系统不断电。
4.4 固件低功耗优化的具体配置
固件层面的优化主要包括:
- Deep-sleep配置:使用
esp_deep_sleep_start(),唤醒源配置为RTC Timer,唤醒周期300s。 - GPIO配置:所有未使用的GPIO设置为
GPIO_MODE_INPUT并启用下拉,或者设置为GPIO_MODE_OUTPUT并输出低电平。 - ADC配置:ADC采样完成后立即关闭ADC电源,避免持续耗电。
- 屏幕驱动:段码LCD的偏置电压由内部电荷泵产生,Deep-sleep时关闭电荷泵,屏幕内容保持(段码LCD是双稳态的,断电后内容不丢失)。
- 电量检测:电量检测不需要每次唤醒都做,可以每10次唤醒做一次,降低平均功耗。
优化后的实测平均电流:从380µA降到了95µA,接近理论目标值104µA。续航从2到3个月延长到了10到11个月,基本达到标称值。
5. 常见问题与排查技巧实录
5.1 电压跳变导致ADC读数不稳怎么办
电压跳变是电池供电设备最常见的问题之一。表现是ADC读到的电压忽高忽低,电量显示跳变,甚至误触发低压保护。
排查思路:
- 先用示波器抓电池端电压波形,看跳变的幅度和频率。
- 如果跳变发生在屏幕刷新或采样瞬间,说明是负载瞬态引起的,需要在ADC采样前让系统进入低功耗状态,等电压稳定后再采样。
- 如果跳变是随机的,可能是电池接触不良或PCB走线阻抗过大,需要检查电池座和走线。
- 如果跳变是周期性的,可能是某个外设周期性工作引起的,需要逐个关闭外设排查。
解决技巧:
- ADC采样前加一个延时,比如10ms,等电压稳定。
- 多次采样取中值或平均值,滤除随机跳变。
- 在电池端并联一个100µF的电解电容和一个0.1µF的陶瓷电容,吸收瞬态电流。
5.2 电池低温启动失败怎么排查
低温环境下,电池内阻增大,端电压下降,设备可能无法启动。这个项目里,有用户反馈冬天室外使用时,温度计经常黑屏。
排查方法:
- 把设备放入低温试验箱,从25度逐步降到-20度,记录启动成功率。
- 用内阻仪测低温下的电池内阻,和内阻常温值对比。
- 检查设备的低压保护阈值,如果阈值设得太高,低温下就容易误触发。
解决技巧:
- 降低低压保护阈值,比如从2.5V降到2.2V。
- 在电池端并联一个大电容,提供启动瞬间的浪涌电流。
- 如果可能,改用低温性能更好的电池,比如锂铁电池。
5.3 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 续航远低于标称 | 平均电流过大 | 24小时电流记录 | 优化低功耗配置 |
| 电量显示跳变 | ADC采样时机不对 | 示波器抓电压波形 | 采样前延时,多次采样 |
| 电池不耐用 | 电池内阻大 | 内阻仪测试 | 更换低内阻电池 |
| 外接电源拔掉后关机 | 切换电路压降大 | 测切换瞬间电压 | 改用MOS管理想二极管 |
| 低温下无法启动 | 电池内阻增大 | 低温试验箱测试 | 降低低压阈值,并联电容 |
| 待机电流偏大 | GPIO漏电或外设未关 | 逐个关闭外设排查 | 配置GPIO状态,关闭外设时钟 |
5.4 独家避坑技巧
技巧一:用“电流指纹”快速定位耗电环节。每个外设的工作电流波形都有特征,比如屏幕刷新是一个短促的脉冲,传感器采样是一个稍长的脉冲,无线通信是一个更长的脉冲。用示波器抓电流波形,根据脉冲的形状和时序,就能快速判断是哪个外设在耗电。
技巧二:分压电阻不要选太大。虽然大阻值分压电阻能降低漏电流,但会和ADC输入阻抗形成并联,导致测量误差。一般建议分压电阻在100kΩ到500kΩ之间,配合电压跟随器使用。
技巧三:电池内阻测试要定期做。不同批次的电池内阻可能差异很大,来料检验时就应该测内阻,把内阻超过阈值的电池筛掉。这个项目里,就是因为来料检验没测内阻,导致一批高内阻电池流入产线,引发了大量续航投诉。
技巧四:低功耗配置要实测验证。数据手册上的低功耗电流是在特定条件下测的,实际配置不同,电流可能差很多。一定要用高精度电流表实测,不要相信理论值。
技巧五:电源切换电路要测反向漏电。肖特基二极管的反向漏电在微安级,对于低功耗设备来说不可忽略。改用MOS管理想二极管后,反向漏电可以降到纳安级。
6. 写在最后
这个项目排查下来,最大的体会是:低功耗设备的续航问题,从来不是单一因素造成的。电池内阻、电源切换电路、ADC采集精度、低功耗配置、甚至PCB布局,任何一个环节的疏忽,都会在续航上体现出来。而且这些问题往往是叠加的,单独解决一个,效果不明显,只有全部解决,才能达到预期。
另外,工具和方法的正确性至关重要。没有高精度电流表,就看不到微安级的漏电;没有内阻仪,就判断不了电池的好坏;没有示波器,就抓不到电压跳变。排查续航问题,本质上是一个“量化-定位-优化”的循环,量化越准确,定位越快速,优化越有效。
最后分享一个小技巧:如果你手头没有专业的内阻仪,可以用一个已知阻值的电阻和万用表,粗略估算电池内阻。方法是:先测电池开路电压V1,然后接上负载电阻R,测负载两端电压V2,内阻约等于:
R_internal ≈ R × (V1 - V2) / V2
这个方法精度不高,但用来快速筛选电池够用了。我在现场排查时经常用这招,比等内阻仪到货快多了。