充电整体框架图如下:
充电原理图:
1、 充电线路
1.1 充电线路
1.2 预充电路
1.3 OVP电路
1.4 6305OVP电路
2、 充电过程
2.1 充电流程
2.2 MT6318充电状态转换图
//下面是详细介绍
1、 充电线路
为了方便查看,将每一部分电路独立的画出来了
1.1 充电电路
说明:
1、左边的ADC3_VCHG通过R1、R2组成的分压电路检测充电电压。
2、VCHARGE的范围:4.2V
可以编程实现分压还是直接连接。BASEBAND根据这两个电压(ISNSE_OUT,VB_OUT)以及充电电阻就可以算出充电电流(两种连接方式不一样)。LAYOUT时要注意,这两根线最好走成粗细长度都相同,这样电压检测才准确,充电电流的检测才准确。
1.2 预充电路
说明:1、当电池电压VBAT<3.3V时,SEL1=L,SEL2=H,左边的MOS管导通,右边的MOS管关断。PMU采用Vcharge供电,实现预充显示。当VBAT>3.3V时,SEL1=H,SEL2=L,左边的MOS管关断,右边的MOS管导通。采用电池供电。要想有预充显示功能,还需SEL1_EN(H3)=H。
2、两个管子均是P-MOS管,作为开关用。所不同的是,左边的MOS管还带了一个肖特基二极管,以防止VBAT电流倒灌到VCHARGE。另外左边的MOS管不仅仅是作为开关用,还可以改变栅极电压来改变整个管子的压降,以控制输入到PMIC的电压在3.8V左右。当时,左边的MOS管导通,右边的MOS管关断。
3、SEL1,SEL2均是VCHARGE供电的。
1.3 过压保护及温度检测电路
说明:1、VCHARGE通过R1、R2分压以后连接到BAT_ON。当BAT_ON>2.5V时,电池没有连接,PMIC会立即停止充电。可以计算该处OVP电压为:V=(2.5+0.3)*42/18=6.5V
2、电池温度检测:AVDD通过R3和电池内部的10K温敏电阻分压。当电池温度变化时,温敏电阻的值会改变,从而上面的电压跟着改变,ADC2_TBAT检测该电压。
3、两个二极管的作用是隔离,否则,两边的检测会相互受到影响。
充电过程
kernel层充电相关函数介绍
alpskernel-3.10driverspowermediatek目录下:
battery_common.c -----------充电控制主线程
battery_meter.c -----------SW FG算法
linear_charging.c ----------PMIC充电控制
switch_charging.c ---------SW charger充电控制
充电相关的需要客制化的代码路径
//ZCV曲线
alpskernel-3.10driversmiscmediatekmachmt6735aeon6735m_65u_s_l1power目录下cust_battery_meter_table.h 和 cust_battery_meter.h 这两个文件,根据电池厂家提供的ZCV参数更新这两个文件下对应4个温度下的参数即可{放电深度,电池电压}; {电池内阻,电池电压} ;同时还要更新NTC电阻曲线{温度,NTC电阻值}
//充电电流精度设置
alpskernel-3.10driversmiscmediatekmachmt6735aeon6735m_65u_s_l1powercust_battery_meter.h
#define CUST_R_SENSE 56 -------从基带那边获取,影响充电电流的精度
//充电电池内部温度检测电阻设置
alpskernel-3.10driversmiscmediatekmachmt6735aeon6735m_65u_s_l1power cust_battery_meter_table.h
#define BAT_NTC_10 1
#define BAT_NTC_47 0
#if (BAT_NTC_10 == 1)
#define RBAT_PULL_UP_R 16900
#define RBAT_PULL_DOWN_R 27000
#endif
#if (BAT_NTC_47 == 1)
#define RBAT_PULL_UP_R 61900
#define RBAT_PULL_DOWN_R 100000
#endif
#define RBAT_PULL_UP_VOLT 1800
这里定义电池内部温度检测电阻,上拉电阻及电压,从基带那里获取这些信息。
//电池高低温停充/恢复充电
Kernel: alpskernel-3.10driversmiscmediatekmachmt6735aeon6735m_65u_s_l1power cust_charging.h
Kernel: alpskernel-3.10driversmiscmediatekmachmt6735aeon6735m_65u_s_l1power cust_charging.h
#define MAX_CHARGE_TEMPERATURE 50
#define MIN_CHARGE_TEMPERATURE 0
#define ERR_CHARGE_TEMPERATURE 0xFF
//充电电流设置
Kernel: alpskernel-3.10driversmiscmediatekmachmt6735aeon6735m_65u_s_l1power cust_charging.h
Lk: alpsootableootloaderlk argetaeon6735m_65u_s_l1include arget cust_battery.h
/* Charging Current Setting */
#define USB_CHARGER_CURRENT Cust_CC_450MA
#define AC_CHARGER_CURRENT Cust_CC_650MA
以上这些客制化的设置在7.0后,都集中到如下文件去设置
B:driverskernel-3.18archarm64ootdts
eostra8735_tb_n_bat_setting.dtsi
2.1 基本流程
电池充电过程分三个阶段:预充电、恒流充电和恒压充电。
1.预充电:当Vbat<3.4V时即进入此阶段,此时PMIC不能提供Vcore、Vdd等电压,CPU处于关机状态。预充电流一般相对较小,理论上不要超过0.2C
2.恒流充电:当3.4
4.2V后进入此阶段,此时充电电流会越来越小,电压维持不变
2.2 MT6318充电状态转换图
注意以下几点:
1. 充电的条件: 电池连接OK(BAT_ON=0);充电器连接OK(CHR_DEC=1);充电电压不过高(OV=0)
2. 预充转换到CC的条件是VBAT>3.3V,而CC装换到预充的条件是 VBAT<3.0V,这个主要是为了防止当VBAT在3.3V附近时,在两个状态间不停切换。同样的道理,CC到CV的过程也是一样的。