foc.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef _FOC_H__
  2. #define _FOC_H__
  3. #include "math/fix_math.h"
  4. #include "foc/core/PI_Controller.h"
  5. typedef struct {
  6. float a;
  7. float b;
  8. }albt_t;
  9. typedef struct {
  10. float d;
  11. float q;
  12. }dq_t;
  13. typedef struct {
  14. float curr_abc[3];
  15. albt_t curr_ab;
  16. float vol_abc[3]; //相对地电压
  17. float mot_velocity; //from hall or encoder
  18. float mot_angle; //from hall or encoder
  19. dq_t target_curr_dq;
  20. dq_t target_vol_dq;
  21. float dc_vol;
  22. bool b_openloop;
  23. }foc_in_t;
  24. typedef struct {
  25. u16 duty[3];
  26. u16 low_duty;
  27. u16 mid_duty;
  28. u8 sector;
  29. u8 sample_phase;
  30. u16 sample1;
  31. u16 sample2;
  32. dq_t vol_dq;
  33. dq_t curr_dq;
  34. albt_t vol_albeta;
  35. }foc_out_t;
  36. typedef struct {
  37. foc_in_t in;
  38. foc_out_t out;
  39. dq_t ramp_curr_dq;
  40. float mot_velocity_filterd; //电机滤波后的转速
  41. float mot_vel_radusPers; //电机的电角速度
  42. float d_ramp_time;
  43. float q_ramp_time;
  44. float ts;
  45. float sin;
  46. float cos;
  47. u32 half_period;
  48. PI_Controller daxis;
  49. PI_Controller qaxis;
  50. }foc_t;
  51. void foc_init(foc_t *foc);
  52. void foc_update(foc_t *foc);
  53. void foc_abc_2_dq(float a, float b, float c, float *d, float *q);
  54. static __INLINE void clark(float A, float B, float C, albt_t *alpha_beta){
  55. alpha_beta->a = A;
  56. alpha_beta->b = ONE_BY_SQRT3 * (B - C);
  57. }
  58. static __INLINE void rev_clark(albt_t *alpha_beta, float *ABC){
  59. ABC[0] = alpha_beta->a;
  60. ABC[1] = -alpha_beta->a * 0.5f + alpha_beta->b * SQRT3_BY_2;
  61. ABC[2] = -alpha_beta->a * 0.5f - alpha_beta->b * SQRT3_BY_2;
  62. }
  63. static __INLINE void rev_park(foc_t *foc, dq_t *dq, albt_t *alpha_beta) {
  64. float c,s;
  65. s = foc->sin;
  66. c = foc->cos;
  67. alpha_beta->a = dq->d * c - dq->q * s;
  68. alpha_beta->b = dq->d * s + dq->q * c;
  69. }
  70. static __INLINE void park(foc_t *foc, albt_t *alpha_beta, dq_t *dq) {
  71. float c,s;
  72. s = foc->sin;
  73. c = foc->cos;
  74. dq->d = alpha_beta->a * c + alpha_beta->b * s;
  75. dq->q = -alpha_beta->a * s + alpha_beta->b * c;
  76. }
  77. #endif /* _FOC_H__ */