foc.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef _FOC_H__
  2. #define _FOC_H__
  3. #include "math/fix_math.h"
  4. #include "foc/core/PI_Controller.h"
  5. #include "foc/lineramp.h"
  6. typedef struct {
  7. float a;
  8. float b;
  9. }albt_t;
  10. typedef struct {
  11. float d;
  12. float q;
  13. }dq_t;
  14. typedef struct {
  15. float curr_abc[3];
  16. albt_t curr_ab;
  17. albt_t v_ab_inj;
  18. float vol_abc[3]; //相对地电压
  19. float mot_velocity; //from hall or encoder
  20. float mot_angle; //from hall or encoder
  21. lineramp_t target_id;
  22. lineramp_t target_iq;
  23. dq_t target_vol_dq;
  24. float dc_vol;
  25. bool b_openloop;
  26. }foc_in_t;
  27. typedef struct {
  28. u16 duty[3];
  29. u16 low_duty;
  30. u16 mid_duty;
  31. u8 sector;
  32. u8 sample_phase;
  33. u16 sample1;
  34. u16 sample2;
  35. dq_t vol_dq;
  36. dq_t curr_dq;
  37. albt_t vol_albeta;
  38. }foc_out_t;
  39. typedef struct {
  40. foc_in_t in;
  41. foc_out_t out;
  42. float mot_velocity_filterd; //电机滤波后的转速
  43. float mot_vel_radusPers; //电机的电角速度
  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 foc_set_target_idq(foc_t *foc, dq_t *idq) {
  55. line_ramp_set_target(&foc->in.target_id, idq->d);
  56. line_ramp_set_target(&foc->in.target_iq, idq->q);
  57. }
  58. static __INLINE void clark(float A, float B, float C, albt_t *alpha_beta){
  59. alpha_beta->a = A;
  60. alpha_beta->b = ONE_BY_SQRT3 * (B - C);
  61. }
  62. static __INLINE void rev_clark(albt_t *alpha_beta, float *ABC){
  63. ABC[0] = alpha_beta->a;
  64. ABC[1] = -alpha_beta->a * 0.5f + alpha_beta->b * SQRT3_BY_2;
  65. ABC[2] = -alpha_beta->a * 0.5f - alpha_beta->b * SQRT3_BY_2;
  66. }
  67. static __INLINE void rev_park(foc_t *foc, dq_t *dq, albt_t *alpha_beta) {
  68. float c,s;
  69. s = foc->sin;
  70. c = foc->cos;
  71. alpha_beta->a = dq->d * c - dq->q * s;
  72. alpha_beta->b = dq->d * s + dq->q * c;
  73. }
  74. static __INLINE void park(foc_t *foc, albt_t *alpha_beta, dq_t *dq) {
  75. float c,s;
  76. s = foc->sin;
  77. c = foc->cos;
  78. dq->d = alpha_beta->a * c + alpha_beta->b * s;
  79. dq->q = -alpha_beta->a * s + alpha_beta->b * c;
  80. }
  81. #endif /* _FOC_H__ */