MT8735 andorid7.0 充電除錯總結(1)——MTK電源管理(MT6318)
充電整體框架圖如下:
充電原理圖:
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<VCHARGE<9V。AC口最大可承受15V,USB口最大可承受9V
3、VCHARGE通過P-MOS管,Shottkey二極體,充電電阻連線到VBAT,組成充電迴路,6318通過控制G極電壓,從而控制Vgs,達到控制充電電流的目的,二極體是為防止電流倒灌。下面是MOS管的轉移特性圖。下圖應該有些錯誤,其實Vgs、Id都是負值。可以看到,當Vgs越負時,漏極電流越大。
4、ISENSE、VBAT連線到充電電阻兩端,在IC內部,這兩路按以下連線。
可以程式設計實現分壓還是直接連線。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層充電相關函式介紹
alps\kernel-3.10\drivers\power\mediatek目錄下:
battery_common.c -----------充電控制主執行緒
battery_meter.c -----------SW FG演算法
linear_charging.c ----------PMIC充電控制
switch_charging.c ---------SW charger充電控制
充電相關的需要客製化的程式碼路徑
//ZCV曲線
alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\aeon6735m_65u_s_l1\power目錄下cust_battery_meter_table.h 和 cust_battery_meter.h 這兩個檔案,根據電池廠家提供的ZCV引數更新這兩個檔案下對應4個溫度下的引數即可{放電深度,電池電壓}; {電池內阻,電池電壓} ;同時還要更新NTC電阻曲線{溫度,NTC電阻值}
//充電電流精度設定
alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\aeon6735m_65u_s_l1\power\cust_battery_meter.h
#define CUST_R_SENSE 56 -------從基帶那邊獲取,影響充電電流的精度
//充電電池內部溫度檢測電阻設定
alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\aeon6735m_65u_s_l1\power\ 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: \alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\aeon6735m_65u_s_l1\power\ cust_charging.h
Kernel: \alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\aeon6735m_65u_s_l1\power\ cust_charging.h
#define MAX_CHARGE_TEMPERATURE 50
#define MIN_CHARGE_TEMPERATURE 0
#define ERR_CHARGE_TEMPERATURE 0xFF
//充電電流設定
Kernel: \alps\kernel-3.10\drivers\misc\mediatek\mach\mt6735\aeon6735m_65u_s_l1\power\ cust_charging.h
Lk: \alps\bootable\bootloader\lk\target\aeon6735m_65u_s_l1\include\target\ cust_battery.h
/* Charging Current Setting */
#define USB_CHARGER_CURRENT Cust_CC_450MA
#define AC_CHARGER_CURRENT Cust_CC_650MA
以上這些客製化的設定在7.0後,都集中到如下檔案去設定
B:\drivers\kernel-3.18\arch\arm64\boot\dts\neostra8735_tb_n_bat_setting.dtsi
2.1 基本流程
電池充電過程分三個階段:預充電、恆流充電和恆壓充電。
1.預充電:當Vbat<3.4V時即進入此階段,此時PMIC不能提供Vcore、Vdd等電壓,CPU處於關機狀態。預充電流一般相對較小,理論上不要超過0.2C
2.恆流充電:當3.4<Vbat<4.2V時進入此階段,此時PMIC的LDO開始輸出電壓,CPU開始工作。
3.恆壓充電:當Vbat>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的過程也是一樣的。