e_ctrl.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "e_ctrl.h"
  2. #include "foc/foc_config.h"
  3. static e_Ctrl g_eCtrl;
  4. void eCtrl_init(u16 ebrk_time, u16 accl_time){
  5. g_eCtrl.ebrk_time = ebrk_time;
  6. g_eCtrl.accl_time = accl_time;
  7. if (g_eCtrl.accl_time == 0) {
  8. g_eCtrl.accl_time = DEFAULT_D_TIME;
  9. }
  10. if (g_eCtrl.ebrk_time == 0) {
  11. g_eCtrl.ebrk_time = DEFAULT_D_TIME;
  12. }
  13. ramp_ctrl_init(&g_eCtrl.torque_ramp);
  14. ramp_ctrl_init(&g_eCtrl.speed_ramp);
  15. ramp_set_points(&g_eCtrl.torque_ramp, THROTTLE_MIN_IDQ, THROTTLE_MIN_IDQ);
  16. ramp_set_step_value(&g_eCtrl.torque_ramp, TORQUE_STEP);
  17. ramp_set_points(&g_eCtrl.speed_ramp, THROTTLE_MIN_RPM, THROTTLE_MIN_RPM);
  18. ramp_set_step_value(&g_eCtrl.speed_ramp, SPEED_STEP);
  19. }
  20. void eCtrl_set_TrqCurrent(float c) {
  21. ramp_t *ramp = &g_eCtrl.torque_ramp;
  22. float c_now = ramp_get_interpolation(ramp);
  23. float step_val = TORQUE_STEP;
  24. int sign = 1;
  25. if (c < c_now) {
  26. sign = -1;
  27. }
  28. u32 step_count = 1;
  29. u32 step_ms = eCTRL_STEP_TS;
  30. if (sign > 0) { //增加扭矩
  31. step_count = (c - c_now)/TORQUE_STEP + 1;
  32. step_ms = g_eCtrl.accl_time / step_count;
  33. if (step_ms < eCTRL_STEP_TS) {
  34. step_ms = eCTRL_STEP_TS;
  35. step_val = (c - c_now)/(g_eCtrl.accl_time / step_ms);
  36. }
  37. }else if (sign < 0) {
  38. step_count = (c_now - c)/TORQUE_STEP + 1;
  39. step_ms = g_eCtrl.ebrk_time / step_count;
  40. if (step_ms < eCTRL_STEP_TS) {
  41. step_ms = eCTRL_STEP_TS;
  42. step_val = (c_now - c)/(g_eCtrl.ebrk_time / step_ms);
  43. }
  44. }
  45. ramp_set_step_value(ramp, sign * step_val);
  46. ramp_set_step_time(ramp, step_ms);
  47. ramp_set_target(ramp, c);
  48. ramp_exc(ramp);
  49. }
  50. void eCtrl_set_TargetSpeed(float s) {
  51. ramp_t *ramp = &g_eCtrl.speed_ramp;
  52. float s_now = ramp_get_interpolation(ramp);
  53. float step_val = SPEED_STEP;
  54. int sign = 1;
  55. if (s < s_now) {
  56. sign = -1;
  57. }
  58. u32 step_count = 1;
  59. u32 step_ms = eCTRL_STEP_TS;
  60. if (sign > 0) { //加速
  61. step_count = (s - s_now)/SPEED_STEP + 1;
  62. step_ms = g_eCtrl.accl_time / step_count;
  63. if (step_ms < eCTRL_STEP_TS) {
  64. step_ms = eCTRL_STEP_TS;
  65. step_val = (s - s_now)/(g_eCtrl.accl_time / step_ms);
  66. }
  67. }else if (sign < 0) {
  68. step_count = (s_now - s)/SPEED_STEP + 1;
  69. step_ms = g_eCtrl.ebrk_time / step_count;
  70. if (step_ms < eCTRL_STEP_TS) {
  71. step_ms = eCTRL_STEP_TS;
  72. step_val = (s_now - s)/(g_eCtrl.ebrk_time / step_ms);
  73. }
  74. }
  75. ramp_set_step_value(ramp, sign * step_val);
  76. ramp_set_step_time(ramp, step_ms);
  77. ramp_set_target(ramp, s);
  78. ramp_exc(ramp);
  79. }
  80. float eCtrl_get_RefSpd(void) {
  81. return ramp_get_interpolation(&g_eCtrl.speed_ramp);
  82. }
  83. float eCtrl_get_RefTorque(void) {
  84. return ramp_get_interpolation(&g_eCtrl.torque_ramp);
  85. }
  86. float eCtrl_get_FinalSpd(void) {
  87. return ramp_get_target(&g_eCtrl.speed_ramp);
  88. }
  89. float eCtrl_get_FinalTorque(void) {
  90. return ramp_get_target(&g_eCtrl.torque_ramp);
  91. }
  92. void eCtrl_brake_signal(bool hw_brake) {
  93. if (hw_brake != g_eCtrl.hw_brake) {
  94. g_eCtrl.hw_brake = hw_brake;
  95. if (hw_brake) {
  96. g_eCtrl.brake_ts = shark_get_mseconds();
  97. }
  98. }
  99. if (g_eCtrl.hw_brake) {
  100. float ebrk_torque = 0.0f;
  101. float ebrk_speed = 0.0f;
  102. if (shark_get_mseconds() - g_eCtrl.brake_ts >= eCTRL_Brake_TIME) {
  103. if (g_eCtrl.accl_time != DEFAULT_D_TIME) {
  104. ebrk_torque = eCTRL_NEG_TORQUE;
  105. }
  106. }
  107. eCtrl_set_TrqCurrent(ebrk_torque);
  108. eCtrl_set_TargetSpeed(ebrk_speed);
  109. }
  110. }