优化充电ic参数设置DPM 优化满电判断 3412/1 3412/head 3413/target/1 3414/target/1 3415/target/1
author1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Tue, 12 May 2026 09:11:12 +0000 (17:11 +0800)
committer1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Tue, 12 May 2026 09:11:12 +0000 (17:11 +0800)
code/sdk/zhihui/drivers/charge/hp4570/hp4570.c
code/sdk/zhihui/services/battery/service/battery_driver.cpp
code/sdk/zhihui/services/battery/service/battery_service.cpp

index 3a531ef..c901841 100644 (file)
@@ -163,7 +163,7 @@ bool hp4570n_init(uint8_t chip_ver){
     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
@@ -192,6 +192,11 @@ bool hp4570n_init(uint8_t chip_ver){
   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
@@ -288,6 +293,8 @@ bool hp4570n_init(uint8_t chip_ver){
   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
@@ -1075,7 +1082,7 @@ void hp4570n_reset(void)
   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
@@ -1089,5 +1096,10 @@ void hp4570n_reset(void)
   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
index 76bad1f..e10a88b 100644 (file)
@@ -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;
 }
 
index e26859d..44364c4 100644 (file)
@@ -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++;