foc_task.c 1001 B

1234567891011121314151617181920212223242526272829303132
  1. #include "hal/hal.h"
  2. #include "hal/pwm.h"
  3. #include "foc_task.h"
  4. #include "phase_current.h"
  5. #include "park_clark.h"
  6. #include "svpwm.h"
  7. void foc_task(motor_foc_t *foc){
  8. current_samp_t *c_sample = &foc->current_samp;
  9. alpha_beta_t sample_ab, pwm_ab;
  10. dq_t sample_dq, v_dq;
  11. phase_time_t phase_time;
  12. get_phase_current(c_sample);
  13. Clark(c_sample->ia, c_sample->ib, c_sample->ic, &sample_ab);
  14. Park(&sample_ab, foc->motor_s.theta, &sample_dq);
  15. if (foc->mode == FOC_MODE_I_DQ || foc->mode == FOC_MODE_FULL_PI) {
  16. v_dq.d = pi_control(&foc->PI_id, foc->dq_ref.d - sample_dq.d);
  17. v_dq.q = pi_control(&foc->PI_iq, foc->dq_ref.q - sample_dq.q);
  18. }else {
  19. v_dq.d = foc->dq_ref.d;
  20. v_dq.q = foc->dq_ref.q;
  21. }
  22. Rev_Park(&v_dq, foc->motor_s.theta, &pwm_ab);
  23. svpwm(&pwm_ab, foc->vbus, FOC_PWM_period/2, &phase_time, &foc->sector);
  24. u32 sample_point = get_phase_sample_point(c_sample, &phase_time, foc->sector);
  25. PWM_UpdateDuty(phase_time.A, phase_time.B, phase_time.C, sample_point);
  26. }