|
|
@@ -126,8 +126,8 @@ static void PMSM_FOC_Reset_PID(void) {
|
|
|
ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, 0, 0);
|
|
|
ladrc_reset(&gFoc_Ctrl.vel_adrc, 0, 0);
|
|
|
#else
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_speed, 0);
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_torque, 0);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel, 0);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, 0);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -157,14 +157,14 @@ static void PMSM_FOC_Conf_PID(void) {
|
|
|
ladrc_init(&gFoc_Ctrl.vel_lim_adrc, slow_ctrl_ts, nv_get_foc_params()->f_adrc_vel_lim_Wo, nv_get_foc_params()->f_adrc_vel_lim_Wcv, nv_get_foc_params()->f_adrc_vel_lim_B0);
|
|
|
ladrc_init(&gFoc_Ctrl.vel_adrc, slow_ctrl_ts, nv_get_foc_params()->f_adrc_vel_Wo, nv_get_foc_params()->f_adrc_vel_Wcv, nv_get_foc_params()->f_adrc_vel_B0);
|
|
|
#else
|
|
|
- gFoc_Ctrl.pi_torque.kp = nv_get_foc_params()->pid_conf[PID_TRQ_id].kp;
|
|
|
- gFoc_Ctrl.pi_torque.ki = nv_get_foc_params()->pid_conf[PID_TRQ_id].ki;
|
|
|
- gFoc_Ctrl.pi_torque.kd = nv_get_foc_params()->pid_conf[PID_TRQ_id].kd;
|
|
|
- gFoc_Ctrl.pi_torque.DT = slow_ctrl_ts;
|
|
|
- gFoc_Ctrl.pi_speed.kp = nv_get_foc_params()->pid_conf[PID_Spd_id].kp;
|
|
|
- gFoc_Ctrl.pi_speed.ki = nv_get_foc_params()->pid_conf[PID_Spd_id].ki;
|
|
|
- gFoc_Ctrl.pi_speed.kd = nv_get_foc_params()->pid_conf[PID_Spd_id].kd;
|
|
|
- gFoc_Ctrl.pi_speed.DT = slow_ctrl_ts;
|
|
|
+ gFoc_Ctrl.pi_vel_lim.kp = nv_get_foc_params()->pid_conf[PID_TRQ_id].kp;
|
|
|
+ gFoc_Ctrl.pi_vel_lim.ki = nv_get_foc_params()->pid_conf[PID_TRQ_id].ki;
|
|
|
+ gFoc_Ctrl.pi_vel_lim.kd = nv_get_foc_params()->pid_conf[PID_TRQ_id].kd;
|
|
|
+ gFoc_Ctrl.pi_vel_lim.DT = slow_ctrl_ts;
|
|
|
+ gFoc_Ctrl.pi_vel.kp = nv_get_foc_params()->pid_conf[PID_Spd_id].kp;
|
|
|
+ gFoc_Ctrl.pi_vel.ki = nv_get_foc_params()->pid_conf[PID_Spd_id].ki;
|
|
|
+ gFoc_Ctrl.pi_vel.kd = nv_get_foc_params()->pid_conf[PID_Spd_id].kd;
|
|
|
+ gFoc_Ctrl.pi_vel.DT = slow_ctrl_ts;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -539,23 +539,19 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
//ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, gFoc_Ctrl.in.s_motVelocity, gFoc_Ctrl.in.s_targetTorque);
|
|
|
ladrc_copy(&gFoc_Ctrl.vel_lim_adrc, &gFoc_Ctrl.vel_adrc);
|
|
|
#else
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_torque, gFoc_Ctrl.in.s_targetTorque);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, gFoc_Ctrl.in.s_targetTorque);
|
|
|
#endif
|
|
|
}else if ((preMode == CTRL_MODE_TRQ) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_copy(&gFoc_Ctrl.vel_adrc, &gFoc_Ctrl.vel_lim_adrc);
|
|
|
#else
|
|
|
- float target_troque = gFoc_Ctrl.in.s_targetTorque;
|
|
|
- if (gFoc_Ctrl.pi_id.is_sat || gFoc_Ctrl.pi_iq.is_sat) {
|
|
|
- target_troque = PMSM_FOC_Get_Real_dqVector();
|
|
|
- }
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_speed, target_troque);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel, gFoc_Ctrl.in.s_targetTorque);
|
|
|
#endif
|
|
|
}else if ((preMode == CTRL_MODE_CURRENT) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ)) {
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, gFoc_Ctrl.in.s_motVelocity, gFoc_Ctrl.in.s_targetTorque);
|
|
|
#else
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_torque, gFoc_Ctrl.in.s_targetTorque);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, gFoc_Ctrl.in.s_targetTorque);
|
|
|
#endif
|
|
|
}else if ((preMode != gFoc_Ctrl.out.n_RunMode) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_EBRAKE)) {
|
|
|
eCtrl_reset_Torque(gFoc_Ctrl.in.s_targetTorque);
|
|
|
@@ -564,7 +560,7 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_reset(&gFoc_Ctrl.vel_adrc, 0, F_get_air());
|
|
|
#else
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_torque, F_get_air());
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel, F_get_air());
|
|
|
#endif
|
|
|
}
|
|
|
}
|
|
|
@@ -617,6 +613,7 @@ static void crosszero_step_towards(float *value, float target) {
|
|
|
|
|
|
#define CHANGE_MAX_CNT 3
|
|
|
static __INLINE void PMSM_FOC_VelCtrl_Decide(void) {
|
|
|
+#if 0
|
|
|
static int change_cnt = 0;
|
|
|
static bool change_done = false;
|
|
|
static u32 change_time = 0xFFFFFFFF;
|
|
|
@@ -693,6 +690,7 @@ static __INLINE void PMSM_FOC_VelCtrl_Decide(void) {
|
|
|
change_cnt = 0;
|
|
|
gFoc_Ctrl.out.empty_load = false;
|
|
|
}
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
static __INLINE float PMSM_FOC_Limit_iDC(float maxTrq) {
|
|
|
@@ -711,15 +709,11 @@ static __INLINE float PMSM_FOC_Limit_Speed(float maxTrq) {
|
|
|
ladrc_set_range(&gFoc_Ctrl.vel_lim_adrc, 0, maxTrq);
|
|
|
return ladrc_run(&gFoc_Ctrl.vel_lim_adrc, lim, gFoc_Ctrl.in.s_motVelocity);
|
|
|
#else
|
|
|
-#if 1
|
|
|
- gFoc_Ctrl.pi_torque.max = maxTrq;
|
|
|
- gFoc_Ctrl.pi_torque.min = 0;
|
|
|
+ gFoc_Ctrl.pi_vel_lim.max = maxTrq;
|
|
|
+ gFoc_Ctrl.pi_vel_lim.min = 0;
|
|
|
|
|
|
float err = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motVelocity;
|
|
|
- return PI_Controller_RunLimit(&gFoc_Ctrl.pi_torque, err);
|
|
|
-#else
|
|
|
- return maxTrq;
|
|
|
-#endif
|
|
|
+ return PI_Controller_RunSerial(&gFoc_Ctrl.pi_vel_lim, err);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -798,20 +792,20 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
float maxTrq = ladrc_run(&gFoc_Ctrl.vel_adrc, refSpeed, gFoc_Ctrl.in.s_motVelocity);
|
|
|
#else
|
|
|
if (maxSpeed >= 0) {
|
|
|
- gFoc_Ctrl.pi_speed.max = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
- gFoc_Ctrl.pi_speed.min = -CONFIG_MAX_NEG_TORQUE;
|
|
|
+ gFoc_Ctrl.pi_vel.max = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);
|
|
|
+ gFoc_Ctrl.pi_vel.min = -CONFIG_MAX_NEG_TORQUE;
|
|
|
}else if (maxSpeed < 0) {
|
|
|
- gFoc_Ctrl.pi_speed.min = -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
- gFoc_Ctrl.pi_speed.max = CONFIG_MAX_NEG_TORQUE;
|
|
|
+ gFoc_Ctrl.pi_vel.min = -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);
|
|
|
+ gFoc_Ctrl.pi_vel.max = CONFIG_MAX_NEG_TORQUE;
|
|
|
}
|
|
|
|
|
|
if ((maxSpeed == 0) && (gFoc_Ctrl.in.s_motVelocity < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
|
|
|
- gFoc_Ctrl.pi_speed.max = 0;
|
|
|
- gFoc_Ctrl.pi_speed.min = 0; //防止倒转
|
|
|
+ gFoc_Ctrl.pi_vel.max = 0;
|
|
|
+ gFoc_Ctrl.pi_vel.min = 0; //防止倒转
|
|
|
}
|
|
|
gFoc_Ctrl.in.s_targetRPM = refSpeed;
|
|
|
float errRef = refSpeed - gFoc_Ctrl.in.s_motVelocity;
|
|
|
- float maxTrq = PI_Controller_Run(&gFoc_Ctrl.pi_speed, errRef);
|
|
|
+ float maxTrq = PI_Controller_RunSerial(&gFoc_Ctrl.pi_vel, errRef);
|
|
|
#endif
|
|
|
maxTrq = PMSM_FOC_Limit_iDC(maxTrq);
|
|
|
crosszero_step_towards(&gFoc_Ctrl.in.s_targetTorque, maxTrq);
|
|
|
@@ -856,13 +850,21 @@ void PMSM_FOC_Slow_Task(void) {
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_Change_VelLoop_Params(float wcv, float b0) {
|
|
|
+#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_change_b0(&gFoc_Ctrl.vel_adrc, b0);
|
|
|
ladrc_change_K(&gFoc_Ctrl.vel_adrc, wcv);
|
|
|
+#else
|
|
|
+ PI_Controller_Change_Kpi(&gFoc_Ctrl.pi_vel, wcv, b0);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_Change_TrqLoop_Params(float wcv, float b0) {
|
|
|
+#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_change_b0(&gFoc_Ctrl.vel_lim_adrc, b0);
|
|
|
ladrc_change_K(&gFoc_Ctrl.vel_lim_adrc, wcv);
|
|
|
+#else
|
|
|
+ PI_Controller_Change_Kpi(&gFoc_Ctrl.pi_vel_lim, wcv, b0);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1091,8 +1093,8 @@ void PMSM_FOC_Reset_Torque(void) {
|
|
|
|
|
|
bool PMSM_FOC_Set_CruiseSpeed(float rpm) {
|
|
|
if (PMSM_FOC_Is_CruiseEnabled()) {
|
|
|
- if (rpm < CONFIG_MIN_CRUISE_RPM + 20) {
|
|
|
- rpm = CONFIG_MIN_CRUISE_RPM + 20;
|
|
|
+ if (rpm < CONFIG_MIN_CRUISE_RPM) {
|
|
|
+ rpm = CONFIG_MIN_CRUISE_RPM;
|
|
|
}
|
|
|
gFoc_Ctrl.in.s_cruiseRPM = min(ABS(rpm), gFoc_Ctrl.userLim.s_motRPMLim)*SIGN(rpm);
|
|
|
eRamp_set_step_target(&gFoc_Ctrl.in.cruiseRpmRamp, gFoc_Ctrl.in.s_cruiseRPM, CONFIG_eCTRL_STEP_TS);
|
|
|
@@ -1140,13 +1142,13 @@ void PMSM_FOC_AutoHold(bool lock) {
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, 0, hold_torque);
|
|
|
#else
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_torque, hold_torque);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, hold_torque);
|
|
|
#endif
|
|
|
}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD) {
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_reset(&gFoc_Ctrl.vel_adrc, 0, hold_torque);
|
|
|
#else
|
|
|
- PI_Controller_Reset(&gFoc_Ctrl.pi_speed, hold_torque);
|
|
|
+ PI_Controller_Reset(&gFoc_Ctrl.pi_vel, hold_torque);
|
|
|
#endif
|
|
|
}
|
|
|
eCtrl_reset_Torque(hold_torque);
|
|
|
@@ -1171,11 +1173,11 @@ static PI_Controller *_pid(u8 id) {
|
|
|
pi = &gFoc_Ctrl.pi_iq;
|
|
|
}else if (id == PID_TRQ_id) {
|
|
|
#ifndef CONFIG_SPEED_LADRC
|
|
|
- pi = &gFoc_Ctrl.pi_torque;
|
|
|
+ pi = &gFoc_Ctrl.pi_vel_lim;
|
|
|
#endif
|
|
|
}else if (id == PID_Spd_id) {
|
|
|
#ifndef CONFIG_SPEED_LADRC
|
|
|
- pi = &gFoc_Ctrl.pi_speed;
|
|
|
+ pi = &gFoc_Ctrl.pi_vel;
|
|
|
#endif
|
|
|
}
|
|
|
return pi;
|