From 993df99e2d607178a8eb8150ed54af28443b4c2a Mon Sep 17 00:00:00 2001 From: 1624952103 Date: Sat, 9 May 2026 17:53:28 +0800 Subject: [PATCH] =?utf8?q?hp4570=E5=A2=9E=E5=8A=A0=E5=AE=9A=E6=97=B6?= =?utf8?q?=E5=96=82=E7=8B=97=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../sdk/zhihui/drivers/charge/hp4570/hp4570.c | 37 +++++++++++++- .../sdk/zhihui/drivers/charge/hp4570/hp4570.h | 3 ++ .../zhihui/drivers/charge/sgm41562/sgm41562.c | 6 ++- .../zhihui/drivers/charge/sgm41562/sgm41562.h | 2 + .../battery/service/battery_driver.cpp | 39 +++++++++++---- .../battery/service/battery_service.cpp | 50 +++++++++++++++---- 6 files changed, 115 insertions(+), 22 deletions(-) diff --git a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c index 3f568411a..3a531efe7 100644 --- a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c +++ b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c @@ -178,7 +178,7 @@ bool hp4570n_init(uint8_t chip_ver){ 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); @@ -1055,4 +1055,39 @@ uint8_t hp4570n_get_id(void) if(hp4570n_identify(HP4570N) == SUCCESS) id = 0x2; return id; +} + +void hp4570n_reset(void) +{ + printf("hp4570n reset\n"); + hp4570n_reg_rst(); + // Add initialization code here, such as configuring registers + hp4570n_set_ceb_en(true); + + // int ret = hp4570n_set_chrg_vbat_mV(4700.0); + int ret = hp4570n_set_chrg_vbat_mV(4420.0); + printf("hp4570n_set_chrg_vbat_mV ret:%d\n",ret); + + ret = hp4570n_set_high_chrg_ipre_mA(30); + printf("hp4570n_set_high_chrg_ipre_mA(30) ret:%d\n",ret); + + ret = hp4570n_set_low_chrg_ipre_mA(30); + 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); + + ret = hp4570n_set_chrg_iterm_mA(30); + printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret); + + ret = hp4570n_set_iindpm_mA(1000); + printf("hp4570n_set_iindpm_mA(1000) ret:%d\n",ret); + + ret = hp4570n_set_high_chrg_idead_mA(29); + printf("hp4570n_set_high_chrg_idead_mA(29) ret:%d\n",ret); + + ret = hp4570n_set_low_chrg_idead_mA(29); + printf("hp4570n_set_low_chrg_idead_mA(29) ret:%d\n",ret); + + hp4570n_set_rst_vsys_wvbus_en(false); } \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h index 216dae718..7e95e9fc2 100644 --- a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h +++ b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h @@ -524,4 +524,7 @@ void hp4570n_set_iterm_2x_en(bool en);//Terminate charge current X2 enable contr void hp4570n_set_ipre_4x_en(bool en);//Pre-charge current X4 enable control void hp4570n_set_ideadbat_4x_en(bool en);//dead battary charge current X4 enable control uint8_t hp4570n_get_id(void); + +void hp4570n_reset(void); + #endif // HP4570N_CHARGER_H \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c index aa757d77c..32ad8dd10 100644 --- a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c +++ b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c @@ -546,11 +546,15 @@ static int sgm41562_ctrl_setting(enum SGM41562_EN_OPTION options,bool en) printf("[%s] SET fail\n", __func__); return ret; } - printf("[%s] ret=0x%x\n", __func__,ret); + // printf("[%s] ret=0x%x\n", __func__,ret); return ret; } +void sgm41562_wdt_rst(void) +{ + (void)sgm41562_ctrl_setting(REG_BIT_WD_RST, true); +} static int sgm41562_get_state( struct sgm41562_state *state) diff --git a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h index 19460d672..9250c2982 100644 --- a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h +++ b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h @@ -260,4 +260,6 @@ int sgm41562_hw_init(void); void sgm41562_read_all_reg(void); +void sgm41562_wdt_rst(void); + #endif /* _SGM41562_CHARGER_H */ diff --git a/code/sdk/zhihui/services/battery/service/battery_driver.cpp b/code/sdk/zhihui/services/battery/service/battery_driver.cpp index fb9010be6..76bad1fe8 100644 --- a/code/sdk/zhihui/services/battery/service/battery_driver.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_driver.cpp @@ -79,6 +79,9 @@ typedef enum { #include "custom_utils.h" #define AVG_VOLTAGE_COUNT 7 +/** 滑动平均:仅接受该区间内的采样;历史槽中若出现非 0 且越界视为异常并清空环形缓冲 */ +#define BAT_AVG_SAMPLE_VOL_MIN (3.25f) +#define BAT_AVG_SAMPLE_VOL_MAX (4.45f) #pragma pack(1) typedef struct @@ -932,6 +935,21 @@ static errcode_t get_timestampe_ss(uint32_t *tm) return ERRCODE_SUCC; } +/** 非正视为空槽(轮转时写 0);正数且在区间外则为异常历史 */ +static bool bat_vol_history_has_out_of_band(void) +{ + for (int i = 0; i < AVG_VOLTAGE_COUNT; i++) { + float v = bat_vol.history_data[i]; + if (v <= 0.0f) { + continue; + } + if (v < BAT_AVG_SAMPLE_VOL_MIN || v > BAT_AVG_SAMPLE_VOL_MAX) { + return true; + } + } + return false; +} + static void get_avg_voltage(float *vol) { uint32_t current_time = 0; @@ -944,7 +962,7 @@ static void get_avg_voltage(float *vol) sample_time = current_time - history_time; history_time = current_time; - if(sample_time >= 10 && *vol >= 3.25 && *vol <= 4.45) + if(sample_time >= 10 && *vol >= BAT_AVG_SAMPLE_VOL_MIN && *vol <= BAT_AVG_SAMPLE_VOL_MAX) { sample_time = 0; if(bat_vol.vol_num == AVG_VOLTAGE_COUNT) @@ -966,6 +984,14 @@ static void get_avg_voltage(float *vol) if(bat_vol.vol_num > 0) { + if (bat_vol_history_has_out_of_band()) { + PRINT("[battery] history out of band [%.2f,%.2f], reset avg ring\r\n", + (double)BAT_AVG_SAMPLE_VOL_MIN, (double)BAT_AVG_SAMPLE_VOL_MAX); + memset_s(&bat_vol, sizeof(BAT_VOL_T), 0, sizeof(BAT_VOL_T)); + bat_vol.right = -1; + return; + } + if(bat_vol.vol_num > 2) { @@ -973,7 +999,8 @@ static void get_avg_voltage(float *vol) int valid_idx = 0; for (int i = 0; i < AVG_VOLTAGE_COUNT; i++) { - if (bat_vol.history_data[i] >= 3.25 && bat_vol.history_data[i] <= 4.45) + if (bat_vol.history_data[i] >= BAT_AVG_SAMPLE_VOL_MIN && + bat_vol.history_data[i] <= BAT_AVG_SAMPLE_VOL_MAX) { valid_data[valid_idx++] = bat_vol.history_data[i]; sum_vol+=bat_vol.history_data[i]; @@ -998,14 +1025,6 @@ static void get_avg_voltage(float *vol) bat_vol.avg_vol = sum_vol / valid_idx; } - if(sum_vol != bat_vol.sum_vol) - { - printf("sum_vol:%.3f != bat_vol.sum_vol:%.3f\n",sum_vol,bat_vol.sum_vol); - // bat_vol.sum_vol = sum_vol; - memset_s(&bat_vol,sizeof(BAT_VOL_T),0,sizeof(BAT_VOL_T)); - bat_vol.right = -1; - } - } else { bat_vol.avg_vol = bat_vol.sum_vol / bat_vol.vol_num; diff --git a/code/sdk/zhihui/services/battery/service/battery_service.cpp b/code/sdk/zhihui/services/battery/service/battery_service.cpp index bcce40618..65eb5413c 100644 --- a/code/sdk/zhihui/services/battery/service/battery_service.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_service.cpp @@ -55,7 +55,9 @@ extern "C" { #define BAT_FILE_PATH "user/userdata/bat_data.bin" -#define CHARGE_1C (260.0f) +#define CHARGE_1C_MA (260u) +#define CHARGE_02C_MA ((CHARGE_1C_MA * 2u) / 10u) /* 52 */ +#define CHARGE_05C_MA ((CHARGE_1C_MA) / 2u) /* 130 */ bool batteryservice_get_voltage_by_channel(float *voltage, uint8_t channel); battery_info_t *get_current_battery_info(void); @@ -112,6 +114,10 @@ static unsigned long g_app_queue = 0xFFFFFFFF; static uint8_t g_check_count = 0; +#define WDT_KICK_INTERVAL_SEC 30u +static uint8_t g_charge_wdt_sec_counter = 0; + + static void battery_check_timer_callback(void* data); errcode_t charger_plug_event_notify(uint8_t plugged); errcode_t charger_plug_event_ui_sendmsg_toUI(uint8_t plugged); @@ -376,7 +382,7 @@ static void battery_check_chargement(void) // printf("bat_temp:%f\n",bat_temp); // bat_temp = -10; - float charge_mA = 0; + uint16_t charge_mA = 0; if(bat_temp >= BATTERY_DISABLE_CHARGE_HI_TEMP_VALUE || bat_temp <= BATTERY_DISABLE_CHARGE_LOW_TEMP_VALUE) { @@ -459,31 +465,28 @@ static void battery_check_chargement(void) if(bat_temp >= 0 && bat_temp < 15) { #ifdef ENABLE_HP4570 - charge_mA = 0.2 * CHARGE_1C; - // hp4570_set_chrg_ichg_mA(0.2 * CHARGE_1C); + charge_mA = CHARGE_02C_MA; #endif } else if((bat_temp >= 15 && bat_temp < 25) || (bat_temp >= 45 && bat_temp < 60)) { #ifdef ENABLE_HP4570 - // hp4570_set_chrg_ichg_mA(0.5 * CHARGE_1C); - charge_mA = 0.5 * CHARGE_1C; + charge_mA = CHARGE_05C_MA; #endif } else if(bat_temp >= 25 && bat_temp < 45) { #ifdef ENABLE_HP4570 - // hp4570_set_chrg_ichg_mA(CHARGE_1C); - charge_mA = CHARGE_1C; + charge_mA = CHARGE_1C_MA; #endif } if(charge_mA != last_charge_mA) { - last_charge_mA = (uint16_t)charge_mA; + last_charge_mA = charge_mA; // printf("last_charge_mA : %d\n",last_charge_mA); #ifdef ENABLE_HP4570 - hp4570n_set_chrg_ichg_mA(charge_mA); + hp4570n_set_chrg_ichg_mA(last_charge_mA); #endif } @@ -588,6 +591,30 @@ static void battery_check_task(void *arg) if (mail.comm.event == BATTERY_CMD_CHECK_VOLTAGE) { + + // 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) + hp4570n_wdt_rst(); + if (hp4570n_read_status_wdt_fault()) + { + PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n"); + hp4570n_reset(); + } +#elif defined(ENABLE_SGM41562) + sgm41562_wdt_rst(); +#endif + } + } + // else { + // g_charge_wdt_sec_counter = 0; + // } + + g_check_count++; // PRINT("BATTERY_CMD_CHECK_VOLTAGE g_check_count %d\r\n",g_check_count); if(last_battery_charge_enable_status == true){ @@ -628,6 +655,9 @@ static void battery_check_task(void *arg) charger_plug_event_ui_sendmsg_toUI(1); // 记录一次充电线插入时刻的电池数据,用于后续统计充电时间 battery_save_data(); +#ifdef ENABLE_HP4570 + hp4570n_reset(); +#endif }else if (mail.comm.event == BATTERY_CMD_CHARGE_UNPLUG) { // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI unplugged \n"); oncharging_status = 0; -- 2.17.1