#include "bsp/gpio.h" #include "app/sox/measure.h" #include "libs/shark_task.h" #include "libs/logger.h" #include "measure_task.h" #include "state.h" static measure_value_t _measure_value; static measure_notify _current_notify; static measure_notify _voltage_notify; static measure_notify _temperature_notify; /* 测量task,用来定时测量电流,电压,温度等adc数据 */ struct means_task { shark_task_t _task; u32 delay; u8 index; }; static void init_pack_current_task(void); static void init_cell_task(void); static void init_temp_task(void); void measure_task_init(measure_notify cn, measure_notify vn, measure_notify tn){ _current_notify = cn; _voltage_notify = vn; _temperature_notify = tn; measure_adc_init(); init_pack_current_task(); init_cell_task(); init_temp_task(); set_log_level(MOD_MEASURE, L_debug); } measure_value_t * measure_value(void){ return &_measure_value; } /* * 测量总电流,放电和充电 */ static struct means_task _pack_current_task; static u32 pack_current_task_handler(void); static void init_pack_current_task(void){ _pack_current_task._task.handler = pack_current_task_handler; _pack_current_task.delay = 1000; _pack_current_task.index = 0; _measure_value.load_current = get_pack_current(); shark_task_add(&_pack_current_task._task); } static u32 pack_current_task_handler(void){ _measure_value.load_current = get_pack_current(); _current_notify();//通知bms state 有新的电流数据 measure_debug("load current = %f\n", _measure_value.load_current); return _pack_current_task.delay; } /* * 测量电芯电压,计算出总电压 */ static struct means_task _cell_task; static u32 cell_task_handler(void); static void init_cell_task(void){ _cell_task._task.handler = cell_task_handler; _cell_task.delay = 1000; _cell_task.index = 0; for (int i = 0; i < CELLS_NUM; i++){ _measure_value.cell_vol[i] = get_cell_voltage(i); } shark_task_add(&_cell_task._task); } static u32 cell_task_handler(void){ if (bms_state_get()->pack_balancing){ //if balance, do'nt sample cell voltage return _cell_task.delay; } _measure_value.cell_vol[_cell_task.index] = get_cell_voltage(_cell_task.index); measure_debug("cell[%d]=%f\n", _cell_task.index, _measure_value.cell_vol[_cell_task.index]/1000.0f); _cell_task.index = (_cell_task.index + 1) % CELLS_NUM; _voltage_notify();//通知bms state 有新的电压数据 return _cell_task.delay; } /* * 测量4个温度 */ static struct means_task _temp_task; static u32 temp_task_handler(void); static void init_temp_task(void){ _temp_task._task.handler = temp_task_handler; _temp_task.delay = 5 * 1000; _temp_task.index = 0; for (int i = 0; i < PACK_TEMPS_NUM; i++){ _measure_value.pack_temp[i] = get_pack_temperature(i); } shark_task_add(&_temp_task._task); } static u32 temp_task_handler(void){ _measure_value.pack_temp[_temp_task.index] = get_pack_temperature(_temp_task.index); measure_debug("pack temp[%d]=%d\n", _temp_task.index, _measure_value.pack_temp[_temp_task.index]); _temp_task.index = (_temp_task.index + 1) % (PACK_TEMPS_NUM + 1); _temperature_notify();//通知bms state 有新的温度数据 return _temp_task.delay; }