soft_current_protect.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <string.h>
  2. #include "bsp/shark_bsp.h"
  3. #include "libs/shark_libs.h"
  4. #include "libs/circle_buffer.h"
  5. #include "libs/logger.h"
  6. #define MAX_SIZE 50
  7. typedef struct {
  8. c_buffer_t current;
  9. c_buffer_t delta_ts;
  10. u32 ts_sum;
  11. u64 last_ts;
  12. float i2t_sum;
  13. }fifo_i2_time_t;
  14. static fifo_i2_time_t _fifo_i2;
  15. static u8 _buffer[MAX_SIZE * 2];
  16. void soft_current_init(void){
  17. _fifo_i2.ts_sum = 0;
  18. _fifo_i2.last_ts = 0;
  19. _fifo_i2.i2t_sum = 0.0f;
  20. circle_buffer_init(&_fifo_i2.current, _buffer, MAX_SIZE);
  21. circle_reset(&_fifo_i2.current);
  22. circle_buffer_init(&_fifo_i2.delta_ts, _buffer + MAX_SIZE, MAX_SIZE);
  23. circle_reset(&_fifo_i2.delta_ts);
  24. }
  25. int soft_current_push(float current_ma){
  26. u8 current = (int)((abs(current_ma)))/1000;
  27. if (current <= MAX_SOFT_CURRENT) {
  28. current = 0; //СÓÚ45A£¬²»¼ÆÈë
  29. }
  30. if (_fifo_i2.last_ts == 0){
  31. circle_put_one_data(&_fifo_i2.current, current);
  32. circle_put_one_data(&_fifo_i2.delta_ts, 15);
  33. }else {
  34. u8 delta_ts = shark_get_mseconds() - _fifo_i2.last_ts;
  35. float ceff = (current * current)/(MAX_I2T);
  36. ceff = ceff * ceff;
  37. _fifo_i2.i2t_sum += (current * current * delta_ts)/1000.0f * ceff;
  38. _fifo_i2.ts_sum += delta_ts;
  39. while ((circle_get_write_space(&_fifo_i2.current) <= 0) || (_fifo_i2.ts_sum > 1000)){
  40. u8 pre_current = 0, pre_ts = 0;
  41. circle_get_one_data(&_fifo_i2.current, &pre_current);
  42. circle_get_one_data(&_fifo_i2.delta_ts, &pre_ts);
  43. ceff = (pre_current * pre_current)/(MAX_I2T);
  44. ceff = ceff * ceff;
  45. _fifo_i2.i2t_sum -= (pre_current * pre_current * pre_ts)/1000.0f * ceff;
  46. _fifo_i2.ts_sum -= pre_ts;
  47. }
  48. circle_put_one_data(&_fifo_i2.current, current);
  49. circle_put_one_data(&_fifo_i2.delta_ts,delta_ts);
  50. }
  51. _fifo_i2.last_ts = shark_get_mseconds();
  52. return (_fifo_i2.i2t_sum >= MAX_I2T); //ÕÛËãµ½1s
  53. }