从功能表面看,耳机电量更新并不复杂:ADC 采到电池电压,再查表换算成百分比,手机就能显示。
但在实际项目中,电量更新并不是采样后直接查表:采样值要先经过滤波,查表得到的也只是参考电量,手机最终显示的还要由软件继续维护。先把实际电压、参考电量和显示电量这三个值分清楚,整条链路就容易理解了。
先看完整链路:前 3 步把采样值处理成参考电量,后 3 步由软件维护显示值、完成双耳同步,最后上报手机。

电池电压是怎么采出来的?
顺着中科蓝讯 SDK 的调用关系看,系统会在 5ms 任务中检查 ADC 转换状态。转换完成后,读取电池通道和内部参考通道的 ADC 值。
内部参考电压的已知值用于校准换算比例,再结合电池采样值和分压系数,得到实际电池电压
为什么采到电压后还不能直接使用?
播放音乐或者蓝牙发射时,电池电压会短暂下降,负载变小后又会回升,所以一次采样不能直接拿来估算电量。
结合耳机电压变化缓慢、但采样又容易受负载影响的特点,我更推荐用递推平均的方式更新电压:每来一个新采样值,只让平均电压向它靠近一小步。平均电压变化达到条件后,才更新稳定电压。下降条件更容易触发,上升条件更严格,可以减少电压回弹的影响。
参考电量为什么不直接给手机?
稳定电压通过“电压—电量对照表”换算成参考电量。它只用来判断当前显示偏高还是偏低,不是手机最终看到的电量。
如果每次都用参考电量覆盖显示电量,负载变化仍然会造成百分比跳变。
显示电量是怎么变化的?
电量管理任务大约每 10 秒运行一次,并根据当前状态选择更新方式。
放电时,参考电量低于显示电量,软件就让显示电量逐级下降,不会一次跳到参考值;电压短暂回升时,也不会把电量加回来。
充电时,电压回升很快,不能直接用它增加百分比。软件根据充电电流和时间估算充入容量,再换算成显示电量;底层确认充满后,才显示 100%。
温度决定当前能不能充电、使用多大的充电电流。低电提醒主要看显示电量,低压关机最终看实际电压。
为什么内部电量和手机显示还可能不同?
显示电量发生变化后会被保存,耳机下次开机可以从上次的结果继续计算。耳机内部按 1% 维护电量,当前 App 路径按 5% 一档显示。
例如内部电量是 59%,手机仍然显示 60%;内部电量下降到 55% 后,手机才显示 55%。
左右耳电量最后由谁上报?
左右耳各自计算本耳电量,再通过 TWS 交换耳机和充电盒电量。主耳汇总左耳、右耳和充电盒数据后,统一上报给手机系统和配套 App。
现在再看这条链路,重点就是分清三份数据:实际电压反映电池状态,参考电量判断变化方向,显示电量负责最终呈现。

215

被折叠的 条评论
为什么被折叠?



