foc.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. float vol_abc[3]; //相对地电压
  18. float mot_velocity; //from hall or encoder
  19. float mot_angle; //from hall or encoder
  20. lineramp_t target_id;
  21. lineramp_t target_iq;
  22. dq_t target_vol_dq;
  23. float dc_vol;
  24. bool b_openloop;
  25. }foc_in_t;
  26. typedef struct {
  27. u16 duty[3];
  28. u16 low_duty;
  29. u16 mid_duty;
  30. u8 sector;
  31. u8 sample_phase;
  32. u16 sample1;
  33. u16 sample2;
  34. dq_t vol_dq;
  35. dq_t curr_dq;
  36. albt_t vol_albeta;
  37. }foc_out_t;
  38. typedef struct {
  39. foc_in_t in;
  40. foc_out_t out;
  41. float mot_velocity_filterd; //电机滤波后的转速
  42. float mot_vel_radusPers; //电机的电角速度
  43. float ts;
  44. float sin;
  45. float cos;
  46. u32 half_period;
  47. PI_Controller daxis;
  48. PI_Controller qaxis;
  49. }foc_t;
  50. void foc_init(foc_t *foc);
  51. void foc_update(foc_t *foc);
  52. void foc_abc_2_dq(float a, float b, float c, float *d, float *q);
  53. static __INLINE void foc_set_target_idq(foc_t *foc, dq_t *idq) {
  54. line_ramp_set_target(&foc->in.target_id, idq->d);
  55. line_ramp_set_target(&foc->in.target_iq, idq->q);
  56. }
  57. static __INLINE void clark(float A, float B, float C, albt_t *alpha_beta){
  58. alpha_beta->a = A;
  59. alpha_beta->b = ONE_BY_SQRT3 * (B - C);
  60. }
  61. static __INLINE void rev_clark(albt_t *alpha_beta, float *ABC){
  62. ABC[0] = alpha_beta->a;
  63. ABC[1] = -alpha_beta->a * 0.5f + alpha_beta->b * SQRT3_BY_2;
  64. ABC[2] = -alpha_beta->a * 0.5f - alpha_beta->b * SQRT3_BY_2;
  65. }
  66. static __INLINE void rev_park(foc_t *foc, dq_t *dq, albt_t *alpha_beta) {
  67. float c,s;
  68. s = foc->sin;
  69. c = foc->cos;
  70. alpha_beta->a = dq->d * c - dq->q * s;
  71. alpha_beta->b = dq->d * s + dq->q * c;
  72. }
  73. static __INLINE void park(foc_t *foc, albt_t *alpha_beta, dq_t *dq) {
  74. float c,s;
  75. s = foc->sin;
  76. c = foc->cos;
  77. dq->d = alpha_beta->a * c + alpha_beta->b * s;
  78. dq->q = -alpha_beta->a * s + alpha_beta->b * c;
  79. }
  80. #endif /* _FOC_H__ */