尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP32-S3低功耗续航排查:电池内阻、ADC采集与电源切换电路优化实战

ESP32-S3低功耗续航排查:电池内阻、ADC采集与电源切换电路优化实战 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-sleep25µA295s98.3%温度采样8mA200ms0.07%屏幕刷新3mA500ms0.17%电量检测5mA100ms0.03%无线通信120mA2s0.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-sleep25µA295s98.3%温度采样8mA200ms0.07%屏幕刷新3mA500ms0.17%电量检测5mA100ms0.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.02V45mA67Ω62ΩB品牌3.01V80mA37.6Ω35ΩC品牌2.98V30mA99Ω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这个方法精度不高但用来快速筛选电池够用了。我在现场排查时经常用这招比等内阻仪到货快多了。
返回列表