已绑定手机
|
目前存在一台机器一个电池,重启电量显示不同的问题(100%的电池关机重启之后显示0%关机)
两台机器一块电池,在两台机器上显示的电量也不相同,有差异
目前分析这个算法的结果如下:
开机要初始化算法,获取关机之前写入rtc的电量。
首先执行fgauge_initialization(void)
这个方法中做了如下工作:
- void fgauge_initialization(void)
- {
- #if defined(CONFIG_POWER_EXT)
- #else
- int i = 0;
- kal_uint32 ret = 0;
- /* gFG_BATT_CAPACITY_init_high_current = fgauge_get_Q_max_high_current(25); */
- /* gFG_BATT_CAPACITY_aging = fgauge_get_Q_max(25); */
- /* 1. HW initialization */
- ret = Battery_meter_ctrl(BATTERY_METER_CMD_HW_FG_INIT, NULL); 这块不懂在初始化什么,主要是配置MT6328里面的一些寄存器
- /* 2. SW algorithm initialization */
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &gFG_voltage); //adc采样获得ocv电压
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &gFG_current); //这个应该是读取电流信息
- i = 0;
- while (gFG_current == 0) {
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &gFG_current);
- if (i > 10) {
- bm_print(BM_LOG_CRTI, "[fgauge_initialization] gFG_current == 0\n");
- break;
- }
- i++;
- }
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR, &gFG_columb); //读取库仑计流量,充电为正,放电为负
- #if !defined(CUST_CAPACITY_OCV2CV_TRANSFORM)
- fgauge_construct_battery_profile_init(); //这个主要是修改四种温度(-10,0,25,50)温度下电池曲线的tables长度
- #endif
- gFG_temp = force_get_tbat(KAL_FALSE); //获取当前温度
- gFG_capacity = fgauge_read_capacity(0); //根据当前温度构建一份当前温度下的电池曲线,并更具Vbat电压插值得到当前的电量和用电深度
- gFG_capacity_by_c_init = gFG_capacity;
- gFG_capacity_by_c = gFG_capacity;
- gFG_capacity_by_v = gFG_capacity;
- gFG_DOD0 = 100 - gFG_capacity;//初始化用电深度
- bm_print(BM_LOG_CRTI, "[fgauge_initialization] gFG_DOD0 =%d %d \n",gFG_DOD0,gFG_capacity);
- gFG_BATT_CAPACITY = fgauge_get_Q_max(gFG_temp);//获取当前温度下的电池容量
- gFG_BATT_CAPACITY_init_high_current = fgauge_get_Q_max_high_current(gFG_temp);
- gFG_BATT_CAPACITY_aging = fgauge_get_Q_max(gFG_temp);
- ret = battery_meter_ctrl(BATTERY_METER_CMD_DUMP_REGISTER, NULL);
- bm_print(BM_LOG_CRTI, "[fgauge_initialization] Done HW_OCV:%d FG_Current:%d FG_CAR:%d tmp=%d capacity=%d Qmax=%d\n",
- gFG_voltage,gFG_current,gFG_columb,gFG_temp,gFG_capacity,gFG_BATT_CAPACITY);
- #if defined(FG_BAT_INT)
- pmic_register_interrupt_callback(41,fg_bat_int_handler);
- pmic_register_interrupt_callback(40,fg_bat_int_handler);
- #endif
- #endif
- }
- #endif
复制代码 第二步执行fgauge_algo_run_init(void)初始化一些信息
- void fgauge_algo_run_init(void)
- {
- int i = 0;
- int ret = 0;
- #ifdef INIT_SOC_BY_SW_SOC
- kal_bool charging_enable = KAL_FALSE;
- #if defined (CONFIG_MTK_kernel_POWER_OFF_CHARGING) && !defined(SWCHR_POWER_PATH)
- if(LOW_POWER_OFF_CHARGING_BOOT != g_boot_mode)
- #endif
- /*stop charging for vbat measurement*/
- battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable);
-
- msleep(50);
- #endif
- /* 1. Get Raw Data */
- gFG_voltage = battery_meter_get_battery_voltage(KAL_TRUE); //ADC采样获取到电压
- gFG_voltage_init = gFG_voltage; //记录初始电压
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &gFG_current); //获取电流
- ret=battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN, &gFG_Is_Charging); //是否在充电
- gFG_voltage = gFG_voltage + fgauge_compensate_battery_voltage_recursion(gFG_voltage, 5); /* mV */ //对电压做递归步长
- gFG_voltage = gFG_voltage + OCV_BOARD_COMPESATE;
- bm_print(BM_LOG_CRTI, "[FGADC] SWOCV : %d,%d,%d,%d,%d,%d\n",
- gFG_voltage_init, gFG_voltage, gFG_current, gFG_Is_Charging, gFG_resistance_bat,
- gFG_compensate_value);
- #ifdef INIT_SOC_BY_SW_SOC
- charging_enable = KAL_TRUE;
- battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable);
- #endif
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR, &gFG_columb); //获取库仑计流量
- /* 1.1 Average FG_voltage */
- for (i = 0; i < FG_VBAT_AVERAGE_SIZE; i++) {
- FGvbatVoltageBuffer[i] = gFG_voltage;
- }
- FGbatteryVoltageSum = gFG_voltage * FG_VBAT_AVERAGE_SIZE;
- gFG_voltage_AVG = gFG_voltage;
- #ifdef Q_MAX_BY_CURRENT
- /* 1.2 Average FG_current */
- for (i=0; i<FG_CURRENT_AVERAGE_SIZE; i++) {
- FGCurrentBuffer[i] = gFG_current;
- }
-
- FGCurrentSum = gFG_current * FG_CURRENT_AVERAGE_SIZE;
- gFG_current_AVG = gFG_current;
- #endif
- /* 2. Calculate battery capacity by VBAT */
- gFG_capacity_by_v = fgauge_read_capacity_by_v(gFG_voltage); //根据补偿后的电压插值查找一个电量
- gFG_capacity_by_v_init = gFG_capacity_by_v; //记录通过电压获取到的电量值
- /* 3. Calculate battery capacity by Coulomb Counter */
- gFG_capacity_by_c = fgauge_read_capacity(1); //通过初始用电深度gFG_DOD0和库仑计流量计算出当前的电量
- /* 4. update DOD0 */
- dod_init(); //初始化DOD0
- gFG_current_auto_detect_R_fg_count = 0;
- for (i = 0; i < 10; i++) {
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &gFG_current);
- gFG_current_auto_detect_R_fg_total += gFG_current;
- gFG_current_auto_detect_R_fg_count++;
- }
- /* double check */
- if (gFG_current_auto_detect_R_fg_total <= 0) {
- bm_print(BM_LOG_CRTI, "gFG_current_auto_detect_R_fg_total=0, need double check\n");
- gFG_current_auto_detect_R_fg_count = 0;
- for (i = 0; i < 10; i++) {
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &gFG_current);
- gFG_current_auto_detect_R_fg_total += gFG_current;
- gFG_current_auto_detect_R_fg_count++;
- }
- }
- gFG_current_auto_detect_R_fg_result =
- gFG_current_auto_detect_R_fg_total / gFG_current_auto_detect_R_fg_count;
- #if !defined(DISABLE_RFG_EXIST_CHECK)
- if (gFG_current_auto_detect_R_fg_result <= CURRENT_DETECT_R_FG) {
- g_auxadc_solution = 1;
- bm_print(BM_LOG_CRTI,
- "[FGADC] Detect NO Rfg, use AUXADC report. (%d=%d/%d)(%d)\r\n",
- gFG_current_auto_detect_R_fg_result, gFG_current_auto_detect_R_fg_total,
- gFG_current_auto_detect_R_fg_count, g_auxadc_solution);
- } else {
- if (g_auxadc_solution == 0) {
- g_auxadc_solution = 0;
- bm_print(BM_LOG_CRTI,
- "[FGADC] Detect Rfg, use FG report. (%d=%d/%d)(%d)\r\n",
- gFG_current_auto_detect_R_fg_result,
- gFG_current_auto_detect_R_fg_total,
- gFG_current_auto_detect_R_fg_count, g_auxadc_solution);
- } else {
- bm_print(BM_LOG_CRTI,
- "[FGADC] Detect Rfg, but use AUXADC report. due to g_auxadc_solution=%d \r\n",
- g_auxadc_solution);
- }
- }
- #endif
- /* 5. Logging */
- bm_print(BM_LOG_CRTI,
- "[FGADC] %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",
- gFG_Is_Charging, gFG_current, gFG_columb, gFG_voltage, gFG_capacity_by_v,
- gFG_capacity_by_c, gFG_capacity_by_c_init, gFG_BATT_CAPACITY,
- gFG_BATT_CAPACITY_aging, gFG_compensate_value, gFG_ori_voltage,
- OCV_BOARD_COMPESATE, R_FG_BOARD_SLOPE, gFG_voltage_init, MinErrorOffset, gFG_DOD0,
- gFG_DOD1, CAR_TUNE_VALUE, AGING_TUNING_VALUE);
- update_fg_dbg_tool_value();
- }
复制代码 第三步执行dod_iit()初始化DOD0
- void dod_init(void)
- {
- #if defined(SOC_BY_HW_FG)
- int ret = 0;
- #if defined(IS_BATTERY_REMOVE_BY_PMIC)
- kal_int32 gFG_capacity_by_sw_ocv = gFG_capacity_by_v; //记录通过补偿电压获取到的电量值
- #endif //#if defined(IS_BATTERY_REMOVE_BY_PMIC)
- /* use get_hw_ocv----------------------------------------------------------------- */
- ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &gFG_voltage); //获取ocv电压
- gFG_capacity_by_v = fgauge_read_capacity_by_v(gFG_voltage); //根据ocv电压获取一个电量值
- bm_print(BM_LOG_CRTI, "[FGADC] get_hw_ocv=%d, HW_SOC=%d, SW_SOC = %d\n",
- gFG_voltage, gFG_capacity_by_v, gFG_capacity_by_v_init);
- #if defined(EXTERNAL_SWCHR_SUPPORT)
- /* compare with hw_ocv & sw_ocv, check if less than or equal to 5% tolerance */
- if ((abs(gFG_capacity_by_v_init - gFG_capacity_by_v) > 5)
- && (bat_is_charger_exist() == KAL_TRUE)) {
- gFG_capacity_by_v = gFG_capacity_by_v_init;
- }
- #endif
- #if defined(HW_FG_FORCE_USE_SW_OCV)
- gFG_capacity_by_v = gFG_capacity_by_v_init;
- bm_print(BM_LOG_CRTI, "[FGADC] HW_FG_FORCE_USE_SW_OCV : HW_SOC=%d, SW_SOC = %d\n",
- gFG_capacity_by_v, gFG_capacity_by_v_init);
- #endif
- /* ------------------------------------------------------------------------------- */
- #endif
- #if defined(CONFIG_POWER_EXT)
- g_rtc_fg_soc = gFG_capacity_by_v;
- #else
- g_rtc_fg_soc = get_rtc_spare_fg_value(); //获取关机前rtc保存的关机前的电量值
- #endif
- #if defined(IS_BATTERY_REMOVE_BY_PMIC)
- sprintf(doddbg,"rtc:%d hwocv:(%d:%d) swocv:(%d,%d) %d battery_remove:%d %d %d %d",g_rtc_fg_soc,gFG_voltage,gFG_capacity_by_v,gFG_voltage_init,gFG_capacity_by_v_init,gFG_capacity_by_sw_ocv,is_battery_remove_pmic(),
- CUST_POWERON_DELTA_CAPACITY_TOLRANCE,CUST_POWERON_LOW_CAPACITY_TOLRANCE,CUST_POWERON_DELTA_HW_SW_OCV_CAPACITY_TOLRANCE);
- /*
- if(is_battery_remove_pmic()==0 && (g_rtc_fg_soc != 0))
- {
- bm_print(BM_LOG_CRTI, "[FGADC]is_battery_remove()==0 , use rtc_fg_soc%d\n",g_rtc_fg_soc);
- gFG_capacity_by_v = g_rtc_fg_soc;
- }
- else
- */
- {
- #if defined(INIT_SOC_BY_SW_SOC)
- if (((g_rtc_fg_soc != 0)
- && (((abs(g_rtc_fg_soc - gFG_capacity_by_v)) <= CUST_POWERON_DELTA_CAPACITY_TOLRANCE)
- || (abs(gFG_capacity_by_v_init - g_rtc_fg_soc) < abs(gFG_capacity_by_v - gFG_capacity_by_v_init))))
- || ((g_rtc_fg_soc != 0)
- && (g_boot_reason == BR_WDT_BY_PASS_PWK || g_boot_reason == BR_WDT
- || g_boot_reason == BR_TOOL_BY_PASS_PWK || g_boot_reason == BR_2SEC_REBOOT
- || g_boot_mode == RECOVERY_BOOT)))
-
- #else //如果关机前电量不等于0,并且关机前的电量和开机后的电量差值小于30,并且当前的电量大于5或者在充电,那么更新电量为关机前的电量,提高用户体验
- if (((g_rtc_fg_soc != 0)
- && (((abs(g_rtc_fg_soc - gFG_capacity_by_v)) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE))
- &&
- ((gFG_capacity_by_v > CUST_POWERON_LOW_CAPACITY_TOLRANCE
- || bat_is_charger_exist() == KAL_TRUE)))
- || ((g_rtc_fg_soc != 0)
- && (g_boot_reason == BR_WDT_BY_PASS_PWK || g_boot_reason == BR_WDT
- || g_boot_reason == BR_TOOL_BY_PASS_PWK || g_boot_reason == BR_2SEC_REBOOT
- || g_boot_mode == RECOVERY_BOOT)))
- #endif
- {
- gFG_capacity_by_v = g_rtc_fg_soc; //更新电量为关机前电量
- }
- else
- {
- if(abs(gFG_capacity_by_v-gFG_capacity_by_sw_ocv)>CUST_POWERON_DELTA_HW_SW_OCV_CAPACITY_TOLRANCE)
- {
- bm_print(BM_LOG_CRTI, "[FGADC] gFG_capacity_by_v=%d, gFG_capacity_by_sw_ocv=%d use SWOCV\n",gFG_capacity_by_v, gFG_capacity_by_sw_ocv);
- gFG_capacity_by_v=gFG_capacity_by_sw_ocv;
- }
- else
- {
- bm_print(BM_LOG_CRTI, "[FGADC] gFG_capacity_by_v=%d, gFG_capacity_by_sw_ocv=%d use HWOCV\n",gFG_capacity_by_v, gFG_capacity_by_sw_ocv);
- }
- }
-
- }
- #else
- #if defined(SOC_BY_HW_FG)
- #if defined(INIT_SOC_BY_SW_SOC)
- if (((g_rtc_fg_soc != 0)
- && (((abs(g_rtc_fg_soc - gFG_capacity_by_v)) <= CUST_POWERON_DELTA_CAPACITY_TOLRANCE)
- || (abs(gFG_capacity_by_v_init - g_rtc_fg_soc) < abs(gFG_capacity_by_v - gFG_capacity_by_v_init))))
- || ((g_rtc_fg_soc != 0)
- && (g_boot_reason == BR_WDT_BY_PASS_PWK || g_boot_reason == BR_WDT
- || g_boot_reason == BR_TOOL_BY_PASS_PWK || g_boot_reason == BR_2SEC_REBOOT
- || g_boot_mode == RECOVERY_BOOT)))
- #else
- if (((g_rtc_fg_soc != 0)
- && (((abs(g_rtc_fg_soc - gFG_capacity_by_v)) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE))
- &&
- ((gFG_capacity_by_v > CUST_POWERON_LOW_CAPACITY_TOLRANCE
- || bat_is_charger_exist() == KAL_TRUE)))
- || ((g_rtc_fg_soc != 0)
- && (g_boot_reason == BR_WDT_BY_PASS_PWK || g_boot_reason == BR_WDT
- || g_boot_reason == BR_TOOL_BY_PASS_PWK || g_boot_reason == BR_2SEC_REBOOT
- || g_boot_mode == RECOVERY_BOOT)))
- #endif
- {
- gFG_capacity_by_v = g_rtc_fg_soc;
- }
- #elif defined(SOC_BY_SW_FG)
- if (((g_rtc_fg_soc != 0)
- && (((abs(g_rtc_fg_soc - gFG_capacity_by_v)) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE)
- || (abs(g_rtc_fg_soc - g_booting_vbat) < CUST_POWERON_DELTA_CAPACITY_TOLRANCE))
- &&
- ((gFG_capacity_by_v > CUST_POWERON_LOW_CAPACITY_TOLRANCE
- || bat_is_charger_exist() == KAL_TRUE)))
- || ((g_rtc_fg_soc != 0)
- && (g_boot_reason == BR_WDT_BY_PASS_PWK || g_boot_reason == BR_WDT
- || g_boot_reason == BR_TOOL_BY_PASS_PWK || g_boot_reason == BR_2SEC_REBOOT
- || g_boot_mode == RECOVERY_BOOT)))
- {
- gFG_capacity_by_v = g_rtc_fg_soc;
- }
- #endif
- #endif
-
- bm_print(BM_LOG_CRTI, "[FGADC] g_rtc_fg_soc=%d, gFG_capacity_by_v=%d\n",
- g_rtc_fg_soc, gFG_capacity_by_v);
- if (gFG_capacity_by_v == 0 && bat_is_charger_exist() == KAL_TRUE) {
- gFG_capacity_by_v = 1;
- bm_print(BM_LOG_CRTI, "[FGADC] gFG_capacity_by_v=%d\n", gFG_capacity_by_v);
- }
- gFG_capacity = gFG_capacity_by_v;
- gFG_capacity_by_c_init = gFG_capacity;
- gFG_capacity_by_c = gFG_capacity;
- gFG_DOD0 = 100 - gFG_capacity; //修改用电深度
- gFG_DOD1 = gFG_DOD0;
- gfg_percent_check_point = gFG_capacity;
- #if defined(CHANGE_TRACKING_POINT)
- gFG_15_vlot = fgauge_read_v_by_capacity((100 - g_tracking_point)); //获取当前电量对应的电压值
- bm_print(BM_LOG_CRTI, "[FGADC] gFG_15_vlot = %dmV\n", gFG_15_vlot);
- #else
- /* gFG_15_vlot = fgauge_read_v_by_capacity(86); //14% */
- gFG_15_vlot = fgauge_read_v_by_capacity((100 - g_tracking_point));
- bm_print(BM_LOG_CRTI, "[FGADC] gFG_15_vlot = %dmV\n", gFG_15_vlot);
- if ((gFG_15_vlot > 3800) || (gFG_15_vlot < 3600)) {
- bm_print(BM_LOG_CRTI, "[FGADC] gFG_15_vlot(%d) over range, reset to 3700\n",
- gFG_15_vlot);
- gFG_15_vlot = 3700;
- }
- #endif
- }
复制代码 分析的结果就是上面这些,不知道分析的有什么误差,现在的话电量显示异常的问题不知道怎么分析了
我知道答案
回答被采纳将会获得 5 RD币 已有1人回答
|
|