| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #ifndef _HEALTH_H__
- #define _HEALTH_H__
- #include <stdint.h>
- #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__ */
|