ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ESP32-S3温度计续航从两周到两个半月:电池内阻与ADC电压检测排查实录

ESP32-S3温度计续航从两周到两个半月:电池内阻与ADC电压检测排查实录 1. 从一块“短命”的温度计说起智能温度计这个品类看起来简单做起来坑不少。我手上这台设备用的是 ESP32-S3 做主控锂电池供电标称续航三个月结果实测两周就趴窝。用户反馈集中在“刚换的电池没几天就提示低电量”“放在冰箱旁边一晚上掉电 30%”“充电一晚上第二天还是红灯”。这些问题表面上看是电池不行实际上牵扯到电池内阻、电压检测电路、ADC 采样精度、电源切换逻辑一整条链路。我花了大概三周时间把这台温度计的续航问题从头到尾扒了一遍。过程中用到了内阻仪、示波器、可调电源、电子负载也重新设计了电压检测电路和固件里的电量算法。最终把待机电流从 1.8mA 压到了 180μA续航从两周拉到了两个半月。这篇文章就是整个排查过程的完整记录包括我怎么定位问题、怎么设计测试电路、怎么改固件、以及踩过的那些坑。如果你也在做低功耗电池供电的物联网设备尤其是带 ADC 电压检测的这篇内容应该能帮你省下不少试错时间。不管你是刚入行的嵌入式新手还是做过几款电池产品的老手里面关于内阻测试、电压跟随器、电源自动切换、ADC 校准的细节都值得一看。2. 续航问题的整体排查思路2.1 先搞清楚“续航差”到底差在哪很多人一遇到续航问题就想着换大电池这是最粗暴也最没效率的做法。我习惯先把问题拆成三个独立的方向电池本身、功耗、电量计量。这三者任何一个出问题表现都是“续航短”但排查路径完全不同。电池本身的问题包括容量衰减、内阻增大、低温性能差、自放电高。功耗问题包括待机电流大、外设漏电、电源切换电路静态损耗。电量计量问题包括 ADC 采样不准、分压电阻选型不当、电量算法过于线性。我这次遇到的是三者叠加电池内阻偏大导致带载电压跌落ADC 分压电阻太小导致持续漏电电量算法用开路电压查表法在带载时完全失准。排查顺序建议先测电池再测功耗最后查计量。因为电池和功耗是“物理层”问题计量是“信息层”问题。物理层没搞对信息层怎么调都是错的。2.2 为什么不能只靠“换电池”解决热搜词里有个“换电池”这确实是用户最直接的反应。但在我这个案例里换新电池只能好三天。原因是电路本身的静态漏电和 ADC 采样策略有问题新电池的内阻小带载压降不明显所以前几天看起来正常。等电池放电到 3.6V 左右内阻带来的压降开始显现ADC 读到的电压比实际开路电压低 100mV 以上固件就误判为低电量提前关机。这里涉及一个关键概念电池的等效电路模型。一个真实的锂电池可以近似看成理想电压源串联一个内阻 R_int再并联一个自放电电阻 R_self。负载电流 I 流过时端电压 V_terminal V_ocv - I × R_int。当 R_int 从 50mΩ 涨到 300mΩ同样的 200mA 脉冲电流会产生 60mV 的额外压降。对于 3.6V 的电池来说这 60mV 直接让电量估算偏移 10% 以上。2.3 排查工具清单与选型理由我这次用到的工具如下表选型理由也一并列出方便你按需配置。工具型号/规格用途选型理由电池内阻仪交流注入式1kHz测电池内阻直流内阻测试需要大电流交流法对电池无损可调电源0-30V/5A模拟电池供电排除电池变量单独测电路功耗电子负载可编程恒流模拟不同负载测试带载压降和内阻关系示波器100MHz 带宽看电压跳变捕捉 ADC 采样瞬间的电压波动万用表6位半精密电压测量校准 ADC 基准电流表μA 级测待机电流普通万用表 μA 档精度不够内阻仪我用的是一款支持开路清零和短路清零的机型。这里有个细节开路清零是消除测试线本身的分布电容影响短路清零是消除线阻影响。两种清零方式要配合使用只做一种会导致内阻读数偏差 10-20mΩ。热搜词里提到的“art1605 内阻仪两种开路短路全屏清零和单频清零怎么调”说的就是这个操作。我的做法是先短路表笔做短路清零再开路做开路清零然后立即测电池中间不要换线。3. 电池内阻与电压检测的深度拆解3.1 电池内阻到底怎么影响续航判断锂电池的内阻不是常数它随温度、SOC、放电电流频率变化。在 25°C、50% SOC 时一颗 18650 的内阻大约 40-60mΩ。到了 0°C内阻可能翻倍到 100mΩ 以上。到了 -10°C内阻 200mΩ 起步。这就是为什么“放在冰箱旁边一晚上掉电 30%”——低温下内阻增大带载压降变大ADC 读到的电压骤降固件以为电池快没电了于是频繁唤醒、频繁报警反而加速了耗电。我实测了一组数据同一颗电池25°C 时开路电压 3.85V带 200mA 负载时端电压 3.83V压降 20mV。放到 -5°C 环境两小时后开路电压还是 3.85V但带载端电压掉到 3.72V压降 130mV。这 130mV 在 3.7V 附近就是 15% 的电量误差。固件如果按 3.72V 查表会认为电量只剩 20%实际还有 50%。所以电量计量的第一步不是改算法而是区分开路电压和带载电压。带载电压必须做内阻补偿否则低温下必然误判。3.2 电压检测电路的常见设计缺陷我拆开这台温度计发现电压检测用的是最简单的电阻分压两个 100kΩ 电阻串联中点接 ESP32-S3 的 ADC 引脚。这个设计有三个问题。第一100kΩ 分压电阻在 4.2V 时产生 21μA 的持续漏电。听起来不大但设备待机电流目标只有 180μA这 21μA 占了 12%。第二ESP32-S3 的 ADC 输入阻抗不是无穷大在采样瞬间会从分压中点抽取电流导致采样值偏低。第三分压比是 1:24.2V 电池电压分压后是 2.1V而 ESP32-S3 的 ADC 参考电压是 3.3V只用了 64% 的量程分辨率浪费了。正确的做法是用电压跟随器做阻抗隔离。运放接成电压跟随器输入接分压中点输出接 ADC。运放的输入阻抗极高MΩ 级不会影响分压比输出阻抗极低能驱动 ADC 的采样电容。同时把分压电阻加大到 1MΩ漏电降到 2.1μA。分压比改成 1:1.54.2V 分压后 2.8V用满 ADC 量程的 85%。3.3 电源自动切换电路对续航的隐性影响这台设备支持 USB 供电和电池供电自动切换。原设计用的是两个肖特基二极管做 ORingUSB 在时二极管截止电池通过另一个二极管供电。问题在于肖特基二极管有 0.3V 正向压降电池 3.7V 经过二极管后只剩 3.4VLDO 再降到 3.3V压差只有 0.1VLDO 进入压差临界区静态电流从 1μA 飙升到 50μA。更麻烦的是切换瞬间的电压跳变。USB 插入时USB 电压通过二极管瞬间拉高 LDO 输入但电池支路的二极管还没完全截止两个电源短暂并联产生环流。这个环流在电池内阻上产生压降ADC 采样到电压跳变固件误触发低电量中断。我后来改用理想二极管电路用 P 沟道 MOSFET 代替肖特基。MOSFET 导通电阻只有 20mΩ压降几乎为零。配合一个比较器做电源优先级判断USB 在时关断电池支路USB 不在时导通电池支路。切换时间控制在 1ms 以内ADC 采样避开这个窗口。4. 实操过程与核心环节实现4.1 电池内阻测试与筛选第一步是把电池从设备上拆下来单独测内阻。我用交流注入法1kHz 正弦波幅度 10mA。测试前先做短路清零和开路清零。具体操作短路表笔按“短路清零”等读数归零然后开路表笔按“开路清零”等读数稳定。两次清零后立即测电池避免表笔位置变化引入误差。测试结果三颗同型号电池内阻分别是 48mΩ、52mΩ、210mΩ。第三颗明显异常内阻是前两颗的 4 倍。这颗电池就是用户反馈“换上去没几天就没电”的元凶。内阻大导致带载压降大固件误判低电量。我把这颗电池淘汰用前两颗做后续测试。内阻筛选标准同批次电池内阻差异超过 30% 就要警惕。超过 50% 直接淘汰。不要试图用“激活”或“充放电循环”来修复高内阻电池内阻增大通常是不可逆的化学老化。4.2 待机功耗的分项测量电池问题排除后我用可调电源代替电池输出 3.7V串联 μA 电流表测整机电流。测得待机电流 1.8mA远超预期的 200μA。接下来做分项排查断开温度传感器电流降到 1.7mA断开显示屏降到 1.2mA断开 ADC 分压电阻降到 0.9mA断开 LDO降到 0.3mA。逐项定位后发现显示屏背光漏电 500μAADC 分压电阻漏电 21μALDO 静态电流 50μA剩下的 700μA 是 ESP32-S3 在 light sleep 模式下的唤醒频率过高。固件里温度采样间隔设的是 1 秒每次唤醒运行 20ms平均电流就是 20ms/1s × 40mA 800μA。把采样间隔改成 10 秒平均电流降到 80μA。最终待机电流构成ESP32-S3 平均 80μALDO 50μAADC 分压 2.1μA其他漏电 48μA合计 180μA。按 2000mAh 电池计算理论待机时间 2000mAh / 0.18mA ≈ 11111 小时 ≈ 463 天。实际考虑自放电和温度影响两个半月是合理预期。4.3 电压检测电路的重新设计原分压电路是 100kΩ 100kΩ我改成 1MΩ 1.5MΩ分压比 1:1.5。中点接运放电压跟随器运放选的是轨到轨输入输出、静态电流 10μA 的型号。运放输出接 ESP32-S3 的 ADC1_CH0。这里有个细节ESP32-S3 的 ADC 参考电压内部是 1.1V但可以通过衰减器设置量程。我设置的是 11dB 衰减满量程约 3.3V。分压后 2.8V 对应电池 4.2V留了 0.5V 余量。ADC 读数公式V_bat ADC_raw / 4095 × 3.3 × 1.5。实际校准用 6 位半万用表测电池电压同时读 ADC_raw做两点校准。校准数据电池 4.20V 时 ADC_raw 3470电池 3.30V 时 ADC_raw 2725。线性拟合后得到 V_bat ADC_raw × 0.00121 0.00。这个系数写进固件实测误差小于 10mV。4.4 固件电量算法的改进原固件用的是开路电压查表法ADC 读电压查表得电量。问题在于带载时电压偏低查表结果偏小。我改成带内阻补偿的电压查表法。具体做法每次 ADC 采样时同时记录当前负载状态。如果设备处于唤醒状态负载电流约 40mA根据电池内阻出厂标定值 50mΩ补偿 2mV。如果处于温度传感器加热状态负载电流 200mA补偿 10mV。补偿后的电压再查表。更关键的是低温补偿。我加了一个温度传感器读环境温度当温度低于 10°C 时内阻补偿系数从 50mΩ 逐步增加到 200mΩ。补偿公式R_int 50mΩ × (1 0.05 × (25 - T))T 为摄氏度。这样在 -5°C 时R_int 50 × (1 0.05 × 30) 125mΩ200mA 负载补偿 25mV基本抵消了低温压降。这个补偿公式是经验公式不同电池型号系数不同。建议你在自己的设备上做低温放电曲线拟合出适合的系数。不要直接抄我的数字。5. 常见问题与排查技巧实录5.1 电压跳变导致 ADC 读数不稳现象ADC 读数在 ±50mV 范围内跳动电量显示忽高忽低。排查发现是电源切换瞬间的电压跳变。USB 插入时MOSFET 切换产生 100mV 的尖峰持续 500μs。ADC 采样周期是 100μs正好采到尖峰。解决方法在固件里加一个采样窗口避让。检测到 USB 插入中断后延迟 2ms 再启动 ADC 采样。同时在硬件上MOSFET 栅极加 100nF 电容把切换时间从 100μs 拉长到 1ms尖峰幅度降到 20mV。5.2 内阻仪读数偏差大现象同一颗电池连续测三次内阻读数分别是 48mΩ、62mΩ、55mΩ。排查发现是表笔接触电阻不稳定。电池正负极有氧化层表笔压力不够。解决方法用细砂纸打磨电池电极表笔改用弹簧针。每次测试前做短路清零。测试时保持表笔垂直、压力一致。改进后三次读数分别是 50mΩ、51mΩ、50mΩ一致性大幅提升。5.3 低温下电量显示骤降现象设备从 25°C 移到 -5°C 环境电量显示从 80% 掉到 30%。这是典型的低温内阻增大导致的误判。解决方法加温度补偿同时把电量算法从“瞬时电压查表”改成“滑动平均电压查表”。滑动窗口 10 个采样点去掉最大最小值后取平均。这样单次电压跳变不会立即影响电量显示。改进后-5°C 环境下电量显示从 80% 缓慢降到 65%符合实际放电曲线。5.4 常见问题速查表现象可能原因排查方法解决措施续航短换电池无效电路静态漏电大可调电源串 μA 表测待机电流加大分压电阻换低静态 LDO电量显示跳变ADC 采样受干扰示波器看 ADC 引脚波形加 RC 滤波避让切换窗口低温电量骤降内阻增大未补偿低温下测带载压降加温度补偿系数内阻读数不稳表笔接触不良重复测同一电池打磨电极弹簧针短路清零充电一晚上红灯充电 IC 误判测充电电流和电池电压检查充电 IC 温度补偿电池并联环流并联电池电压不一致测并联前各电池电压并联前均衡到 10mV 以内5.5 几个容易被忽略的细节第一个细节ADC 引脚在 ESP32-S3 上不是所有通道都支持 11dB 衰减。我一开始用了 ADC2_CH0发现满量程只有 2.5V后来换到 ADC1_CH0 才正常。选通道前一定要查数据手册的衰减器对应表。第二个细节电压跟随器的运放要选输入偏置电流小的型号。我一开始用了一颗通用运放输入偏置电流 100nA在 1MΩ 分压电阻上产生 100mV 误差。换成偏置电流 1pA 的 CMOS 运放后误差降到 1mV 以下。第三个细节电池内阻测试要在同一温度、同一 SOC下对比。不同 SOC 下内阻差异可达 20%。我一般选 50% SOC 作为标准测试点。第四个细节固件里的电量查表要留滞回区间。比如 20% 电量对应 3.55V如果没滞回电压在 3.55V 附近波动时电量会在 19% 和 21% 之间反复跳。加 50mV 滞回后3.55V 以下才显示 20%3.60V 以上才回到 21%。6. 写在最后的一些实操体会这台温度计的续航问题从表面看是电池不行实际上是电池内阻、电路漏电、ADC 采样、固件算法四个层面的问题叠加。单独解决任何一个续航都只能改善一点。四个一起改才从两周拉到两个半月。我最大的体会是不要相信“标称续航”。厂商标称三个月通常是在 25°C、理想负载、不开显示屏的条件下测的。实际使用中温度变化、负载波动、电池老化都会让续航打对折。做产品定义时标称续航至少要打七折留足余量。另外内阻测试应该成为电池来料检验的常规项目。我这次遇到的高内阻电池如果来料时抽检内阻直接就能拦下来。内阻仪不贵几百块就能买到够用的。比起后期返修和用户投诉这笔投入非常划算。最后分享一个小技巧如果你没有内阻仪可以用可调负载 万用表粗略估算内阻。先测开路电压 V1然后接一个已知负载 R测端电压 V2内阻 R_int ≈ (V1 - V2) / (V2 / R)。比如 V14.0VR10ΩV23.9V则 R_int ≈ 0.1V / 0.39A ≈ 256mΩ。这个方法精度不如内阻仪但足够判断电池好坏。
返回列表