同一块 5000mAh 电池,25℃ 刷视频能撑到表显 5.7% 才关机;0℃ 户外、1.2A 负载下,表显 18.7% 就黑屏。
差的不是那 13 个百分点,是内阻在低温下多吃掉的那 0.1V 端电压。
我把这套关系做成了一个可拖动的网页实验室,四组场景跑完,关机点从 5.7% 拉到 18.7%。

一、为什么值得看:电量百分比不是油量表
手机显示的不是油箱刻度。
它靠库仑计累计电流,再用开路电压做校正。
问题出在曲线尾部:20% 对应 3.62V,10% 只有 3.55V,0% 是 3.30V。
电压只差 0.07V,表显却差 10 个百分点。
带上负载后,端电压还要再减 I×R。
温度越低、电池越老,R 越大,端电压越早跌破保护阈值。
于是表显还有 18.7%,电芯其实已经放不出可用电压。
二、为什么我把这件事做成网页
口头解释很容易,拖动滑块看曲线怎么塌下去更直观。
我想回答三个问题:温度影响多大、老化影响多大、高负载影响多大。
这三个变量单独看都不难,叠在一起就容易把原因说错。
网页把开路电压曲线、端电压曲线和 3.40V 阈值画在同一张图上,关机点直接标出来。
码道有三种使用方式:WebUI(浏览器对话)、TUI(终端命令行)和桌面 IDE(IDE 插件)。本文用 WebUI 版。
三、这轮码道实际做了什么
我给码道的需求是一句话:做一个单文件手机电池实验室,能调温度、负载和健康度,实时画出端电压曲线。
它交付了一个 1165 行的 index.html,没有外部 CDN、字体和图片。
左侧是手机模型,右侧是 canvas 曲线,下面是四个场景卡片和对照表。
所有数字来自同一套函数,表格、卡片和曲线不会各算各的。

模型一共五行:
scss
容量 = 5000mAh × 健康度
OCV(SOC) = 12 点表线性插值
V端 = OCV(SOC) - I × R
R = 0.08Ω × 温度系数 × 健康系数
关机阈值 = 3.40V
内阻基准取 25℃、健康 100% 时的 0.08Ω。
0℃ 乘 2.2,-10℃ 乘 3.2,40℃ 乘 0.85。
健康度 80% 再乘 1.8,容量同时按 4000mAh 算。
四、四组场景跑出来的关机点
四组参数共用一块 5000mAh 电芯,结果都来自页面里的同一个计算函数。
| 场景 | 温度 | 负载 | 内阻 | 关机表显 SOC | 关机时剩余容量 | 预计时长 |
|---|---|---|---|---|---|---|
| A 常温刷视频 | 25℃ | 0.8A | 0.080Ω | 5.7% | 285mAh | 5 小时 54 分 |
| B 冬天户外 | 0℃ | 1.2A | 0.176Ω | 18.7% | 937mAh | 3 小时 23 分 |
| C 两年老电池 | 25℃ | 1.2A | 0.144Ω | 13.2% | 530mAh | 2 小时 54 分 |
| D 高负载游戏 | 35℃ | 2.5A | 0.072Ω | 14.3% | 714mAh | 1 小时 43 分 |
常温刷视频,端电压到 3.40V 时表显还剩 5.7%,对应 285mAh。
冬天户外,内阻从 0.080Ω 涨到 0.176Ω,关机点推到 18.7%,剩余 937mAh。
两年老电池,容量掉到 4000mAh,内阻 0.144Ω,关机点 13.2%。
高负载游戏,2.5A 把压降拉到 0.18V,关机点 14.3%。

注意 B 组剩余容量反而最多。
不是电芯没电,是端电压先扛不住了。
五、验证与踩坑:12 项断言和一次阈值修正
页面底部有 12 条断言,打开就自动跑。
12/12 全部通过。
第 10 条最能说明问题:关机瞬间端电压 3.400V,开路电压还有 3.611V。
也就是说,触发关机的是带载后的端电压,不是静态开路电压。
第一版我用的是 3.30V 阈值。
跑出来四组关机点是 2.1%、8.1%、6.1%、6.5%,和"20% 关机"的现象对不上。
查了一遍,3.30V 更接近电芯保护阈值,手机在负载下通常按 3.4~3.5V 截止。
把阈值改到 3.40V 后,B 组变成 18.7%,C、D 组 13%~14%,曲线和现象一致。
这次修正也暴露了一个事实:模型参数差 0.1V,结论会差十几个百分点。
另一个小问题是图表标签重叠。
3.40V 阈值文字压在关机预测点上,我把阈值标签挪到右侧,预测标签挪到点下方。
这类问题不影响计算,但截图里一眼就能看见。

失败路径也留了一个入口。
点"边界测试"会用 -25℃ 触发参数校验,页面弹出"参数超出模型适用范围,请检查后重试",并保留上一次有效参数。
非法容量、负载大于 6A、温度越界都会走同一条回退逻辑。

边界也要说清楚。
这是一个参数模型,不是对某台具体手机的实测。
开路电压表和内阻系数取的是常见锂离子电芯范围,真实机型还会有电量计算法、老化历史和保护板差异。
它能解释趋势,不能拿来给一台手机判健康度。
六、本地复现
整页只有一个 index.html。
在文件所在目录起一个静态服务:
yaml
python -m http.server 8080
浏览器打开 http://localhost:8080/index.html 就能跑。
五张截图都是 1920×1080,分别是常温、冬天、老化对照表、高负载和错误路径。
案例和源码放在公开仓库:gitcode.com/OPCTeam/dem...
打开后直接点场景卡片,不需要装依赖。
七、使用码道体会
这次最省事的是布局和交互。
一句话需求,码道把手机模型、canvas 曲线、滑块、卡片和表格都搭齐了。
需要我补的是物理参数和验收。
3.30V 到 3.40V 这一改,模型才和现象对上。
如果只看着页面"能跑"就发,数据会自相矛盾。
我的用法是:让码道做界面和计算骨架,自己盯住参数、断言和失败路径。
下一页想加的是电量计估算误差,把"表显 SOC"和"真实 SOC"分开画。
那一步更接近手机里的实际算法。
八、准备环境:进入码道 Web
浏览器打开码道 Web 版:devcloud.cn-north-4.huaweicloud.com/chat?source...
登录后就能在对话窗口输入需求,不需要装软件。
本文的页面就是用这条入口生成的。