进阶

进阶篇重点介绍电池管理服务,便于用户自主修改扩展。内容包括:电池管理服务框架,程序流程,电量服务算法优化,NTC温度计算

1. 电池管理服务

1.1 框架

电池管理服务大致包括充电,电量采集,温度采集三个部分。框架示意图如下:

fishy

1.2 单核(52x)流程

单核平台涉及到以下三个方面的管理:

  1. 电池电量检测管理

    • 初始化:通过INIT_PREV_EXPORT(battery_voltage_detection_init())隐式调用初始化函数,开机自动执行。

    fishy
    • 运行机制:定时器以BAT_DETECT_INTERVAL为周期(单位:秒)释放信号量,触发线程charger_thread执行。

      • 调用battery_voltage_detection()采集原始电压;

      • 若检测到充电器插入(BAT_CHARGING_PLUG_IN),延迟 300ms 等待 ADC 稳定后,执行battery_temp_detection()采集温度;

    fishy
  2. 电池充电管理

    • 初始化:battery_charger_init()通过INIT_COMPONENT_EXPORT注册为组件,开机自动初始化

    fishy
  3. 消息通信

    • 单核管理而言应用与驱动同属 HCPU,,但为了统一架构,因此虚拟了一个LCPU实现。

    fishy

1.3 双核流程

电池管理服务双核管理一般在55x/56x/58x平台。

  • HCPU负责电量应用,充电检测,开机低电量检测;

  • LCPU负责电量检测。

任务分工与初始化

模块

LCPU(低功耗核)

HCPU(主核)

电池电量检测

负责周期性采集(核心任务)
初始化:data service建立后,由battery_service_est_cb()显式调用battery_voltage_detection_init()

负责电量数据应用(如UI显示)无直接初始化,依赖LCPU数据上报

充电检测

无相关任务

负责充电器插入/拔出、充满等中断检测
初始化:同单核,battery_charger_init()自动执行

消息管理

隐式初始化:通过INIT_APP_EXPORT(battery_service_init())注册ipc_server,监听核间消息

显式调用:app_lcpu_pwr_on()启动时,注册ipc_client,建立通讯连接

核间通讯机制

LCPU采集电压、温度等数据后,通过data service将数据同步至HCPU;HCPU接收数据后更新UI界面,并在充电状态变化(如插入充电器)时触发中断响应,实现“低功耗采集”与“实时交互”的平衡。

具体代码位置

  1. 电池电量检测管理

    • LCPU的data service建立 -> battery_service_est_cb -> battery_voltage_detection_init

    fishy
  2. 电池充电管理

    • 双核管理时,充电检测在HCPU,battery_charge_init在HCPU调用。

    fishy
  3. 应用和驱动端消息管理

    • 双核时,消息通过HCPU和LCPU间的data_service传递。

      • lcpu上的battery_service_init调用

    fishy
    • hcpu上的battery_service_init调用

    fishy

2. 电量服务算法优化

ADC采集的原始电压存在波动与误差,系统通过“三级处理”实现高精度电量计算,核心流程为:原始电压采集→滤波优化→百分比转换

2.1 电压值平滑处理

针对电压高频波动,采用“8次滑动平均”算法,对最近8个原始电压值求平均,实现“削峰填谷”。核心代码逻辑如下:

fishy

2.2 相邻电压加权平均处理

针对电压突变(如充电瞬间波动),采用 “8:2 加权平均” 算法,赋予历史值更高权重,平滑突变数据。核心代码:

fishy

2.3 无效电池电压值过滤

若当前电压与上一次差值超过阈值(BAT_CHARGE_FILTER/BAT_DISCHARGE_FILTER),判定为无效值,沿用历史值并累计过滤次数;若连续多次无效,则更新历史值,避免异常数据影响精度。

fishy

2.4 电压转换成电量百分比曲线

通过battery_voltage_convert_to_percent()接口实现电压到百分比的转换,核心逻辑为:

  • 先调用battery_voltage_filter()过滤无效值;

  • 根据充电状态选择对应曲线表:

    • 充电状态(BATTERY_CHARGING_STATUS):使用chargeing_curve_table(充电曲线,适配充电时电压偏高特性);

    • 放电状态:使用discharge_curve_table(放电曲线);

  • 曲线表需根据实际电池特性自定义校准,确保不同电压下的百分比显示准确。

fishy

3. NTC温度计算

NTC(热敏电阻)温度采集通过 ADC 获取电压值后,通过 “公式法” 或 “查表法” 计算温度,可在menuconfig中配置。

fishy
  1. 公式法:高精度计算 基于 NTC 的 B 值公式计算温度,需根据硬件参数配置分压电阻、B 值等参数。核心代码与参数说明如下:

fishy
  1. 查表法:快速计算 预存 “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()的无效值统计,新增电池老化、接触不良等故障预警功能。