foc_observer.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "bsp/bsp_driver.h"
  2. #include "foc/core/foc_observer.h"
  3. #include "foc/core/ladrc_observer.h"
  4. #include "foc/core/smo_observer.h"
  5. #include "foc/motor/motor.h"
  6. static foc_observer_t foc_obser = {
  7. .enc_err_cnt = 0,
  8. .b_force_sensorless = false,
  9. };
  10. void foc_observer_init(void) {
  11. foc_obser.is_sensorless_enable = false;
  12. foc_obser.is_sensorless_running = false;
  13. foc_obser.enc_angle = INVALID_ANGLE;
  14. foc_obser.enc_est_angle = INVALID_ANGLE;
  15. foc_obser.enc_speed = 0;
  16. foc_obser.sensorless_angle = INVALID_ANGLE;
  17. foc_obser.sensorless_est_angle = INVALID_ANGLE;
  18. foc_obser.sensorless_speed = 0;
  19. foc_obser.is_sensorless_stable = false;
  20. foc_obser.sensorless_stable_cnt = 0;
  21. foc_obser.sensorless_unstable_cnt = 0;
  22. #ifdef CONFIG_SMO_OBSERVER
  23. smo_observer_init(CONFIG_SMO_PLL_BANDWITH, CONFIG_SMO_LFP_WC, CONFIG_SMO_GAIN_K, CONFIG_SMO_SIGMOID_MAX);
  24. foc_obser.is_sensorless_enable = true;
  25. #endif
  26. #ifdef CONFIG_LADRC_OBSERVER
  27. ladrc_observer_init(CONFIG_LADRC_OBSERVER_MIN_Wo, CONFIG_LADRC_OBSERVER_MIN_eVEL, CONFIG_LADRC_OBSERVER_LPF_FREQ);
  28. foc_obser.is_sensorless_enable = true;
  29. #endif
  30. }
  31. #define RPM_2_degree(rpm) ((rpm) * 6.0f * mc_conf()->m.poles * FOC_CTRL_US)
  32. float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
  33. foc_obser.sensorless_est_angle = foc_obser.sensorless_angle + RPM_2_degree(foc_obser.sensorless_speed);
  34. #ifdef CONFIG_SMO_OBSERVER
  35. foc_obser.sensorless_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta);
  36. foc_obser.sensorless_speed = smo_observer_vel();
  37. #elif defined CONFIG_LADRC_OBSERVER
  38. foc_obser.sensorless_angle = ladrc_observer_update(uAlp, uBeta, iAlp, iBeta);
  39. foc_obser.sensorless_speed = ladrc_observer_vel();
  40. #endif
  41. return foc_obser.sensorless_angle;
  42. }
  43. bool foc_observer_diagnostic(float enc_angle, float enc_vel) {
  44. if (foc_obser.b_force_sensorless) {
  45. if (foc_obser.is_sensorless_stable) {
  46. if (foc_obser.sensorless_speed <= foc_observer_sensorless_working_speed()/2.0f) {
  47. foc_obser.is_sensorless_stable = false;
  48. }
  49. }
  50. return false;
  51. }
  52. if (enc_vel <= (foc_observer_sensorless_working_speed() - 100.0f)) {
  53. if (!foc_obser.is_sensorless_running) {
  54. if (motor_encoder_may_error()) {
  55. foc_obser.enc_err_cnt++;
  56. foc_obser.is_sensorless_running = true;
  57. }
  58. }
  59. foc_obser.enc_angle = enc_angle;
  60. foc_obser.enc_speed = ABS(enc_vel);
  61. if (!foc_obser.is_sensorless_running) {
  62. return true;
  63. }
  64. if (foc_obser.is_sensorless_stable) {
  65. if (foc_obser.sensorless_speed <= foc_observer_sensorless_working_speed()/2.0f) {
  66. foc_obser.is_sensorless_stable = false;
  67. }
  68. }
  69. return false;
  70. }
  71. if (!foc_obser.is_sensorless_running) {
  72. /* 判断无感算法是否已经稳定跟踪速度 */
  73. if (!foc_obser.is_sensorless_stable) {
  74. float vel_diff_abs = ABS(enc_vel - foc_obser.sensorless_speed);
  75. if (vel_diff_abs < 50) {
  76. foc_obser.sensorless_stable_cnt++;
  77. }else {
  78. foc_obser.sensorless_stable_cnt = 0;
  79. }
  80. if (foc_obser.sensorless_stable_cnt >= 1000) {
  81. foc_obser.is_sensorless_stable = true;
  82. }
  83. }
  84. if (motor_encoder_may_error()) {
  85. foc_obser.enc_err_cnt++;
  86. foc_obser.is_sensorless_running = true;
  87. }
  88. }
  89. foc_obser.enc_angle = enc_angle;
  90. foc_obser.enc_speed = ABS(enc_vel);
  91. return !foc_obser.is_sensorless_running;
  92. }
  93. float foc_observer_speed(void) {
  94. return foc_obser.sensorless_speed;
  95. }
  96. bool foc_observer_is_encoder(void) {
  97. if (foc_obser.b_force_sensorless) {
  98. return false;
  99. }
  100. return !foc_obser.is_sensorless_running;
  101. }
  102. void foc_observer_use_sensorless(bool use_smo) {
  103. if (foc_obser.is_sensorless_enable && use_smo) {
  104. foc_obser.b_force_sensorless = true;
  105. }else {
  106. foc_obser.b_force_sensorless = false;
  107. }
  108. }
  109. void foc_observer_enable_sensorless(bool enable) {
  110. foc_obser.is_sensorless_enable = enable;
  111. }
  112. float foc_observer_sensorless_angle(void) {
  113. return foc_obser.sensorless_angle;
  114. }
  115. float foc_observer_sensorless_speed(void) {
  116. return foc_obser.sensorless_speed;
  117. }
  118. u16 foc_observer_enc_errcount(void) {
  119. return foc_obser.enc_err_cnt;
  120. }
  121. float foc_observer_sensorless_diff(void) {
  122. return foc_obser.real_est_diff;
  123. }
  124. float foc_observer_sensorless_ration(void) {
  125. return foc_obser.real_est_ration;
  126. }
  127. bool foc_observer_sensorless_stable(void) {
  128. return foc_obser.is_sensorless_stable;
  129. }
  130. bool foc_observer_is_force_sensorless(void) {
  131. return foc_obser.b_force_sensorless;
  132. }
  133. float foc_observer_sensorless_working_speed(void) {
  134. #ifdef CONFIG_SMO_OBSERVER
  135. return CONFIG_SMO_MIN_SPEED;
  136. #elif defined CONFIG_LADRC_OBSERVER
  137. return CONFIG_LADRC_OBSERVER_MIN_SPEED;
  138. #else
  139. return 20000.0f;
  140. #endif
  141. }