soft_current_protect.c 1.8 KB

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