|
|
@@ -10,7 +10,6 @@
|
|
|
|
|
|
static PMSM_FOC_Ctrl _gFOC_Ctrl;
|
|
|
|
|
|
-static void PMSM_FOC_idq_Assign(void);
|
|
|
|
|
|
static __INLINE void RevPark(DQ_t *dq, s16q5_t angle, AB_t *alpha_beta) {
|
|
|
s16q14_t c,s;
|
|
|
@@ -48,6 +47,33 @@ static __INLINE s16q5_t Circle_Limitation(DQ_t *vdq, s16q5_t vDC, s16q14_t modul
|
|
|
return 32; // s16q5 32 means int 1
|
|
|
}
|
|
|
|
|
|
+static __INLINE void FOC_Set_DqRamp(idq_Ctrl *c, s16q5_t target) {
|
|
|
+ s32q14_t cp = c->s_Cp;
|
|
|
+ c->s_FinalTgt = (s32)target << 9; // to s32q14
|
|
|
+ c->s_Step = (c->s_FinalTgt - cp) / (IDQ_CTRL_TS/SPD_CTRL_TS);
|
|
|
+ if (c->s_Step == 0) {
|
|
|
+ if (c->s_FinalTgt - cp > 0) {
|
|
|
+ c->s_Step = 1<<14;
|
|
|
+ }else {
|
|
|
+ c->s_Step = -(1 << 14);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static __INLINE s32q14_t FOC_Get_DqRamp(idq_Ctrl *c) {
|
|
|
+ c->s_Cp += c->s_Step;
|
|
|
+ if (c->s_Step < 0) {
|
|
|
+ if (c->s_Cp < c->s_Step) {
|
|
|
+ c->s_Cp = c->s_Step;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ if (c->s_Cp > c->s_Step) {
|
|
|
+ c->s_Cp = c->s_Step;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return c->s_Cp;
|
|
|
+}
|
|
|
+
|
|
|
static void PMSM_FOC_Reset_PID(void) {
|
|
|
PI_Controller_Reset(_gFOC_Ctrl.id_ctl, 0);
|
|
|
PI_Controller_Reset(_gFOC_Ctrl.iq_ctl, 0);
|
|
|
@@ -83,6 +109,14 @@ static __INLINE void PMSM_FOC_Update_Encoder(void) {
|
|
|
_gFOC_Ctrl.in.s_motRPM = hall_sensor_get_speed();
|
|
|
}
|
|
|
|
|
|
+/* MPTA, 弱磁, 功率限制 */
|
|
|
+static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
+ _gFOC_Ctrl.in.s_targetIdq.d = 0;
|
|
|
+ _gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetTrq;
|
|
|
+ FOC_Set_DqRamp(_gFOC_Ctrl.dq_ctl, _gFOC_Ctrl.in.s_targetIdq.d);
|
|
|
+ FOC_Set_DqRamp(_gFOC_Ctrl.dq_ctl+1, _gFOC_Ctrl.in.s_targetIdq.q);
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
AB_t vAB;
|
|
|
@@ -95,10 +129,12 @@ void PMSM_FOC_Schedule(void) {
|
|
|
if (_gFOC_Ctrl.out.n_RunMode != OPEN_MODE) {
|
|
|
Clark(iabc[0], iabc[1], iabc[2], &vAB);
|
|
|
Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
|
|
|
- s32q14_t err = _gFOC_Ctrl.in.s_targetIdq.d - _gFOC_Ctrl.out.s_RealIdq.d;
|
|
|
+
|
|
|
+ s32q14_t err = FOC_Get_DqRamp(_gFOC_Ctrl.dq_ctl) - _gFOC_Ctrl.out.s_RealIdq.d;
|
|
|
err = err << 9; //q5 to q14
|
|
|
_gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_run(_gFOC_Ctrl.id_ctl, err);
|
|
|
- err = _gFOC_Ctrl.in.s_targetIdq.q - _gFOC_Ctrl.out.s_RealIdq.q;
|
|
|
+
|
|
|
+ err = FOC_Get_DqRamp(_gFOC_Ctrl.dq_ctl+1) - _gFOC_Ctrl.out.s_RealIdq.q;
|
|
|
err = err << 9; //q5 to q14
|
|
|
_gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_run(_gFOC_Ctrl.iq_ctl, err);
|
|
|
}
|
|
|
@@ -187,6 +223,7 @@ void PMSM_FOC_SetOpenVdq(s16q5_t vd, s16q5_t vq) {
|
|
|
_gFOC_Ctrl.in.s_targetVdq.q = vq;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
bool PMSM_FOC_EnableCruise(bool enable) {
|
|
|
if (enable != _gFOC_Ctrl.in.b_cruiseEna) {
|
|
|
s32q4_t motSpd = PMSM_FOC_GetSpeed();
|
|
|
@@ -213,8 +250,8 @@ bool PMSM_FOC_Set_Speed(s32q4_t rpm) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-bool PMSM_FOC_Set_Current(float current) {
|
|
|
- eCtrl_set_TrqCurrent(current);
|
|
|
+bool PMSM_FOC_Set_Trque(float Trq) {
|
|
|
+ eCtrl_set_TrqCurrent(Trq);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -308,9 +345,3 @@ void PMSM_FOC_Brake(bool brake) {
|
|
|
eCtrl_brake_signal(brake);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-/* MPTA, 弱磁, 功率限制 */
|
|
|
-static void PMSM_FOC_idq_Assign(void) {
|
|
|
- _gFOC_Ctrl.in.s_targetIdq.d = 0;
|
|
|
- _gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetTrq;
|
|
|
-}
|