摘要:调试电池的充放电管理,首先需要深入了解锂电池的电池原理和特点,充放电特性以及基本的电池安全问题。然后需要对MTK的电池管理驱动程序有深入的了解,理解电池充放电算法的基本原理。在此基础上,对充放电导致的问题进行调试优化。
一、 锂电池工作原理和特性
1.工作原理:
锂离子电池以碳素材料为负极,以含锂的化合物作正极。它主要依靠锂离子在正极和负极之间移动来工作。在充放电过程中,Li+ 在两个电极之间往返嵌入和脱嵌:充电时,Li+从正极脱嵌,经过电解质嵌入负极,负极处于富锂状态;放电时则相反。
一般锂电池充电电流设定在0.2C至1C之间,电流越大,充电越快,同时电池发热也越大。而且,过大的电流充电,容量不够满,因为电池内部的电化学反应需要时间。就跟倒啤酒一样,倒太快的话会产生泡沫,反而不满。
2.主要性能:
锂离子电池的额定电压为3.7V(少数的是3.8V)。充满电时的终止充电电压与电池阳极材料有关,目前手机上主流的参数为4.35V。充电时要求终止充电电压的精度在±1%之内。锂离子电池的终止放电电压为2.4~2.7V(电池厂家给出工作电压范围或终止放电电压的参数略有不同)。高于终止充电电压及低于终止放电时会对电池有损害。其使用有一定要求:充电温度:0℃~45℃;保存温度:-20℃~+60℃。锂离子电池不适合大电流充放电。一般充电电流不大于1C,放电电流不大于2C(C是电池的容量,如C=950mAh,1C的充电率即充电电流为950mA)。充电、放电在20℃左右效果较好,在负温下不能充电,并且放电效果差(在-20℃放电效果最差,不仅放电电压低,放电时间比20℃放电时的一半还少)。
3.充放电特性
A.锂电池的充电特性:
1.在充电前半段,电压是逐渐上升的;
2.在电压达到4.2V后,内阻变化,电压维持不变;
3.整个过程中,电量不断增加;
4.在接近充满时,充电电流会达到很小的值。
经过多年的研究,已经找到了较好的充电控制方法:
1.涓流充电达到放电终止电压2. 7V ;
2.使用恒流进行充电,使电压基本达到4.2V。安全电流为小于0.8C;
3.恒流阶段基本能达到电量的80%;
4.转为恒压充电,电流逐渐减小;
5.在电流达到较小的值(如0.05C)时,电池达到充满状态。
这种CC-CV的充电方式能很好的到达电池的充满状态,并且不损害电池,已经成为锂离子电池的主要充电方式。
但是在电池电压已经很低的情况下,电池内部的锂离子活性减弱,如果此时用比较大的电流充电,也有可能对电池有损害。如同人在剧烈运动前要进行必要的热身活动一样,锂离子的活性也要逐步激活。可以在电池低压段采用涓流方式,有效激活电池电压到2.7V以上,然后采用CC-CV的充电方式,有效的保护电池。
B.锂电池的放电特性;
实验发现,锂离子电池在放电终止电压2.7V的条件下,放电电流越大电池的极化越大,电池的放电容量越小,但电池的静态电压与电池的放电深度的关系是基本保持不变的状态。锂离子电池以大电流放电(大于2C)的情况下,电池的放电曲线出现了电压先降低后上升的现象 通常情况下,确定锂离子电池放电电流大小时,不能用电流的绝对值来衡量,而用额定容量C与放电时间的比来表示,称作放电速率或放电倍率。对于1700mAh的电池,如果以0.1C的电流放电,则放电电流为170mA。由于锂离子电池的内阻,一般在30-100 mΩ之间,大电流放电或充电都会导致电池升温,因此在监测过程中,锂离子电池一般不允许高速率放电,一般放电速率应小于0.5C,最大连续放电速率不能超过1.5C,电压低于2.7V时应终止放电。
C.过充过放:
锂离子电池的额定电压,因为材料的变化,一般为3.7V,磷酸铁锂(以下称磷铁)正极的则为3.2V。充满电时的终止充电电压国际标准是4.2V,磷铁3.6V。锂离子电池的终止放电电压为2.75V~3.0V(国内电池厂给出工作电压范围或给出终止放电电压,各参数略有不同,一般为3.0~2.75V,磷铁为2.5V。)。低于2.5V(磷铁2.0V)继续放电称为过放(国际标准为最低3.2v,磷铁2.8v),低电压的过放或自放电反应会导致锂离子活性物质分解破坏,并不一定可以还原。而锂离子电池任何形式的过充都会导致电池性能受到严重破坏,甚至爆炸。锂离子电池在充电过程必需避免对电池产生过充。
二、 电池温度检测与充放电算法原理
1.电池温度检测
温度检测等效电路
l 将Vbat_on转化为NTC的电阻值;
l 利用线性插值法通过表格将NTC的电阻值转化为温度值。
2.充放电算法:
3.驱动工作流程:
A.电池管理框架
B.驱动工作流程
三、 MTK充放电调试要点
1. 配置电池温度检测相关参数
相关宏定义在cust_battery_meter_table.h文件中:
A.目前热敏电阻有两种规格:10K和47K。由电池工程师提供参数。
#define BAT_NTC_10 1
#define BAT_NTC_47 0
B.在配置热敏电阻参数的同时,也要根据原理图,配置温度检测上拉电阻以及参考电压。
#define RBAT_PULL_UP_R 16000 //对应原理图中的R311
#define RBAT_PULL_UP_VOLT 2800 //对应原理图中的VBATREF
2. 更新电池充放电参数
电池充放电参数由电池工程师向电池厂家索取。根据提高的测试数据,我们可以获得各温度下最大放电容量,各温度下的内阻—电压表、放电深度—电压表。
A. 更新各温度下对应的最大放电容量(头文件:cust_battery_meter.h)
#define Q_MAX_POS_50 1750 //Cmax
#define Q_MAX_POS_25 1763
#define Q_MAX_POS_0 1756
#define Q_MAX_NEG_10 1726
#define Q_MAX_POS_50_H_CURRENT 1737 //Cmax_400mA
#define Q_MAX_POS_25_H_CURRENT 1717
#define Q_MAX_POS_0_H_CURRENT 1214
#define Q_MAX_NEG_10_H_CURRENT 966
B. 更新“内阻---电压转换表”和“放电深度百分比---电压”转换表
(头文件:cust_battery_meter_table.h)
上图是电池充放电测试参数中的一个截图
OCV:电池空载电压CV:电池负载电压
mAh:放电容量DOD:放电深度百分比
R:电池内阻:
从表格中提取 R----OCV 对应温度的r_profile_t2数组
从表格中提取DOD---OCV到对应温度的battery_profile_t2数组中
注意数组的元素个数都要一致。
3. 配置充电电流:(cust_charging.h)
#define USB_CHARGER_CURRENT_SUSPEND 0 // def CONFIG_USB_IF
#define USB_CHARGER_CURRENT_UNCONFIGURED CHARGE_CURRENT_70_00_MA // 70mA
#define USB_CHARGER_CURRENT_CONFIGURED CHARGE_CURRENT_550_00_MA // 500mA
#define USB_CHARGER_CURRENT CHARGE_CURRENT_550_00_MA //500mA
#define AC_CHARGER_CURRENT CHARGE_CURRENT_800_00_MA
#define NON_STD_AC_CHARGER_CURRENT CHARGE_CURRENT_1050_00_MA
#define CHARGING_HOST_CHARGER_CURRENT CHARGE_CURRENT_1050_00_MA
#define APPLE_0_5A_CHARGER_CURRENT CHARGE_CURRENT_550_00_MA
#define APPLE_1_0A_CHARGER_CURRENT CHARGE_CURRENT_650_00_MA
#define APPLE_2_1A_CHARGER_CURRENT CHARGE_CURRENT_800_00_MA
4. 配置电流检测电阻:(cust_battery_meter.h)
#define CUST_R_SENSE 56 //56 mOhm
充电电流检测电阻
5. 开机初始化电量的调试:
调试开机初始化电量的意义在于,尽量获取准确的电量,为后续积分算法进行电量积分提供一个准确的参考。
源代码:battery_common.c battery_meter.c (充电算法采用SOC_BY_SW_FG)
工作流程:BAT_thread() -> battery_meter_initial() -> oam_init()
1. oam_init()函数中先获取HW_OCV和V_BAT_SENSE两路电压,其中HW_OCV是通过PMIC_AUXADC_ADC_OUT_WAKEUP_PCHR寄存器获取的,这是PMIC上电时检测到的电池开路电压值,这个有时候是有一定误差的,所以必须同时获取V_BAT_SENSE的电压,也就是当前的电池电压值。
2. 根据系统是否接入充电器,与V_BAT_SENSE对比,判断HW_OCV的合理性。如果不合理,需要采取措施纠正。这就是这部分调试的要点。要根据按power键、接USB、接AC等情景,搜集数据,进行调试。保证初始电压以及电量尽量接近真实的电池开路电压。
3. 确定好系统启动时电池电量以后,还要跟上次系统关机时系统保留到RTC中的电量做对比,假如当前启动测得的电量和RTC中保留的电量误差在20%(这个值可以根据具体情况调整),那么选择RTC中保留电量为合法。这么做有两个目的,一个是判断是否为同一块电池,还有就是保证同一块电池在开机前后电量不会出现大的波动。电池管理驱动程序在运行的时候,会随时更新电量值,刷新到RTC的寄存器RTC_AL_HOU中,每次开机启动时,oam_init()会调用dod_init,dod_init函数会读取RTC_AL_HOU寄存器的值,这个如果是0,表明是第一次刷机后开机,如果不为0,则为上次关机时候的电池电量。
6. 充放电算法的调试
充放电算法的原理就是库仑积分法,调试的主要问题放电曲线和充电曲线。
源代码:battery_meter.c oam_run();
A. 放电曲线的调试
放电曲线主要调试d5_count_time在gFG_Is_Charging == KAL_FALSE时候的值,主要根据电池容量。
B. 充电曲线的调试
充电曲线首先要根据电池容量和标称充电电流的大小,估算一下电量从0%到100%需要多少的充电时间。
还有就是从90%到100%这一阶段的充电时间的调试,会影响到电池是否能完全充满。在这一阶段一方面是通过charging_full_check()这个函数获取充电IC中充电状态寄存器的值和充电电流来判断电池是否充满;另外一方面就是通过调整这个阶段的时间来判断。
7. 考虑接触点电阻
电池接触点处一般会有20~40mho的电阻,这个阻值在大电流(1.5-2A)充电的时候,会对充电算法有一定的影响。所以在调试的时候要考虑这个电阻的存在,尤其是大电流充电的时候。在函数mtk_imp_tracking中计算开路电压的时候,可以通过宏定义FG_METER_RESISTANCE的调整去补充上这个接触点电阻。
8. 充电IC中DPM功能影响
使用的BQ24158,BQ24296芯片中都会有一个DPM功能,这个DPM功能是在充电过程中,当输入源输入功率无法提供支持设置的或者默认的充电电流时,会降低VBUS的电压,以保证在功率不变的情况下提供足够的充电电流,当VBUS降低到Vin_dpm以下时,又及时调整充电电流保证VBUS电压不至于太低导致无法识别。由于这个DPM设置不合理导致的问题就是插入USB的时候,“正在充电”的过程持续一会立马消失了。这就是因为由于电脑提供的USB最大充电电流为450mA,而Vin_dpm和USB充电电流设置过大,导致电脑的USB接口提供的功率不足,于是充电IC的DPM功能发挥作用,把VBUS拉低到4.5V以下,USB掉线了。
9. MT6732平台重开机前后HW_OCV不变的问题
现象是这样的:第一次开机的时候HW_OCV是3.67V,直接重启系统后,HW_OCV还是3.67V,没有变化。这个现象直接导致在关机充电下按电源键启动系统的时候,开机开路电压检测偏差极大的问题。解决这个问题需要重置AUXADC寄存器。在mtk_wdt.c中修改如下:
void wdt_arch_reset(char mode)
{
……
mt6325_upmu_set_rg_auxadc_rst(0x01);
mt6325_upmu_set_rg_auxadc_reg_rst(0x01);
……
}
四、 参考文档
《Battery_Charging_Introduction_for_Customer_V1.0.pdf》
《Battery_Customer Document_MT65xx.pdf》
《Fuel_Gauge_introduce.pdf》
《Fuel_Gauge_Application_Notes_V1.0.pdf》
《Fuel_Gauge_Battery_ZCV_Table_Test_SOP_V1.0_20120716.pdf》