From 3b054bae54e60a3809033bb91d066653029dbe96 Mon Sep 17 00:00:00 2001 From: 1624952103 Date: Tue, 12 May 2026 17:11:12 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E5=85=85=E7=94=B5ic=E5=8F=82?= =?utf8?q?=E6=95=B0=E8=AE=BE=E7=BD=AEDPM=20=E4=BC=98=E5=8C=96=E6=BB=A1?= =?utf8?q?=E7=94=B5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../sdk/zhihui/drivers/charge/hp4570/hp4570.c | 16 ++++++- .../battery/service/battery_driver.cpp | 48 +++++++++++++++++++ .../battery/service/battery_service.cpp | 10 ++-- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c index 3a531efe7..c90184171 100644 --- a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c +++ b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c @@ -163,7 +163,7 @@ bool hp4570n_init(uint8_t chip_ver){ return FAIL; } printf("hp4570n_identify(chip_ver) succed !!!! \n"); - // hp4570n_reg_rst(); + hp4570n_reg_rst(); // Add initialization code here, such as configuring registers hp4570n_set_ceb_en(true); @@ -192,6 +192,11 @@ bool hp4570n_init(uint8_t chip_ver){ ret = hp4570n_set_low_chrg_idead_mA(29); printf("hp4570n_set_low_chrg_idead_mA(29) ret:%d\n",ret); + ret = hp4570n_set_vindpm_mV(4500); + printf("hp4570n_set_vindpm_mV(4500) ret:%d\n",ret); + + hp4570n_set_vindpm_en(true); + hp4570n_set_rst_vsys_wvbus_en(false); @@ -288,6 +293,8 @@ bool hp4570n_init(uint8_t chip_ver){ hp4570n_read_reg(hp4570n_REG_CHIP_VER, &value); printf("hp4570n_REG_CHIP_VER : 0x%x\n",value); + ret = hp4570n_read_status_vindpm(); + printf("hp4570n_read_status_vindpm : 0x%x\n",value); #endif // if( hp4570n_set_chrg_vbat_mV(4012.5) && @@ -1075,7 +1082,7 @@ void hp4570n_reset(void) printf("hp4570n_set_low_chrg_ipre_mA(30) ret:%d\n",ret); ret = hp4570n_set_chrg_ichg_mA(260); - printf("hp4570n_set_chrg_ichg_mA(400) ret:%d\n",ret); + printf("hp4570n_set_chrg_ichg_mA(260) ret:%d\n",ret); ret = hp4570n_set_chrg_iterm_mA(30); printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret); @@ -1089,5 +1096,10 @@ void hp4570n_reset(void) ret = hp4570n_set_low_chrg_idead_mA(29); printf("hp4570n_set_low_chrg_idead_mA(29) ret:%d\n",ret); + ret = hp4570n_set_vindpm_mV(4500); + printf("hp4570n_set_vindpm_mV(4500) ret:%d\n",ret); + + hp4570n_set_vindpm_en(true); + hp4570n_set_rst_vsys_wvbus_en(false); } \ No newline at end of file diff --git a/code/sdk/zhihui/services/battery/service/battery_driver.cpp b/code/sdk/zhihui/services/battery/service/battery_driver.cpp index 76bad1fe8..e10a88b33 100644 --- a/code/sdk/zhihui/services/battery/service/battery_driver.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_driver.cpp @@ -75,6 +75,10 @@ typedef enum { // #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" @@ -908,6 +912,50 @@ static int battery_get_percent_by_voltage(float voltage) } } +#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; } diff --git a/code/sdk/zhihui/services/battery/service/battery_service.cpp b/code/sdk/zhihui/services/battery/service/battery_service.cpp index e26859dbc..44364c4f7 100644 --- a/code/sdk/zhihui/services/battery/service/battery_service.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_service.cpp @@ -592,27 +592,29 @@ static void battery_check_task(void *arg) - // 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++; -- 2.17.1