foc.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 curr_abc_filter[3];
  41. float curr_abc_dt[3]; //abc phase current for deadtime compesition
  42. float mot_velocity_filterd; //电机滤波后的转速
  43. float mot_vel_radusPers; //电机的电角速度
  44. float d_ramp_time;
  45. float q_ramp_time;
  46. float ts;
  47. float sin;
  48. float cos;
  49. u32 half_period;
  50. PI_Controller daxis;
  51. PI_Controller qaxis;
  52. }foc_t;
  53. void foc_init(foc_t *foc);
  54. void foc_update(foc_t *foc);
  55. void foc_abc_2_dq(float a, float b, float c, float *d, float *q);
  56. static __INLINE void clark(float A, float B, float C, albt_t *alpha_beta){
  57. alpha_beta->a = A;
  58. alpha_beta->b = ONE_BY_SQRT3 * (B - C);
  59. }
  60. static __INLINE void rev_clark(albt_t *alpha_beta, float *ABC){
  61. ABC[0] = alpha_beta->a;
  62. ABC[1] = -alpha_beta->a * 0.5f + alpha_beta->b * SQRT3_BY_2;
  63. ABC[2] = -alpha_beta->a * 0.5f - alpha_beta->b * SQRT3_BY_2;
  64. }
  65. #endif /* _FOC_H__ */