2024年4月11日发(作者:严含文)
BAT_thread()
battery kernel thread
for 10s check and
charger in/out event
是
整个充电时间大于或等于24小时
否
(1)gSyncPercentage是一个同步
bat_volt_check_point和BMT_的全局变量
恒压充电时间大于等于3小时
否
Mt6573_battery_update()
是
BAT_BatteryFullAction()
BMT__vol >= 4.11V &&
是
提示充满
是
否
在恒压充电阶段,充电的电流小于或
等于120mA,且持续1分钟
否
是
G_bat_full_user_view == 1
否
充电界面显示电量值
bat_volt_check_point=99
是
bat_volt_check_point >= 100
否
bat_volt_check_point ==
BMT_
是
gSyncPercentage=0
bat_data->BAT_CAPACITY =
bat_volt_check_point
Mt6573_fgadc_probe()
fgauge_initialization()
Calculate battery
capacity by VBAT
Type为0表示初始化,
构建曲线
通过ADC读出电池的
电压值Vadc
fgauge_read_capacity(0)
fgauge_read_voltage()
读取充电时电池的
温度temp
当充电时电池的温度小于-10度或大于50度,直接按-10度
和50度来处理
Rbat为电池充放电时电池的内阻
OCV为电池的空载电压值
RH为上曲线的Rbat值
RL为下曲线的Rbat值
VH为上曲线的OCV值
VL为下曲线的OCV值
Temp为当前的电池温度
tempH为当前的电池温度的上温度值
tempH为当前的电池温度的下温度值
计算曲线的公式采用线性插入法如下:
Rbat=RL+(temp-tempL)*(RH-RL)/(tempH-tempL)
OCV=VL+(temp-tempL)*(VH-VL)/(tempH-tempL)
fgauge_read_temperature()
根读电池的电压和
温度来计算电池电
量的百分比
fgauge_get_dod0()
获取r_profile_temperature[]
数组的首地址
fgauge_get_profile_r_table(TEMPE
RATURE_T)
构建当前温度[Rbat,OCV]曲线并
保存在
r_profile_temperature[]数组
中
获取
battery_profile_temperature[
]数组的首地址
构建当前温度[DOD,OCV]曲线并
保存在
battery_profile_temperature[
]数组中
通过传入的Vadc算出VC值并得到
OCV
当前温度的[DOD,OCV]曲线即为
Battery_profile_temperature[]
DOD=DODl+(Vh-OCV)*(DODh-DODl)/(Vh-Vl)
其中Vh和Vl为当前温度的[DOD,OCV]曲线中比OCV大和小
的值
DODh和DODl为当前温度的[DOD,OCV]曲线中Vh和Vl对应
的DOD值
Fgauge_construct_r_table_profile
()
OCV=VL+(temp-tempL)*(VH-VL)/(tempH-tempL)
将当前温度的上温度曲线中的DOD直接赋值给当前温度的DOD
DOD=DODH
fgauge_get_profile(TEMPERATURE_T
)
Fgauge_construct_battery_profile
()
在当前温度[Rbat,OCV]曲线即r_profile_temperature[]中找
到Vadc的插入点,用下面的公式算出Rbat
Rbat=Rl+(Vh-Vadc)*(Rh-Rl)/(Vh-Vl)
其中Vh和Vl为当前温度的[Rbat,OCV]曲线中比Vadc大和小的值
Rh和Rl为当前温度的[Rbat,OCV]曲线中Vh和Vl对应的R值
Vc=Ifg*(Rbat+Rfg)/1000
其中Vc为补偿电压
Rfg为电池负极上20mOhm的电阻
Ifg为流过Rfg上的电流值
Vc= (Vc +(10/2)) / 10
充电时补偿电压为负值,不充电时为正值
if (gFG_Is_Charging == KAL_TRUE)
Vc= Vc-(Vc*2);
=Vadc+Vc
gFG_DOD0 = 100 -gFG_capacity
voltage = voltage +
fgauge_compensate_battery_voltag
e_recursion(voltage,5);
在当前温度的[DOD,OCV]曲线中找到
OCV的插入点,然后利用公式算出当
前OCV所应的DOD,即得到当前电压对
应的电量显示百分比
得到最终显示电量的百分比
FGADC kernel thread for 1s
check gas gauge status
FGADC_thread_kthread()
Fgauge_read_current()
Fgauge_read_voltage()
gFG_voltage = gFG_voltage +
fgauge_compensate_battery_voltag
e_recursion(gFG_voltage,1)
读出当前电池的库
仑计的值,单位mAh
gFG_columb =
fgauge_read_columb()
30秒执行一次
Fgauge_Normal_Mode_Work()
通过当前电池的OCV的值计算
出电池电量值DOD,方法与FG
DRV初始化一样
fgauge_read_capacity_by_v()
通过库仑计计算
电池的容量
fgauge_read_capacity(1)
fgauge_update_dod()
读取当前温度,并计算出当前温度对
应电池的容量Qmax
FG_dod_1 = gFG_DOD0 -(((
(gFG_columb*1000*adjust_coulomb_counter)
/100 )/gFG_BATT_CAPACITY)+5)/10;
读取当前温度,并计算出当前温度对
应电池的容量C_0mA和400mA放电时对
应的电池容量C_400mA
dvalue_new = (100-dvalue) -( (
(C_0mA-C_400mA) * (dvalue) ) /
C_400mA )
gFG_DOD0表示开机时初始化电池电量百分比
When charger plug in/out, need update DOD0
gFG_columb表示当前充电时流入电池或放电时流出电池的库仑
计的值,单位mAh,充电时为正值,放电时为负值
CAR_TUNE_VALUE 用于修正统计电流的误差,当前值是94
gFG_BATT_CAPACITY表示当前温度下电池的最大容量,单位mAh
FG_dod_1 是DOD0+(-CAR)/Cmax
dvalue的值就是FG_dod_1
dvalue_new就是最终的电量百分比DOD
2024年4月11日发(作者:严含文)
BAT_thread()
battery kernel thread
for 10s check and
charger in/out event
是
整个充电时间大于或等于24小时
否
(1)gSyncPercentage是一个同步
bat_volt_check_point和BMT_的全局变量
恒压充电时间大于等于3小时
否
Mt6573_battery_update()
是
BAT_BatteryFullAction()
BMT__vol >= 4.11V &&
是
提示充满
是
否
在恒压充电阶段,充电的电流小于或
等于120mA,且持续1分钟
否
是
G_bat_full_user_view == 1
否
充电界面显示电量值
bat_volt_check_point=99
是
bat_volt_check_point >= 100
否
bat_volt_check_point ==
BMT_
是
gSyncPercentage=0
bat_data->BAT_CAPACITY =
bat_volt_check_point
Mt6573_fgadc_probe()
fgauge_initialization()
Calculate battery
capacity by VBAT
Type为0表示初始化,
构建曲线
通过ADC读出电池的
电压值Vadc
fgauge_read_capacity(0)
fgauge_read_voltage()
读取充电时电池的
温度temp
当充电时电池的温度小于-10度或大于50度,直接按-10度
和50度来处理
Rbat为电池充放电时电池的内阻
OCV为电池的空载电压值
RH为上曲线的Rbat值
RL为下曲线的Rbat值
VH为上曲线的OCV值
VL为下曲线的OCV值
Temp为当前的电池温度
tempH为当前的电池温度的上温度值
tempH为当前的电池温度的下温度值
计算曲线的公式采用线性插入法如下:
Rbat=RL+(temp-tempL)*(RH-RL)/(tempH-tempL)
OCV=VL+(temp-tempL)*(VH-VL)/(tempH-tempL)
fgauge_read_temperature()
根读电池的电压和
温度来计算电池电
量的百分比
fgauge_get_dod0()
获取r_profile_temperature[]
数组的首地址
fgauge_get_profile_r_table(TEMPE
RATURE_T)
构建当前温度[Rbat,OCV]曲线并
保存在
r_profile_temperature[]数组
中
获取
battery_profile_temperature[
]数组的首地址
构建当前温度[DOD,OCV]曲线并
保存在
battery_profile_temperature[
]数组中
通过传入的Vadc算出VC值并得到
OCV
当前温度的[DOD,OCV]曲线即为
Battery_profile_temperature[]
DOD=DODl+(Vh-OCV)*(DODh-DODl)/(Vh-Vl)
其中Vh和Vl为当前温度的[DOD,OCV]曲线中比OCV大和小
的值
DODh和DODl为当前温度的[DOD,OCV]曲线中Vh和Vl对应
的DOD值
Fgauge_construct_r_table_profile
()
OCV=VL+(temp-tempL)*(VH-VL)/(tempH-tempL)
将当前温度的上温度曲线中的DOD直接赋值给当前温度的DOD
DOD=DODH
fgauge_get_profile(TEMPERATURE_T
)
Fgauge_construct_battery_profile
()
在当前温度[Rbat,OCV]曲线即r_profile_temperature[]中找
到Vadc的插入点,用下面的公式算出Rbat
Rbat=Rl+(Vh-Vadc)*(Rh-Rl)/(Vh-Vl)
其中Vh和Vl为当前温度的[Rbat,OCV]曲线中比Vadc大和小的值
Rh和Rl为当前温度的[Rbat,OCV]曲线中Vh和Vl对应的R值
Vc=Ifg*(Rbat+Rfg)/1000
其中Vc为补偿电压
Rfg为电池负极上20mOhm的电阻
Ifg为流过Rfg上的电流值
Vc= (Vc +(10/2)) / 10
充电时补偿电压为负值,不充电时为正值
if (gFG_Is_Charging == KAL_TRUE)
Vc= Vc-(Vc*2);
=Vadc+Vc
gFG_DOD0 = 100 -gFG_capacity
voltage = voltage +
fgauge_compensate_battery_voltag
e_recursion(voltage,5);
在当前温度的[DOD,OCV]曲线中找到
OCV的插入点,然后利用公式算出当
前OCV所应的DOD,即得到当前电压对
应的电量显示百分比
得到最终显示电量的百分比
FGADC kernel thread for 1s
check gas gauge status
FGADC_thread_kthread()
Fgauge_read_current()
Fgauge_read_voltage()
gFG_voltage = gFG_voltage +
fgauge_compensate_battery_voltag
e_recursion(gFG_voltage,1)
读出当前电池的库
仑计的值,单位mAh
gFG_columb =
fgauge_read_columb()
30秒执行一次
Fgauge_Normal_Mode_Work()
通过当前电池的OCV的值计算
出电池电量值DOD,方法与FG
DRV初始化一样
fgauge_read_capacity_by_v()
通过库仑计计算
电池的容量
fgauge_read_capacity(1)
fgauge_update_dod()
读取当前温度,并计算出当前温度对
应电池的容量Qmax
FG_dod_1 = gFG_DOD0 -(((
(gFG_columb*1000*adjust_coulomb_counter)
/100 )/gFG_BATT_CAPACITY)+5)/10;
读取当前温度,并计算出当前温度对
应电池的容量C_0mA和400mA放电时对
应的电池容量C_400mA
dvalue_new = (100-dvalue) -( (
(C_0mA-C_400mA) * (dvalue) ) /
C_400mA )
gFG_DOD0表示开机时初始化电池电量百分比
When charger plug in/out, need update DOD0
gFG_columb表示当前充电时流入电池或放电时流出电池的库仑
计的值,单位mAh,充电时为正值,放电时为负值
CAR_TUNE_VALUE 用于修正统计电流的误差,当前值是94
gFG_BATT_CAPACITY表示当前温度下电池的最大容量,单位mAh
FG_dod_1 是DOD0+(-CAR)/Cmax
dvalue的值就是FG_dod_1
dvalue_new就是最终的电量百分比DOD