|
|
@@ -11,59 +11,58 @@
|
|
|
#include "bsp/pwm.h"
|
|
|
#include "libs/logger.h"
|
|
|
|
|
|
-static PMSM_FOC_Ctrl _gFOC_Ctrl;
|
|
|
+PMSM_FOC_Ctrl _gFOC_Ctrl;
|
|
|
|
|
|
-
|
|
|
-static __INLINE void RevPark(DQ_t *dq, s16q5_t angle, AB_t *alpha_beta) {
|
|
|
- s16q14_t c,s;
|
|
|
+static __INLINE void RevPark(DQ_t *dq, float angle, AB_t *alpha_beta) {
|
|
|
+ float c,s;
|
|
|
SinCos_Lut(angle, &s, &c);
|
|
|
|
|
|
- alpha_beta->a = S16_mul(dq->d, c, 14) - S16_mul(dq->q, s, 14);
|
|
|
- alpha_beta->b = S16_mul(dq->d, s, 14) + S16_mul(dq->q, c, 14);
|
|
|
+ alpha_beta->a = dq->d * c - dq->q * s;
|
|
|
+ alpha_beta->b = dq->d * s + dq->q * c;
|
|
|
}
|
|
|
|
|
|
-static __INLINE void Clark(s16q5_t A, s16q5_t B, s16q5_t C, AB_t *alpha_beta){
|
|
|
- alpha_beta->a = (2 * A - B - C) / 3;
|
|
|
- alpha_beta->b = S16_mul(ONE_BY_SQRT3_Q14, (B - C), 14);
|
|
|
+static __INLINE void Clark(float A, float B, float C, AB_t *alpha_beta){
|
|
|
+ alpha_beta->a = A;
|
|
|
+ alpha_beta->b = ONE_BY_SQRT3 * (B - C);
|
|
|
}
|
|
|
|
|
|
-static __INLINE void Park(AB_t *alpha_beta, s16q5_t angle, DQ_t *dq) {
|
|
|
- s16q14_t c,s;
|
|
|
+static __INLINE void Park(AB_t *alpha_beta, float angle, DQ_t *dq) {
|
|
|
+ float c,s;
|
|
|
SinCos_Lut(angle, &s, &c);
|
|
|
|
|
|
- dq->d = S16_mul(alpha_beta->a, c, 14) + S16_mul(alpha_beta->b, s, 14);
|
|
|
- dq->q = S16_mul(-alpha_beta->a, s, 14) + S16_mul(alpha_beta->b, c, 14);
|
|
|
+ dq->d = alpha_beta->a * c + alpha_beta->b * s;
|
|
|
+ dq->q = -alpha_beta->a * s + alpha_beta->b * c;
|
|
|
}
|
|
|
|
|
|
-static __INLINE s16q14_t Circle_Limitation(DQ_t *vdq, s16q5_t vDC, s16q14_t module, DQ_t *out) {
|
|
|
- u32 sq_vdq = (u32)vdq->d * vdq->d + (u32)vdq->q * vdq->q;
|
|
|
- s16q5_t vDC_m = S16_mul(vDC, module, 14);
|
|
|
- u32 sq_vDC = (u32)vDC_m * vDC_m;
|
|
|
+static __INLINE float Circle_Limitation(DQ_t *vdq, float vDC, float module, DQ_t *out) {
|
|
|
+ float sq_vdq = vdq->d * vdq->d + vdq->q * vdq->q;
|
|
|
+ float vDC_m = vDC * module;
|
|
|
+ float sq_vDC = vDC_m * vDC_m;
|
|
|
if (sq_vdq > sq_vDC) {
|
|
|
- s16q14_t r = S16Q14(sqrtf((float)sq_vDC / (float)sq_vdq));
|
|
|
- out->d = S16_mul(vdq->d, r, 14);
|
|
|
- out->q = S16_mul(vdq->q, r, 14);
|
|
|
+ float r = sqrtf(sq_vDC / sq_vdq);
|
|
|
+ out->d = vdq->d * r;
|
|
|
+ out->q = vdq->q * r;
|
|
|
return r;
|
|
|
}
|
|
|
out->d = vdq->d;
|
|
|
out->q = vdq->q;
|
|
|
- return S16Q14(1); // s16q5 32 means int 1
|
|
|
+ return 1.0f; // s16q5 32 means int 1
|
|
|
}
|
|
|
|
|
|
-static __INLINE void FOC_Set_DqRamp(dq_Rctrl *c, s16q5_t target, int time) {
|
|
|
- s32q14_t cp = c->s_Cp;
|
|
|
- c->s_FinalTgt = (s32)target << 9; // to s32q14
|
|
|
+static __INLINE void FOC_Set_DqRamp(dq_Rctrl *c, float target, int time) {
|
|
|
+ float cp = c->s_Cp;
|
|
|
+ c->s_FinalTgt = target;
|
|
|
c->s_Step = (c->s_FinalTgt - cp) / time;
|
|
|
- if (c->s_Step == 0) {
|
|
|
+ if ((c->s_Step == 0) && (c->s_FinalTgt - cp > 0)) {
|
|
|
if (c->s_FinalTgt - cp > 0) {
|
|
|
- c->s_Step = S32Q14(1);
|
|
|
- }else {
|
|
|
- c->s_Step = S32Q14(-1);
|
|
|
+ c->s_Step = 0.001;
|
|
|
+ }else if (c->s_FinalTgt - cp < 0){
|
|
|
+ c->s_Step = 0.001;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static __INLINE s32q14_t FOC_Get_DqRamp(dq_Rctrl *c) {
|
|
|
+static __INLINE float FOC_Get_DqRamp(dq_Rctrl *c) {
|
|
|
if (++c->n_StepCount == c->n_CtrlCount) {
|
|
|
c->s_Cp += c->s_Step;
|
|
|
if (c->s_Step < 0) {
|
|
|
@@ -88,39 +87,46 @@ static __INLINE void FOC_DqRamp_init(dq_Rctrl *c, int count) {
|
|
|
c->s_Step = 0;
|
|
|
}
|
|
|
|
|
|
-static __INLINE void FOC_Set_iDqRamp(dq_Rctrl *c, s16q5_t target) {
|
|
|
+static __INLINE void FOC_Set_iDqRamp(dq_Rctrl *c, float target) {
|
|
|
FOC_Set_DqRamp(c, target, (IDQ_CTRL_TS/SPD_CTRL_TS - 1));
|
|
|
}
|
|
|
|
|
|
-static __INLINE void FOC_Set_vDqRamp(dq_Rctrl *c, s16q5_t target) {
|
|
|
+static __INLINE void FOC_Set_vDqRamp(dq_Rctrl *c, float target) {
|
|
|
FOC_Set_DqRamp(c, target, (VDQ_RAMP_FINAL_TIME/VDQ_RAMP_TS));
|
|
|
}
|
|
|
|
|
|
|
|
|
static void PMSM_FOC_Reset_PID(void) {
|
|
|
- PI_Controller_Reset(_gFOC_Ctrl.id_ctl, 0);
|
|
|
- PI_Controller_Reset(_gFOC_Ctrl.iq_ctl, 0);
|
|
|
- PI_Controller_Reset(_gFOC_Ctrl.spd_ctl, 0);
|
|
|
- PI_Controller_Reset(_gFOC_Ctrl.fw_ctl, 0);
|
|
|
+ PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_id, 0);
|
|
|
+ PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_iq, 0);
|
|
|
+ PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_spd, 0);
|
|
|
+ PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_fw, 0);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
void PMSM_FOC_CoreInit(void) {
|
|
|
- _gFOC_Ctrl.id_ctl = &PI_Ctrl_ID;
|
|
|
- _gFOC_Ctrl.iq_ctl = &PI_Ctrl_IQ;
|
|
|
- _gFOC_Ctrl.spd_ctl = &PI_Ctrl_Spd;
|
|
|
- _gFOC_Ctrl.fw_ctl = &PI_Ctrl_fw;
|
|
|
+ _gFOC_Ctrl.pi_ctl_id = &PI_Ctrl_ID;
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq = &PI_Ctrl_IQ;
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd = &PI_Ctrl_Spd;
|
|
|
+ _gFOC_Ctrl.pi_ctl_fw = &PI_Ctrl_fw;
|
|
|
memset(&_gFOC_Ctrl.in, 0, sizeof(_gFOC_Ctrl.in));
|
|
|
memset(&_gFOC_Ctrl.out, 0, sizeof(_gFOC_Ctrl.out));
|
|
|
- _gFOC_Ctrl.in.n_poles = 4;
|
|
|
- _gFOC_Ctrl.in.s_maxiDC = S16Q5(MAX_iDQ);
|
|
|
- _gFOC_Ctrl.in.s_maxiDC = S16Q5(MAX_iDC);
|
|
|
- _gFOC_Ctrl.in.s_maxRPM = S32Q14(MAX_SPEED);
|
|
|
- _gFOC_Ctrl.in.s_vDC = S16Q5(MAX_vDC);
|
|
|
- _gFOC_Ctrl.in.n_modulation = S16Q14(0.95f);
|
|
|
+ _gFOC_Ctrl.params.s_maxiDC = (MAX_iDQ);
|
|
|
+ _gFOC_Ctrl.params.s_maxiDC = (MAX_iDC);
|
|
|
+ _gFOC_Ctrl.params.s_maxRPM = (MAX_SPEED);
|
|
|
+ _gFOC_Ctrl.params.n_modulation = SVM_Modulation;
|
|
|
+ _gFOC_Ctrl.params.n_PhaseFilterCeof = (0.2f);
|
|
|
+ _gFOC_Ctrl.params.maxvDQ.d = MAX_vDC;
|
|
|
+ _gFOC_Ctrl.params.minvDQ.d = -MAX_vDC;
|
|
|
+ _gFOC_Ctrl.params.maxvDQ.q = MAX_vDC;
|
|
|
+ _gFOC_Ctrl.params.minvDQ.q = -MAX_vDC;
|
|
|
+ _gFOC_Ctrl.params.s_maxIdq = MAX_iDQ;
|
|
|
+ _gFOC_Ctrl.params.s_minIdq = -MAX_iDQ;
|
|
|
+ _gFOC_Ctrl.params.n_poles = MOTOR_POLES;
|
|
|
_gFOC_Ctrl.out.n_RunMode = OPEN_MODE;
|
|
|
- _gFOC_Ctrl.out.f_vdqRation = S16Q14(0.9f);
|
|
|
+ _gFOC_Ctrl.out.f_vdqRation = 0;
|
|
|
_gFOC_Ctrl.in.s_manualAngle = 0x3D00;
|
|
|
- _gFOC_Ctrl.in.n_PhaseFilterCeof = S16Q10(0.2f);
|
|
|
+ _gFOC_Ctrl.in.s_vDC = (MAX_vDC);
|
|
|
|
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
|
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[1], 1);
|
|
|
@@ -140,44 +146,77 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_hallAngle;
|
|
|
}
|
|
|
|
|
|
- _gFOC_Ctrl.in.s_motRPM = hall_sensor_get_speed();
|
|
|
+ _gFOC_Ctrl.in.s_motRPM = hall_sensor_get_speed() / _gFOC_Ctrl.params.n_poles;
|
|
|
+ _gFOC_Ctrl.in.s_vDC = get_vbus_float();
|
|
|
//sample current
|
|
|
phase_current_get(_gFOC_Ctrl.in.s_iABC);
|
|
|
|
|
|
- LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[0], _gFOC_Ctrl.in.s_iABC[0], 0.2f);
|
|
|
- LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[1], _gFOC_Ctrl.in.s_iABC[1], 0.2f);
|
|
|
- LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[2], _gFOC_Ctrl.in.s_iABC[2], 0.2f);
|
|
|
-
|
|
|
- _gFOC_Ctrl.in.s_vDC = get_vbus_sfix5();
|
|
|
+#ifdef PHASE_LFP
|
|
|
+ LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[0], _gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.params.n_PhaseFilterCeof);
|
|
|
+ LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[1], _gFOC_Ctrl.in.s_iABC[1], _gFOC_Ctrl.params.n_PhaseFilterCeof);
|
|
|
+ LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[2], _gFOC_Ctrl.in.s_iABC[2], _gFOC_Ctrl.params.n_PhaseFilterCeof);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
+static __INLINE void PMSM_FOC_Update_PI_Ctrls(void) {
|
|
|
+ /* update speed pi ctrl */
|
|
|
+ if (_gFOC_Ctrl.params.s_maxIdq != _gFOC_Ctrl.pi_ctl_spd->max) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.params.s_maxIdq;
|
|
|
+ }
|
|
|
+ if (_gFOC_Ctrl.params.s_minIdq != _gFOC_Ctrl.pi_ctl_spd->min) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->min = _gFOC_Ctrl.params.s_minIdq;
|
|
|
+ }
|
|
|
+ /* update id pi ctrl */
|
|
|
+ if (_gFOC_Ctrl.params.maxvDQ.d != _gFOC_Ctrl.pi_ctl_id->max) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->max = _gFOC_Ctrl.params.maxvDQ.d;
|
|
|
+ }
|
|
|
+ if (_gFOC_Ctrl.params.minvDQ.d != _gFOC_Ctrl.pi_ctl_id->min) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->min = _gFOC_Ctrl.params.minvDQ.d;
|
|
|
+ }
|
|
|
+ /* update iq pi ctrl */
|
|
|
+ if (_gFOC_Ctrl.params.maxvDQ.q != _gFOC_Ctrl.pi_ctl_iq->max) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->max = _gFOC_Ctrl.params.maxvDQ.q;
|
|
|
+ }
|
|
|
+ if (_gFOC_Ctrl.params.minvDQ.q != _gFOC_Ctrl.pi_ctl_iq->min) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->min = _gFOC_Ctrl.params.minvDQ.q;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
-static int _g_ctl_count = 0;
|
|
|
-extern int get_hall_stat(int samples);
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
AB_t vAB;
|
|
|
- s16q5_t *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
+#ifdef PHASE_LFP
|
|
|
+ float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
+#else
|
|
|
+ float *iabc = _gFOC_Ctrl.in.s_iABC;
|
|
|
+#endif
|
|
|
+ _gFOC_Ctrl.ctrl_count++;
|
|
|
|
|
|
PMSM_FOC_Update_Hardware();
|
|
|
|
|
|
if (_gFOC_Ctrl.out.n_RunMode != OPEN_MODE) {
|
|
|
+
|
|
|
+ PMSM_FOC_Update_PI_Ctrls();
|
|
|
+
|
|
|
Clark(iabc[0], iabc[1], iabc[2], &vAB);
|
|
|
|
|
|
Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
|
|
|
|
|
|
- s32q14_t err = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[0]) - (_gFOC_Ctrl.out.s_RealIdq.d << 9);
|
|
|
- _gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_run(_gFOC_Ctrl.id_ctl, err);
|
|
|
-
|
|
|
- err = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[1]) - (_gFOC_Ctrl.out.s_RealIdq.q << 9);
|
|
|
- _gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_run(_gFOC_Ctrl.iq_ctl, err);
|
|
|
+ float target_d = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[0]);
|
|
|
+ float err = target_d - _gFOC_Ctrl.out.s_RealIdq.d;
|
|
|
+ _gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_run(_gFOC_Ctrl.pi_ctl_id, err);
|
|
|
+
|
|
|
+ float target_q = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[1]);
|
|
|
+ err = target_q - (_gFOC_Ctrl.out.s_RealIdq.q);
|
|
|
+ _gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_run(_gFOC_Ctrl.pi_ctl_iq, err);
|
|
|
+
|
|
|
}else {
|
|
|
- _gFOC_Ctrl.in.s_targetVdq.d = FOC_Get_DqRamp(&_gFOC_Ctrl.vdq_ctl[0]) >> 9;
|
|
|
- _gFOC_Ctrl.in.s_targetVdq.q = FOC_Get_DqRamp(&_gFOC_Ctrl.vdq_ctl[1]) >> 9;
|
|
|
+ _gFOC_Ctrl.in.s_targetVdq.d = FOC_Get_DqRamp(&_gFOC_Ctrl.vdq_ctl[0]);
|
|
|
+ _gFOC_Ctrl.in.s_targetVdq.q = FOC_Get_DqRamp(&_gFOC_Ctrl.vdq_ctl[1]);
|
|
|
}
|
|
|
- _gFOC_Ctrl.out.f_vdqRation = Circle_Limitation(&_gFOC_Ctrl.in.s_targetVdq, _gFOC_Ctrl.in.s_vDC, _gFOC_Ctrl.in.n_modulation, &_gFOC_Ctrl.out.s_OutVdq);
|
|
|
-
|
|
|
+ _gFOC_Ctrl.out.f_vdqRation = Circle_Limitation(&_gFOC_Ctrl.in.s_targetVdq, _gFOC_Ctrl.in.s_vDC, _gFOC_Ctrl.params.n_modulation, &_gFOC_Ctrl.out.s_OutVdq);
|
|
|
+
|
|
|
RevPark(&_gFOC_Ctrl.out.s_OutVdq, _gFOC_Ctrl.in.s_motAngle, &vAB);
|
|
|
-
|
|
|
+
|
|
|
SVM_Duty_Fix(&vAB, _gFOC_Ctrl.in.s_vDC, FOC_PWM_Half_Period, &_gFOC_Ctrl.out);
|
|
|
|
|
|
phase_current_point(&_gFOC_Ctrl.out);
|
|
|
@@ -185,12 +224,13 @@ void PMSM_FOC_Schedule(void) {
|
|
|
pwm_update_duty(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
pwm_update_sample(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases);
|
|
|
|
|
|
- if (_g_ctl_count++ % 5 == 0) {
|
|
|
- plot_1data16(_gFOC_Ctrl.in.s_motRPM>>5);
|
|
|
- //plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
- //plot_3data16(_gFOC_Ctrl.in.s_hallAngle>>5, _gFOC_Ctrl.in.s_motAngle>>5, get_hall_stat(9)*60);
|
|
|
- //plot_3data16(iabc[0], iabc[1], iabc[2]);
|
|
|
- //plot_3data16(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases * 10 + 3000);
|
|
|
+ if (_gFOC_Ctrl.ctrl_count % 5 == 0) {
|
|
|
+ //plot_2data16(FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
+ plot_1data16(_gFOC_Ctrl.in.s_motRPM);
|
|
|
+ //plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(_gFOC_Ctrl.in.s_motAngle));
|
|
|
+ //plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(_gFOC_Ctrl.in.s_targetVdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d));
|
|
|
+ //plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(iabc[1]), FtoS16(_gFOC_Ctrl.in.s_hallAngle)*10);
|
|
|
+ //plot_1data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -228,10 +268,10 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
/*called in media task */
|
|
|
void PMSM_FOC_idqCalc(void) {
|
|
|
if (_gFOC_Ctrl.out.n_RunMode == TRQ_MODE) {
|
|
|
- _gFOC_Ctrl.in.s_targetTrq = eCtrl_get_RefTorque();
|
|
|
+ _gFOC_Ctrl.in.s_targetTrq = (eCtrl_get_RefTorque());
|
|
|
}else {
|
|
|
- s32q14_t errRef = eCtrl_get_RefSpd() - _gFOC_Ctrl.in.s_motRPM;
|
|
|
- _gFOC_Ctrl.in.s_targetTrq = PI_Controller_run(_gFOC_Ctrl.spd_ctl, errRef);
|
|
|
+ float errRef = min(eCtrl_get_RefSpd(), _gFOC_Ctrl.params.s_maxRPM) - _gFOC_Ctrl.in.s_motRPM;
|
|
|
+ _gFOC_Ctrl.in.s_targetTrq = PI_Controller_run(_gFOC_Ctrl.pi_ctl_spd, errRef);
|
|
|
|
|
|
}
|
|
|
PMSM_FOC_idq_Assign();
|
|
|
@@ -257,19 +297,19 @@ bool PMSM_FOC_Is_Start(void) {
|
|
|
return _gFOC_Ctrl.in.b_motEnable;
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_iBusLimit(s16q5_t ibusLimit) {
|
|
|
- _gFOC_Ctrl.in.s_maxiDC = (ibusLimit);
|
|
|
+void PMSM_FOC_iBusLimit(float ibusLimit) {
|
|
|
+ _gFOC_Ctrl.params.s_maxiDC = (ibusLimit);
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_SpeedLimit(s32q4_t speedLimit) {
|
|
|
- _gFOC_Ctrl.in.s_maxRPM = (speedLimit);
|
|
|
+void PMSM_FOC_SpeedLimit(float speedLimit) {
|
|
|
+ _gFOC_Ctrl.params.s_maxRPM = (speedLimit);
|
|
|
}
|
|
|
|
|
|
s32q4_t PMSM_FOC_GetSpeedLimit(void) {
|
|
|
- return _gFOC_Ctrl.in.s_maxRPM;
|
|
|
+ return _gFOC_Ctrl.params.s_maxRPM;
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_VbusVoltage(s16q5_t vbusVol) {
|
|
|
+void PMSM_FOC_VbusVoltage(float vbusVol) {
|
|
|
_gFOC_Ctrl.in.s_vDC = vbusVol;
|
|
|
}
|
|
|
|
|
|
@@ -277,7 +317,7 @@ void PMSM_FOC_SetCtrlMode(u8 mode) {
|
|
|
_gFOC_Ctrl.in.n_ctlMode = mode;
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_SetOpenVdq(s16q5_t vd, s16q5_t vq) {
|
|
|
+void PMSM_FOC_SetOpenVdq(float vd, float vq) {
|
|
|
FOC_Set_vDqRamp(&_gFOC_Ctrl.vdq_ctl[0], vd);
|
|
|
FOC_Set_vDqRamp(&_gFOC_Ctrl.vdq_ctl[1], vq);
|
|
|
}
|
|
|
@@ -301,7 +341,7 @@ bool PMSM_FOC_Is_CruiseEnabled(void) {
|
|
|
return (_gFOC_Ctrl.in.b_cruiseEna && (_gFOC_Ctrl.out.n_RunMode == SPD_MODE));
|
|
|
}
|
|
|
|
|
|
-bool PMSM_FOC_Set_Speed(s32q4_t rpm) {
|
|
|
+bool PMSM_FOC_Set_Speed(float rpm) {
|
|
|
if (_gFOC_Ctrl.in.b_cruiseEna) {
|
|
|
return false;
|
|
|
}
|
|
|
@@ -323,8 +363,8 @@ bool PMSM_FOC_Set_CruiseSpeed(float rpm) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_Set_Angle(s16 angle) {
|
|
|
- _gFOC_Ctrl.in.s_manualAngle = S16Q5(angle);
|
|
|
+void PMSM_FOC_Set_Angle(float angle) {
|
|
|
+ _gFOC_Ctrl.in.s_manualAngle = (angle);
|
|
|
}
|
|
|
|
|
|
s32q4_t PMSM_FOC_GetSpeed(void) {
|
|
|
@@ -337,24 +377,24 @@ void PMSM_FOC_LockMotor(bool lock) {
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetSpdPid(float kp, float ki, float max, float min) {
|
|
|
- _gFOC_Ctrl.spd_ctl->kp = S32Q14(kp);
|
|
|
- _gFOC_Ctrl.spd_ctl->ki = S32Q14(ki);
|
|
|
- _gFOC_Ctrl.spd_ctl->max = S32Q14(max);
|
|
|
- _gFOC_Ctrl.spd_ctl->min = S32Q14(min);
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->kp = S32Q14(kp);
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->ki = S32Q14(ki);
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->max = S32Q14(max);
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->min = S32Q14(min);
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetIDPid(float kp, float ki, float max, float min) {
|
|
|
- _gFOC_Ctrl.id_ctl->kp = S32Q14(kp);
|
|
|
- _gFOC_Ctrl.id_ctl->ki = S32Q14(ki);
|
|
|
- _gFOC_Ctrl.id_ctl->max = S32Q14(max);
|
|
|
- _gFOC_Ctrl.id_ctl->min = S32Q14(min);
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->kp = S32Q14(kp);
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->ki = S32Q14(ki);
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->max = S32Q14(max);
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->min = S32Q14(min);
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetIQPid(float kp, float ki, float max, float min) {
|
|
|
- _gFOC_Ctrl.iq_ctl->kp = S32Q14(kp);
|
|
|
- _gFOC_Ctrl.iq_ctl->ki = S32Q14(ki);
|
|
|
- _gFOC_Ctrl.iq_ctl->max = S32Q14(max);
|
|
|
- _gFOC_Ctrl.iq_ctl->min = S32Q14(min);
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->kp = S32Q14(kp);
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->ki = S32Q14(ki);
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->max = S32Q14(max);
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->min = S32Q14(min);
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetTrqPid(float kp, float ki, float max, float min) {
|
|
|
@@ -362,10 +402,10 @@ void PMSM_FOC_SetTrqPid(float kp, float ki, float max, float min) {
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetFW_I(float kp, float ki, float max, float min) {
|
|
|
- _gFOC_Ctrl.fw_ctl->kp = S32Q14(kp);
|
|
|
- _gFOC_Ctrl.fw_ctl->ki = S32Q14(ki);
|
|
|
- _gFOC_Ctrl.fw_ctl->max = S32Q14(max);
|
|
|
- _gFOC_Ctrl.fw_ctl->min = S32Q14(min);
|
|
|
+ _gFOC_Ctrl.pi_ctl_fw->kp = S32Q14(kp);
|
|
|
+ _gFOC_Ctrl.pi_ctl_fw->ki = S32Q14(ki);
|
|
|
+ _gFOC_Ctrl.pi_ctl_fw->max = S32Q14(max);
|
|
|
+ _gFOC_Ctrl.pi_ctl_fw->min = S32Q14(min);
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetErrCode(u8 error) {
|