state.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #ifndef _BMS_STATE_H__
  2. #define _BMS_STATE_H__
  3. #include "bsp/shark_bsp.h"
  4. #include "libs/shark_libs.h"
  5. #ifndef BIT
  6. #define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x)))
  7. #endif
  8. #ifndef BITS
  9. #define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end))))
  10. #endif
  11. #define BATT_USED_BY_NONE 0
  12. #define BATT_USED_BY_MOTOR_BIKE 1
  13. #define BATT_USED_BY_CHARGER_DOCKER 2
  14. #define HATT_USED_BY_CHARGER_BOX 3
  15. #define MIN_DIFF_BT_5238_1180 500
  16. #define MIN_START_CHARGER_CURRENT 300 //ma, 如果有正向超过 MIN_START_CHARGER_CURRENT的电流,认为在充电
  17. #define MIN_START_LOADING_CURRENT 5 //ma, 如果有反向小于 MIN_START_LOADING_CURRENT的电流,认为在放电
  18. #define MAX_DIFF_BETWEEN_MIN_MAX_CELL 100 //0.15v ,压差超过这个值,开始balance
  19. #define MIN_DIFF_BETWEEN_MIN_MAX_CELL 050 //0.05v, 牙差低于这个数据,停止balance
  20. #define MAX_CELL_VOLTAGE_FOR_BALACNE 3600
  21. #define CELL_FUSION_VOLTAGE 3500 //LFP电池在3.5v的时候,开始发散,需要判断是否要balance
  22. typedef struct{
  23. uint16_t charging: 1;
  24. uint16_t pack_balancing:1;
  25. uint16_t ps_charger_in:1; //PS100/360上报充电器是否插入
  26. uint16_t ps_charger_mask; //ps_charger_in是否有效
  27. uint16_t pack_voltage; //电池包的总电压
  28. uint16_t cell_max_vol;
  29. uint16_t cell_min_vol;
  30. uint8_t cell_index_of_max_vol;
  31. uint8_t cell_index_of_min_vol;
  32. int used_by;//where this battery is used for: on motor, on charger docker, on charger box, NONE
  33. uint32_t user_request;
  34. uint32_t work_mode;//正常模式,老化测试模式,pcba测试模测试,整机测试模式
  35. uint8_t bms_addr;
  36. int aging_start_temp[PACK_TEMPS_NUM];
  37. int aging_max_temp[PACK_TEMPS_NUM];
  38. uint32_t aging_real_start;
  39. uint32_t agint_cost_time;
  40. }bms_state_t;
  41. #define WORK_MODE_NORMAL 0 //正常模式
  42. #define WORK_MODE_AGING_TEST 1 //老化测试模式
  43. #define WORK_MODE_PCBA_TEST 2 //PCBA测试模式
  44. #define WORK_MODE_PACK_TEST 3 //整机测试模式
  45. #define WORK_MODE_CALIBRATE 4 //adc校准模式
  46. #define USER_REQUEST_PENDING BIT(31) //是否有用户请求
  47. #define USER_REQUEST_CHARGER_ON BIT(0)
  48. #define USER_REQUEST_CHARGER_OFF BIT(1)
  49. #define USER_REQUEST_DISCHARGER_ON BIT(2)
  50. #define USER_REQUEST_DISCHARGER_OFF BIT(3)
  51. #define USER_REQUEST_SMALLCURRENT_ON BIT(4)
  52. #define USER_REQUEST_SMALLCURRENT_OFF BIT(5)
  53. typedef struct {
  54. shark_timer_t _timer;
  55. int count;
  56. int max_count;
  57. int interval;
  58. }debounce_timer_t;
  59. typedef struct {
  60. int count;
  61. int max_count;
  62. int init_count;
  63. }debounce_t;
  64. /* 充电充满判断OK前,需要经过balance 的判断再决定是否告知充电完成,判断balance前soc会一直在99%
  65. * balance 的时候,不会停止充电,soc一直99%,推出balance后,soc直接到100%
  66. */
  67. typedef enum {
  68. charger_full_fsm_start = 0,
  69. charger_full_fsm_check_balance,
  70. charger_full_fsm_end_balance,
  71. charger_full_fsm_full
  72. }charger_full_fsm_t;
  73. #define debounce_reach_max(dt) (dt.count >= dt.max_count)
  74. #define debounce_reach_zero(dt) (dt.count == 0)
  75. #define debounce_reset(dt) {dt.count = dt.init_count;}
  76. #define debounce_set_count(dt, c) {dt.count = c;}
  77. #define debounce_inc(dt) {if (dt.count < dt.max_count) dt.count++;}
  78. #define debounce_dec(dt) {if (dt.count > 0) dt.count--;}
  79. void bms_state_init(void);
  80. bms_state_t * bms_state_get(void);
  81. int bms_work_mode_set(int mode, int start);
  82. int bms_work_is_normal(void);
  83. int bms_work_is_aging_test(void);
  84. int bms_work_is_pcba_test(void);
  85. int bms_work_is_pack_test(void);
  86. int bms_work_is_calibrating(void);
  87. void charger_open(int open);
  88. void discharger_open(int open);
  89. void start_aux_power(int start);
  90. void bms_set_ps_charger_in(uint16_t mask, uint16_t in);
  91. int bms_is_ps_charger_in(void);
  92. void system_power_down(void);
  93. void bms_state_log(void);
  94. #endif /* _BMS_STATE_H__ */