measure_task.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "bsp/gpio.h"
  2. #include "app/sox/measure.h"
  3. #include "libs/shark_task.h"
  4. #include "libs/logger.h"
  5. #include "measure_task.h"
  6. #include "state.h"
  7. static measure_value_t _measure_value;
  8. static measure_notify _current_notify;
  9. static measure_notify _voltage_notify;
  10. static measure_notify _temperature_notify;
  11. /* 测量task,用来定时测量电流,电压,温度等adc数据 */
  12. struct means_task {
  13. shark_task_t _task;
  14. u32 delay;
  15. u8 index;
  16. };
  17. static void init_pack_current_task(void);
  18. static void init_cell_task(void);
  19. static void init_temp_task(void);
  20. void measure_task_init(measure_notify cn, measure_notify vn, measure_notify tn){
  21. _current_notify = cn;
  22. _voltage_notify = vn;
  23. _temperature_notify = tn;
  24. measure_adc_init();
  25. init_pack_current_task();
  26. init_cell_task();
  27. init_temp_task();
  28. set_log_level(MOD_MEASURE, L_debug);
  29. }
  30. measure_value_t * measure_value(void){
  31. return &_measure_value;
  32. }
  33. /*
  34. * 测量总电流,放电和充电
  35. */
  36. static struct means_task _pack_current_task;
  37. static u32 pack_current_task_handler(void);
  38. static void init_pack_current_task(void){
  39. _pack_current_task._task.handler = pack_current_task_handler;
  40. _pack_current_task.delay = 30;
  41. _pack_current_task.index = 0;
  42. _measure_value.load_current = get_pack_current();
  43. shark_task_add(&_pack_current_task._task);
  44. }
  45. static u32 pack_current_task_handler(void){
  46. _measure_value.load_current = get_pack_current();
  47. _current_notify();//通知bms state 有新的电流数据
  48. //measure_debug("load current = %f\n", _measure_value.load_current);
  49. return _pack_current_task.delay;
  50. }
  51. /*
  52. * 测量电芯电压,计算出总电压
  53. */
  54. static struct means_task _cell_task;
  55. static u32 cell_task_handler(void);
  56. static void init_cell_task(void){
  57. _cell_task._task.handler = cell_task_handler;
  58. _cell_task.delay = 30;
  59. _cell_task.index = 0;
  60. for (int i = 0; i < CELLS_NUM; i++){
  61. _measure_value.cell_vol[i] = get_cell_voltage(i);
  62. }
  63. shark_task_add(&_cell_task._task);
  64. }
  65. static u32 cell_task_handler(void){
  66. if (bms_state_get()->pack_balancing){ //if balance, do'nt sample cell voltage
  67. return _cell_task.delay;
  68. }
  69. _measure_value.cell_vol[_cell_task.index] = get_cell_voltage(_cell_task.index);
  70. //measure_debug("cell[%d]=%f\n", _cell_task.index, _measure_value.cell_vol[_cell_task.index]/1000.0f);
  71. _cell_task.index = (_cell_task.index + 1) % CELLS_NUM;
  72. _voltage_notify();//通知bms state 有新的电压数据
  73. return _cell_task.delay;
  74. }
  75. /*
  76. * 测量4个温度
  77. */
  78. static struct means_task _temp_task;
  79. static u32 temp_task_handler(void);
  80. static void init_temp_task(void){
  81. _temp_task._task.handler = temp_task_handler;
  82. _temp_task.delay = 2 * 1000;
  83. _temp_task.index = 0;
  84. for (int i = 0; i < PACK_TEMPS_NUM; i++){
  85. _measure_value.pack_temp[i] = get_pack_temperature(i);
  86. }
  87. shark_task_add(&_temp_task._task);
  88. }
  89. static u32 temp_task_handler(void){
  90. _measure_value.pack_temp[_temp_task.index] = get_pack_temperature(_temp_task.index);
  91. //measure_debug("pack temp[%d]=%d\n", _temp_task.index, _measure_value.pack_temp[_temp_task.index]);
  92. _temp_task.index = (_temp_task.index + 1) % (PACK_TEMPS_NUM);
  93. _temperature_notify();//通知bms state 有新的温度数据
  94. return _temp_task.delay;
  95. }