#ifndef _HEALTH_H__ #define _HEALTH_H__ #include #include "bsp/shark_bsp.h" #define MAX_CURRENT_FOR_CHARGER (30*1000) //最大充电电流20A #define SIGLE_CELL_MAX_CHARGER_VOLTAGE (3650)//最大允许充电电压,3.9v,考虑到采样的误差取 3.88 #define MAX_CURRENT_FOR_DISCHARGER (120 * 1000) //软件采样的电流保护 #define AUX_SHORT_REAL_DIFF_VOLTAGE (5) //判断小电流是否真实短路的,端口压差 #define AUX_SHORT_DIFF_VOLTAGE (7.5f) //判断小电流是否保护,28欧姆上的电压,能抗300mA /* * xxx_over_temp: 表示过高温(温度过高) * xxx_under_temp: 表示过低温(温度过低) */ typedef struct { union { uint32_t i_status; struct { uint32_t charger_over_voltage:1; uint32_t discharger_lower_voltage:1; //关闭大电流输出 uint32_t small_current_short:1; uint32_t load_current_short:1; //大电短路保护 uint32_t charger_current:1; //不需要 uint32_t discharger_current:1; uint32_t charger_over_current:1; uint32_t discharger_over_current:1; uint32_t res1 :1;//ST_TOTAL_CHRG uint32_t charger_cells_vol_diff_over:1; //充电cell的电压差异超过阈值 uint32_t power_save:1; uint32_t powerdown_lower_voltage:1; uint32_t charger_lower_temp:1; uint32_t discharger_lower_temp:1; uint32_t charger_over_temp:1; uint32_t discharger_over_temp:1; uint32_t sigle_cell_lower_voltage:1; //关闭大电流输出 uint32_t sigle_cell_over_voltage:1; uint32_t discharger_shutpower_voltage:1; //关闭动力 uint32_t discharger_cell_shutpower_voltage:1; //关闭动力 uint32_t hall_is_detected:1; uint32_t lower_temp_deny_charger:1; uint32_t lower_temp_deny_discharger:1; uint32_t over_temp_deny_charger:1; uint32_t over_temp_deny_discharger:1; uint32_t is_work_temp_normal:1; uint32_t small_current_real_short:1; //真实短路 }; }; uint8_t internal_resistance[CELLS_NUM]; //cell's internal resistance uint32_t pd_time; uint32_t b_flags; }bms_health_t; #define B_FLAGS_SINGLE_LOW_CURRENT 0x1 #define B_FLAGS_SINGLE_MID_CURRENT 0x2 #define B_FLAGS_SINGLE_BIG_CURRENT 0x4 #define B_FLAGS_SINGLE_LARGER_CURRENT 0x8 #define B_FLAGS_PACK_LOW_CURRENT 0x10 #define B_FLAGS_PACK_MID_CURRENT 0x20 #define B_FLAGS_PACK_BIG_CURRENT 0x40 #define B_FLAGS_PACK_LARGER_CURRENT 0x80 typedef struct { uint32_t soft_current_short; uint32_t hard_current_short; uint32_t aux_short; uint32_t aux_real_short; uint32_t cell_under_voltage; uint32_t pack_under_voltage; uint32_t discharger_high_temp; uint32_t discharger_lower_temp; uint32_t charger_high_temp; uint32_t charger_lower_temp; uint32_t uart_crc_error; uint32_t uart_len_error; uint32_t uart_dir_error; }error_counts_t; bms_health_t *bms_health(void); void health_init(void); void check_current_state(void); void check_voltage_state(void); void check_temp_state(void); void health_process_aux_lock(void); void health_stop_aux_detect(void); uint32_t bms_health_pack_lower_voltage(void); uint32_t bms_health_cell_lower_voltage(void); void health_log(void); #define health_is_low_current() (bms_health()->b_flags & (B_FLAGS_SINGLE_LOW_CURRENT | B_FLAGS_PACK_LOW_CURRENT)) #define health_is_mid_current() (bms_health()->b_flags & (B_FLAGS_SINGLE_MID_CURRENT | B_FLAGS_PACK_MID_CURRENT)) #define health_is_big_current() (bms_health()->b_flags & (B_FLAGS_SINGLE_BIG_CURRENT | B_FLAGS_PACK_BIG_CURRENT)) #define health_is_larger_current() (bms_health()->b_flags & (B_FLAGS_SINGLE_LARGER_CURRENT | B_FLAGS_PACK_LARGER_CURRENT)) #endif /* _HEALTH_H__ */