一、
锂电池基础
MTK 平台充电小结
1、 锂电池类型主要有普通(4.2V)和高压(4.35V)两种锂电池。现在我们项目用的都是
4.35v 的高压电池。
2、 电池充电一般分为三个阶段:涓流充电\预充电、恒流充电、恒压充电。
(1)、Vbat<3.2V 属于预充阶段。电池内部有保护电路,当放电到 2.8V 左右时会截止,不能
再放出电。当电池电压小于 2.2V 时,插入充电器后,软件不会启动,硬件 PMIC 芯片会以默
认的 70MA 电流来充电,同时打开一个 5 分钟的 Timer(T1),当 5 分钟过后,电池电压仍小
于 2.7V,则认为 dead battery,然后关闭充电。当电池电压大于 2.2V 时,插入充电后,软件仍
不会启动,硬件 PMIC 芯片会根据插入的充电器类型来选择充电电流:若是 AC 充电器则为
300MA;若是电脑 USB 则为 70MA。同时打开一个 35 分钟的 Timer(T2),当 35 分钟过后,
电池电压仍小于 3.2V,则认为是 dead battery,然后关闭充电。 由以上可知,当电池电压小于
3.2v 时,MTK6572 平台的充电由硬件 PMIC 芯片来控制,此阶段软件不能控制调节电流。当
电池电压大于 3.2V 以后系统会开机启动,同时 LCD 显示充电动画。
(2)、 3.3V4.2V 属于恒压阶段。这个阶段电流逐渐变小,电压维持不变!当电流减小到
150MA 时,会截止充电。
二、硬件设计
1、 Rfg 必须靠近电池连接器摆放
2、 Fuel guage 的电流检测走线 CSP_P,CS_N,必须差分到芯片,保证电流检测的准确。
3、 BAT_ON 用来检测电池温度的(NTC 电阻 47K,10K)
4、 AUX_IN2_BAT 检测电测 ID,对应 ADC 检测通道 12
外接芯片 FAN5405:
Rsense 设计为 68R,fan5405 的 ISENSE 和 VBAT 必须差分接到 Rsense 两端,不然芯片检测的
电压会不准。
三、battery 架构
具体过程:
硬件 ADC 读取 Battery 的各路信息:包括温度,电压等。
MTK 开发的电量算法分析得到的数据。
Kernel 层将电量信息通过写文件节点的方式更新,并通过 UEVENT 通知上层。
上层 Service 开启 UEVENT LISTENER,监听到 UEVENT 后,读取 battery 相关文件节点,获取
电量信息。
kernel 层 battery 驱动工作的流程,Bat_thread 是工作的重点,通过单独的线程依赖 10s 定时
器,更新 battery 相关信息。电量算法分析后得到的数据也不会直接 update,Information
Processing 还会针对一些特殊情况对显示电量做调整,比如 0%tracking&100%tracking。
除了 10s 一次的定时器更新,插拔充电器会触发中断,中断处理时同样会更新 battery 数据。
四、fuelguage 简析
代码路径:
客制化:
\mediatek\custom\{proj}\kernel\battery\battery\cust_battery_meter.h
\mediatek\custom\{proj}\kernel\battery\battery\cust_battery_meter_table.h
\mediatek\custom\{proj}\kernel\battery\battery\cust_charging.h
算法实现代码:
mediatek\kernel\drivers\power\battery_common.c
mediatek\kernel\drivers\power\ battery_meter.c
mediatek\kernel\drivers\power\ linear_charging.c
mediatek\kernel\drivers\power\ switch_charging.c
mediatek\platform\mt6752\kernel\drivers\power\charging_hw_fan5405.c
mediatek\platform\mt6752\kernel\drivers\power\charging_hw_pmic.c
mediatek\platform\mt6752\kernel\drivers\power\fan5405.c
mediatek\platform\mt6752\kernel\drivers\power\upmu_common.c
mediatek\platform\mt6752\kernel\drivers\power\
库仑积分法:
通过开路电压查表得到初始电量 D0,后续电量通过电流积分累积,通用性强,依赖初始电量
的精确度。
事实上,所有算法都要依赖 ADC 读取电量信息,这边的 AUX ADC 算法指只依赖 ADC 读值 然
后查表读取电量的算法。
开机 probe 会进入一次 BAT_thread,
初始化 hrtimer,设定每 10sbattery kernel 进程被唤醒一次;
创建并启动一个内核线程 bat_thread_kthread;
Bat_thread_kthread 会调用 BAT_thread
针对不同的 Fg 方式走不同的流程。32 以后的平台使用 HW_FG,32 以前的 72,82,92,使用
SW_FG 的算法
先看 fgauge_initialization
首先通过 fgauge_construct_battery_profile_init()构建新的 ZCV 表。
然后读取温度 force_get_tbat
读取电池容量,得到电池百分比---fgauge_read_capacity(0)
调用 fguage_get_dod0();利用预先测得的分布在-10 0 25 50 摄氏度下的 ZCV 表,结合真实
温度,动态重构一张当前温度下的 ZCV 表格。
采用线性平均法 填补了有效温度内所有的 ZCV 对应值 但与真实曲线必然存在一定的误
差。
读取 Q_Max-fgauge_get_Q_max
下面介绍下充电核心函数:mt_battery_charging_algorithm()
预充电阶段,设置充电 9s,停止 1s,来读取 vbat 电压值,保证准确性。当电压大于 3.4V 时,
就会进入恒流充电阶段。