measure_task.c 2.6 KB

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