|
@@ -125,7 +125,38 @@ static void PMSM_FOC_Reset_PID(void) {
|
|
|
PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_power, 0);
|
|
PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_power, 0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static void PMSM_FOC_Conf_PID(void) {
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->kp = nv_get_foc_params()->pid_conf[PID_D_id].kp;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->ki = nv_get_foc_params()->pid_conf[PID_D_id].ki;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->kb = nv_get_foc_params()->pid_conf[PID_D_id].kb;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_id->DT = (1.0f/(float)IDQ_CTRL_TS);
|
|
|
|
|
+
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->kp = nv_get_foc_params()->pid_conf[PID_Q_id].kp;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->ki = nv_get_foc_params()->pid_conf[PID_Q_id].ki;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->kb = nv_get_foc_params()->pid_conf[PID_Q_id].kb;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_iq->DT = (1.0f/(float)IDQ_CTRL_TS);
|
|
|
|
|
+
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_trq->kp = nv_get_foc_params()->pid_conf[PID_TRQ_id].kp;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_trq->ki = nv_get_foc_params()->pid_conf[PID_TRQ_id].ki;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_trq->kb = nv_get_foc_params()->pid_conf[PID_TRQ_id].kb;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_trq->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
|
|
+
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->kp = nv_get_foc_params()->pid_conf[PID_Spd_id].kp;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->ki = nv_get_foc_params()->pid_conf[PID_Spd_id].ki;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->kb = nv_get_foc_params()->pid_conf[PID_Spd_id].kb;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
|
|
+
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_power->kp = nv_get_foc_params()->pid_conf[PID_Pow_id].kp;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_power->ki = nv_get_foc_params()->pid_conf[PID_Pow_id].ki;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_power->kb = nv_get_foc_params()->pid_conf[PID_Pow_id].kb;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_power->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
|
|
+
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_lock->kp = nv_get_foc_params()->pid_conf[PID_Lock_id].kp;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_lock->ki = nv_get_foc_params()->pid_conf[PID_Lock_id].ki;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_lock->kb = nv_get_foc_params()->pid_conf[PID_Lock_id].kb;
|
|
|
|
|
+ _gFOC_Ctrl.pi_ctl_lock->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
|
|
|
|
|
|
|
+}
|
|
|
void PMSM_FOC_CoreInit(void) {
|
|
void PMSM_FOC_CoreInit(void) {
|
|
|
Fir_init(&phase1);
|
|
Fir_init(&phase1);
|
|
|
Fir_init(&phase2);
|
|
Fir_init(&phase2);
|
|
@@ -136,6 +167,9 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_trq = &PI_Ctrl_trq;
|
|
_gFOC_Ctrl.pi_ctl_trq = &PI_Ctrl_trq;
|
|
|
_gFOC_Ctrl.pi_ctl_lock = &PI_Ctrl_lock;
|
|
_gFOC_Ctrl.pi_ctl_lock = &PI_Ctrl_lock;
|
|
|
_gFOC_Ctrl.pi_ctl_power = &PI_Ctrl_Power;
|
|
_gFOC_Ctrl.pi_ctl_power = &PI_Ctrl_Power;
|
|
|
|
|
+
|
|
|
|
|
+ PMSM_FOC_Conf_PID();
|
|
|
|
|
+
|
|
|
memset(&_gFOC_Ctrl.in, 0, sizeof(_gFOC_Ctrl.in));
|
|
memset(&_gFOC_Ctrl.in, 0, sizeof(_gFOC_Ctrl.in));
|
|
|
memset(&_gFOC_Ctrl.out, 0, sizeof(_gFOC_Ctrl.out));
|
|
memset(&_gFOC_Ctrl.out, 0, sizeof(_gFOC_Ctrl.out));
|
|
|
memset(&_gFOC_Ctrl.userLim, 0, sizeof(_gFOC_Ctrl.userLim));
|
|
memset(&_gFOC_Ctrl.userLim, 0, sizeof(_gFOC_Ctrl.userLim));
|
|
@@ -157,7 +191,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
|
|
|
|
|
_gFOC_Ctrl.params.n_modulation = nv_get_foc_params()->n_modulation;//SVM_Modulation;
|
|
_gFOC_Ctrl.params.n_modulation = nv_get_foc_params()->n_modulation;//SVM_Modulation;
|
|
|
_gFOC_Ctrl.params.n_PhaseFilterCeof = nv_get_foc_params()->n_PhaseFilterCeof;//(0.2f);
|
|
_gFOC_Ctrl.params.n_PhaseFilterCeof = nv_get_foc_params()->n_PhaseFilterCeof;//(0.2f);
|
|
|
- _gFOC_Ctrl.params.n_TrqVelLimGain = nv_get_foc_params()->n_TrqVelLimGain;
|
|
|
|
|
|
|
+ //_gFOC_Ctrl.params.n_TrqVelLimGain = nv_get_foc_params()->n_TrqVelLimGain;
|
|
|
_gFOC_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
|
|
_gFOC_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
|
|
|
_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
|
_gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
|
|
_gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
|
|
@@ -402,7 +436,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_trq->min = 0; //防止倒转
|
|
_gFOC_Ctrl.pi_ctl_trq->min = 0; //防止倒转
|
|
|
}
|
|
}
|
|
|
float errRef = _gFOC_Ctrl.userLim.s_motRPMLim - _gFOC_Ctrl.in.s_motRPM;
|
|
float errRef = _gFOC_Ctrl.userLim.s_motRPMLim - _gFOC_Ctrl.in.s_motRPM;
|
|
|
- float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_trq, errRef, _gFOC_Ctrl.params.n_TrqVelLimGain);
|
|
|
|
|
|
|
+ float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_trq, errRef);
|
|
|
_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
|
}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
|
|
}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
|
|
|
_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.userLim.s_PhaseCurrLim;
|
|
_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.userLim.s_PhaseCurrLim;
|
|
@@ -416,7 +450,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
|
|
_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
|
|
|
}
|
|
}
|
|
|
float errRef = refSpeed - _gFOC_Ctrl.in.s_motRPM;
|
|
float errRef = refSpeed - _gFOC_Ctrl.in.s_motRPM;
|
|
|
- float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_spd, errRef, _gFOC_Ctrl.params.n_TrqVelLimGain);
|
|
|
|
|
|
|
+ float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_spd, errRef);
|
|
|
_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
|
}
|
|
}
|
|
|
PMSM_FOC_idq_Assign();
|
|
PMSM_FOC_idq_Assign();
|
|
@@ -615,25 +649,10 @@ void PMSM_FOC_LockMotor(bool lock) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_SetSpdPid(float kp, float ki, float max, float min) {
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-void PMSM_FOC_SetIDPid(float kp, float ki, float max, float min) {
|
|
|
|
|
|
|
+void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kb) {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_SetIQPid(float kp, float ki, float max, float min) {
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-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) {
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
void PMSM_FOC_SetErrCode(u8 error) {
|
|
void PMSM_FOC_SetErrCode(u8 error) {
|
|
|
if (_gFOC_Ctrl.out.n_Error != error) {
|
|
if (_gFOC_Ctrl.out.n_Error != error) {
|
|
@@ -645,6 +664,17 @@ u8 PMSM_FOC_GetErrCode(void) {
|
|
|
return _gFOC_Ctrl.out.n_Error;
|
|
return _gFOC_Ctrl.out.n_Error;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void PMSM_FOC_SetCriticalError(u8 err) {
|
|
|
|
|
+ _gFOC_Ctrl.out.n_CritiCalErrMask |= (1u << err);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void PMSM_FOC_ClrCriticalError(u8 err) {
|
|
|
|
|
+ _gFOC_Ctrl.out.n_CritiCalErrMask &= ~(1u << err);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+u32 PMSM_FOC_GetCriticalError(void) {
|
|
|
|
|
+ return _gFOC_Ctrl.out.n_CritiCalErrMask;
|
|
|
|
|
+}
|
|
|
//获取母线电流
|
|
//获取母线电流
|
|
|
float PMSM_FOC_Get_iDC(void) {
|
|
float PMSM_FOC_Get_iDC(void) {
|
|
|
float vd = _gFOC_Ctrl.out.s_OutVdq.d;
|
|
float vd = _gFOC_Ctrl.out.s_OutVdq.d;
|