进阶¶
进阶篇重点介绍电池管理服务,便于用户自主修改扩展。内容包括:电池管理服务框架,程序流程,电量服务算法优化,NTC温度计算
1. 电池管理服务¶
1.1 框架¶
电池管理服务大致包括充电,电量采集,温度采集三个部分。框架示意图如下:
1.2 单核(52x)流程¶
单核平台涉及到以下三个方面的管理:
电池电量检测管理
初始化:通过
INIT_PREV_EXPORT(battery_voltage_detection_init())隐式调用初始化函数,开机自动执行。
运行机制:定时器以
BAT_DETECT_INTERVAL为周期(单位:秒)释放信号量,触发线程charger_thread执行。调用
battery_voltage_detection()采集原始电压;若检测到充电器插入(
BAT_CHARGING_PLUG_IN),延迟 300ms 等待 ADC 稳定后,执行battery_temp_detection()采集温度;
电池充电管理
初始化:
battery_charger_init()通过INIT_COMPONENT_EXPORT注册为组件,开机自动初始化
消息通信
单核管理而言应用与驱动同属 HCPU,,但为了统一架构,因此虚拟了一个LCPU实现。
1.3 双核流程¶
电池管理服务双核管理一般在55x/56x/58x平台。
HCPU负责电量应用,充电检测,开机低电量检测;
LCPU负责电量检测。
任务分工与初始化¶
模块 |
LCPU(低功耗核) |
HCPU(主核) |
|---|---|---|
电池电量检测 |
负责周期性采集(核心任务) |
负责电量数据应用(如UI显示)无直接初始化,依赖LCPU数据上报 |
充电检测 |
无相关任务 |
负责充电器插入/拔出、充满等中断检测 |
消息管理 |
隐式初始化:通过 |
显式调用: |
核间通讯机制¶
LCPU采集电压、温度等数据后,通过data service将数据同步至HCPU;HCPU接收数据后更新UI界面,并在充电状态变化(如插入充电器)时触发中断响应,实现“低功耗采集”与“实时交互”的平衡。
具体代码位置¶
2. 电量服务算法优化¶
ADC采集的原始电压存在波动与误差,系统通过“三级处理”实现高精度电量计算,核心流程为:原始电压采集→滤波优化→百分比转换。
2.1 电压值平滑处理¶
针对电压高频波动,采用“8次滑动平均”算法,对最近8个原始电压值求平均,实现“削峰填谷”。核心代码逻辑如下:
2.2 相邻电压加权平均处理¶
针对电压突变(如充电瞬间波动),采用 “8:2 加权平均” 算法,赋予历史值更高权重,平滑突变数据。核心代码:
2.3 无效电池电压值过滤¶
若当前电压与上一次差值超过阈值(BAT_CHARGE_FILTER/BAT_DISCHARGE_FILTER),判定为无效值,沿用历史值并累计过滤次数;若连续多次无效,则更新历史值,避免异常数据影响精度。
2.4 电压转换成电量百分比曲线¶
通过battery_voltage_convert_to_percent()接口实现电压到百分比的转换,核心逻辑为:
先调用
battery_voltage_filter()过滤无效值;根据充电状态选择对应曲线表:
充电状态(
BATTERY_CHARGING_STATUS):使用chargeing_curve_table(充电曲线,适配充电时电压偏高特性);放电状态:使用
discharge_curve_table(放电曲线);
曲线表需根据实际电池特性自定义校准,确保不同电压下的百分比显示准确。
3. NTC温度计算¶
NTC(热敏电阻)温度采集通过 ADC 获取电压值后,通过 “公式法” 或 “查表法” 计算温度,可在menuconfig中配置。
公式法:高精度计算 基于 NTC 的 B 值公式计算温度,需根据硬件参数配置分压电阻、B 值等参数。核心代码与参数说明如下:
查表法:快速计算 预存 “ADC 值 - 温度” 对应表,采集后通过查表直接获取温度,无需复杂计算,适合 CPU 资源有限或对实时性要求极高的场景。配置路径:
Top → Board Config → Select board peripherals → Charger config → NTC temp config → lookup table。
4. 扩展建议¶
算法参数调整:根据电池类型修改滤波阈值(
BAT_CHARGE_FILTER)、滑动窗口大小(如 8 次→16 次)或曲线表,适配不同场景;低功耗优化:双核平台可调整 LCPU 采集周期,单核平台通过动态调整 ADC 采样频率降低功耗;
故障诊断扩展:基于
battery_voltage_filter()的无效值统计,新增电池老化、接触不良等故障预警功能。


