foc_observer.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "bsp/bsp.h"
  2. #include "foc/core/foc_observer.h"
  3. #include "foc/core/smo_observer.h"
  4. #include "foc/motor/motor.h"
  5. static foc_observer_t foc_obser;
  6. void foc_observer_init(void) {
  7. foc_obser.smo_enabled = false;
  8. foc_obser.smo_used = false;
  9. foc_obser.enc_angle = INVALID_ANGLE;
  10. foc_obser.enc_est_angle = INVALID_ANGLE;
  11. foc_obser.enc_speed = 0;
  12. foc_obser.smo_angle = INVALID_ANGLE;
  13. foc_obser.smo_est_angle = INVALID_ANGLE;
  14. foc_obser.smo_speed = 0;
  15. foc_obser.fusion_ceof = 1.0f;
  16. #ifdef CONFIG_SMO_OBSERVER
  17. smo_observer_init(CONFIG_SMO_PLL_BANDWITH, CONFIG_SMO_LFP_WC, CONFIG_SMO_GAIN_K, CONFIG_SMO_SIGMOID_MAX);
  18. foc_obser.smo_enabled = true;
  19. #endif
  20. }
  21. #define RPM_2_degree(rpm) ((rpm) * 60.0f * nv_get_motor_params()->poles * FOC_CTRL_US)
  22. #if 1
  23. float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
  24. float prev_enc_angle = foc_obser.enc_angle;
  25. float prev_enc_speed = foc_obser.enc_speed;
  26. foc_obser.enc_angle = motor_encoder_get_angle();
  27. foc_obser.enc_speed = motor_encoder_get_speed();
  28. if (!foc_obser.smo_enabled) {
  29. return foc_obser.enc_angle;
  30. }
  31. float est_enc_delta = RPM_2_degree(prev_enc_speed);
  32. float real_enc_delta = foc_obser.enc_angle - prev_enc_angle;
  33. if (real_enc_delta < 0) {
  34. real_enc_delta += 360.0f;
  35. }
  36. float est_ration = real_enc_delta/est_enc_delta;
  37. if (est_ration >= 1.5f || est_ration <= 0.5f) {
  38. foc_obser.fusion_ceof -= 0.1f;
  39. if (foc_obser.fusion_ceof < 0.0f) {
  40. foc_obser.fusion_ceof = 0.0f;
  41. }
  42. if (foc_obser.enc_est_angle == INVALID_ANGLE) {
  43. foc_obser.enc_est_angle = prev_enc_angle;
  44. }else {
  45. foc_obser.enc_est_angle += est_enc_delta;
  46. rand_angle(foc_obser.enc_est_angle);
  47. }
  48. }else {
  49. foc_obser.fusion_ceof += 0.1f;
  50. if (foc_obser.fusion_ceof > 1.0f) {
  51. foc_obser.fusion_ceof = 1.0f;
  52. }
  53. foc_obser.enc_est_angle = foc_obser.enc_angle;
  54. }
  55. foc_obser.smo_est_angle = foc_obser.smo_angle + RPM_2_degree(foc_obser.smo_speed);
  56. foc_obser.smo_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta);
  57. foc_obser.smo_speed = smo_observer_est_rpm();
  58. if (foc_obser.smo_used) {
  59. return foc_obser.smo_angle;
  60. }
  61. #if 0
  62. return (foc_obser.enc_est_angle * foc_obser.fusion_ceof + foc_obser.smo_angle * (1.0f - foc_obser.fusion_ceof));
  63. #else
  64. return foc_obser.enc_angle;
  65. #endif
  66. }
  67. float foc_observer_speed(void) {
  68. if (foc_obser.smo_used) {
  69. return foc_obser.smo_speed;
  70. }
  71. return foc_obser.enc_speed;
  72. }
  73. #else
  74. float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
  75. foc_obser.enc_angle = motor_encoder_get_angle();
  76. foc_obser.enc_speed = motor_encoder_get_speed();
  77. return foc_obser.enc_angle;
  78. }
  79. float foc_observer_speed(void) {
  80. return foc_obser.enc_speed;
  81. }
  82. #endif
  83. bool foc_observer_is_encoder(void) {
  84. return !foc_obser.smo_used;
  85. }
  86. void foc_observer_use_smo(bool use_smo) {
  87. if (foc_obser.smo_enabled) {
  88. foc_obser.smo_used = use_smo;
  89. }else {
  90. foc_obser.smo_used = false;
  91. }
  92. }
  93. void foc_observer_enable_smo(bool enable) {
  94. foc_obser.smo_enabled = enable;
  95. }
  96. float foc_observer_smo_angle(void) {
  97. return foc_obser.smo_angle;
  98. }
  99. float foc_observer_smo_speed(void) {
  100. return foc_obser.smo_speed;
  101. }