return FAIL;\r
}\r
printf("hp4570n_identify(chip_ver) succed !!!! \n");\r
- // hp4570n_reg_rst();\r
+ hp4570n_reg_rst();\r
// Add initialization code here, such as configuring registers\r
hp4570n_set_ceb_en(true);\r
\r
ret = hp4570n_set_low_chrg_idead_mA(29);\r
printf("hp4570n_set_low_chrg_idead_mA(29) ret:%d\n",ret);\r
\r
+ ret = hp4570n_set_vindpm_mV(4500);\r
+ printf("hp4570n_set_vindpm_mV(4500) ret:%d\n",ret);\r
+\r
+ hp4570n_set_vindpm_en(true);\r
+\r
hp4570n_set_rst_vsys_wvbus_en(false);\r
\r
\r
hp4570n_read_reg(hp4570n_REG_CHIP_VER, &value);\r
printf("hp4570n_REG_CHIP_VER : 0x%x\n",value);\r
\r
+ ret = hp4570n_read_status_vindpm();\r
+ printf("hp4570n_read_status_vindpm : 0x%x\n",value);\r
#endif\r
\r
// if( hp4570n_set_chrg_vbat_mV(4012.5) &&\r
printf("hp4570n_set_low_chrg_ipre_mA(30) ret:%d\n",ret);\r
\r
ret = hp4570n_set_chrg_ichg_mA(260);\r
- printf("hp4570n_set_chrg_ichg_mA(400) ret:%d\n",ret);\r
+ printf("hp4570n_set_chrg_ichg_mA(260) ret:%d\n",ret);\r
\r
ret = hp4570n_set_chrg_iterm_mA(30);\r
printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret);\r
ret = hp4570n_set_low_chrg_idead_mA(29);\r
printf("hp4570n_set_low_chrg_idead_mA(29) ret:%d\n",ret);\r
\r
+ ret = hp4570n_set_vindpm_mV(4500);\r
+ printf("hp4570n_set_vindpm_mV(4500) ret:%d\n",ret);\r
+\r
+ hp4570n_set_vindpm_en(true);\r
+\r
hp4570n_set_rst_vsys_wvbus_en(false);\r
}
\ No newline at end of file
// #include "custom_save_runtime.h"
#ifdef ENABLE_HP4570
#include "hp4570.h"
+/** CHG_DONE 且电压不升:连续次数达标后才允许 +1%(周期约 40s 时 3 次≈2min 量级到首次 +1,可调) */
+#define HP4570_CHG_DONE_FLAT_STREAK 3u
+/** 与 ADC/线损及 OCV 曲线对齐:≥4.2 即视为已处尾段;仍依赖 CHG_DONE + 电压不升,不单凭电压 */
+#define HP4570_CHG_DONE_MIN_VOLTAGE_V (4.2f)
#endif
#include "custom_utils.h"
}
}
+#ifdef ENABLE_HP4570
+ /* CHG_DONE 且电压≥HP4570_CHG_DONE_MIN_VOLTAGE_V:连续 HP4570_CHG_DONE_FLAT_STREAK 次采样电压不升,再每次仅 +1% 直至 100 */
+ {
+ static float s_hp4570_chg_done_last_v = -1.0f;
+ static uint8_t s_hp4570_chg_done_flat_cnt = 0;
+ const float k_chg_done_floor_v = HP4570_CHG_DONE_MIN_VOLTAGE_V;
+ const float k_flat_eps_v = 0.0015f; /* 噪声内视为“未升” */
+
+ if (!get_charge_stat() || voltage < k_chg_done_floor_v) {
+ s_hp4570_chg_done_last_v = -1.0f;
+ s_hp4570_chg_done_flat_cnt = 0;
+ } else if (hp4570n_read_chrg_stat_chrg_done()) {
+ if (s_hp4570_chg_done_last_v < 0.0f) {
+ s_hp4570_chg_done_last_v = voltage;
+ s_hp4570_chg_done_flat_cnt = 0;
+ } else {
+ if (voltage <= s_hp4570_chg_done_last_v + k_flat_eps_v) {
+ if (s_hp4570_chg_done_flat_cnt < 250) {
+ s_hp4570_chg_done_flat_cnt++;
+ }
+ } else {
+ s_hp4570_chg_done_flat_cnt = 0;
+ }
+ s_hp4570_chg_done_last_v = voltage;
+ }
+ if (s_hp4570_chg_done_flat_cnt >= HP4570_CHG_DONE_FLAT_STREAK && history_percent < 100) {
+ history_percent++;
+ percent = history_percent;
+ printf("[电池计算] HP4570 CHG_DONE+>=%.1fV 连续电压不升 cnt=%u(>=%u) -> 累加 %% hist=%d\n",
+ HP4570_CHG_DONE_MIN_VOLTAGE_V,
+ (unsigned int)s_hp4570_chg_done_flat_cnt, (unsigned int)HP4570_CHG_DONE_FLAT_STREAK, history_percent);
+ if (history_percent >= 100) {
+ s_hp4570_chg_done_flat_cnt = 0;
+ s_hp4570_chg_done_last_v = -1.0f;
+ }
+ return percent;
+ }
+ } else {
+ s_hp4570_chg_done_last_v = -1.0f;
+ s_hp4570_chg_done_flat_cnt = 0;
+ }
+ }
+#endif
+
return percent;
}
- // if (get_charge_stat() == 1)
+ if (get_charge_stat() == 1)
{
g_charge_wdt_sec_counter++;
if (g_charge_wdt_sec_counter >= WDT_KICK_INTERVAL_SEC)
{
g_charge_wdt_sec_counter = 0;
#if defined(ENABLE_HP4570)
+ // PRINT("[battery] HP4570 WDT fault :%d\r\n",hp4570n_read_status_wdt_fault());
if (hp4570n_read_status_wdt_fault())
{
PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n");
hp4570n_reset();
}
hp4570n_wdt_rst();
+ // PRINT("hp4570n_wdt_rst\r\n");
#elif defined(ENABLE_SGM41562)
sgm41562_wdt_rst();
#endif
}
}
- // else {
- // g_charge_wdt_sec_counter = 0;
- // }
+ else {
+ g_charge_wdt_sec_counter = 0;
+ }
g_check_count++;