foc_task.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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 "hall_speed.h"
  7. #include "svpwm.h"
  8. void foc_task(motor_foc_t *foc){
  9. current_samp_t *c_sample = &foc->current_samp;
  10. alpha_beta_t sample_ab, pwm_ab;
  11. dq_t sample_dq, v_dq;
  12. phase_time_t phase_time;
  13. foc->motor_s.theta = hall_sensor_get_theta();
  14. if (foc->override_p.is_override_theta) {
  15. foc->motor_s.theta = foc->override_p.theta;
  16. }
  17. get_phase_current(c_sample);
  18. Clark(c_sample->ia, c_sample->ib, c_sample->ic, &sample_ab);
  19. Park(&sample_ab, foc->motor_s.theta, &sample_dq);
  20. if (foc->mode == FOC_MODE_PI_DQ || foc->mode == FOC_MODE_PI_FULL) {
  21. v_dq.d = pi_control(&foc->PI_id, foc->dq_ref.d - sample_dq.d);
  22. v_dq.q = pi_control(&foc->PI_iq, foc->dq_ref.q - sample_dq.q);
  23. }else {
  24. v_dq.d = foc->dq_ref.d;
  25. v_dq.q = foc->dq_ref.q;
  26. }
  27. if (foc->override_p.is_override_v_dq) {
  28. v_dq.d = foc->override_p.v_dq.d;
  29. v_dq.q = foc->override_p.v_dq.q;
  30. }
  31. Rev_Park(&v_dq, foc->motor_s.theta, &pwm_ab);
  32. svpwm(&pwm_ab, foc->vbus, FOC_PWM_Half_Period, &phase_time, &foc->sector);
  33. u32 sample_point = get_phase_sample_point(c_sample, &phase_time, foc->sector);
  34. PWM_UpdateDuty(phase_time.A, phase_time.B, phase_time.C, sample_point);
  35. }