|
@@ -381,8 +381,8 @@ void PMSM_FOC_Schedule(void) {
|
|
|
pwm_update_sample(gFoc_Ctrl.out.n_Sample1, gFoc_Ctrl.out.n_Sample2, gFoc_Ctrl.out.n_CPhases);
|
|
pwm_update_sample(gFoc_Ctrl.out.n_Sample1, gFoc_Ctrl.out.n_Sample2, gFoc_Ctrl.out.n_CPhases);
|
|
|
|
|
|
|
|
#ifdef NO_SAMPLE_IDC
|
|
#ifdef NO_SAMPLE_IDC
|
|
|
- LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, 0.01f);
|
|
|
|
|
- LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, 0.01f);
|
|
|
|
|
|
|
+ LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, 0.004f);
|
|
|
|
|
+ LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, 0.004f);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
if (gFoc_Ctrl.plot_type != Plot_None) {
|
|
if (gFoc_Ctrl.plot_type != Plot_None) {
|
|
@@ -442,6 +442,31 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
return gFoc_Ctrl.out.n_RunMode;
|
|
return gFoc_Ctrl.out.n_RunMode;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static void crosszero_step_towards(float *value, float target) {
|
|
|
|
|
+ float v_now = *value;
|
|
|
|
|
+ bool cross_zero = false;
|
|
|
|
|
+ if (target > 0) {
|
|
|
|
|
+ if (v_now >= -CONFIG_RAMP_SECOND_TARGET && v_now <= CONFIG_RAMP_SECOND_TARGET*1.5f) {
|
|
|
|
|
+ step_towards(value, target, 0.05f);
|
|
|
|
|
+ cross_zero = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else if (target == 0) {
|
|
|
|
|
+ if (v_now >= 0 && v_now <= CONFIG_RAMP_SECOND_TARGET) {
|
|
|
|
|
+ step_towards(value, target, 0.05f);
|
|
|
|
|
+ cross_zero = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ if (v_now >= -CONFIG_RAMP_SECOND_TARGET && v_now <= CONFIG_RAMP_SECOND_TARGET*1.5f) {
|
|
|
|
|
+ step_towards(value, target, 0.02f);
|
|
|
|
|
+ cross_zero = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!cross_zero) {
|
|
|
|
|
+ *value = target;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
|
|
/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
|
|
|
static __INLINE void PMSM_FOC_FieldWeak(void) {
|
|
static __INLINE void PMSM_FOC_FieldWeak(void) {
|
|
|
if (!gFoc_Ctrl.in.b_fwEnable) {
|
|
if (!gFoc_Ctrl.in.b_fwEnable) {
|
|
@@ -506,14 +531,15 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
float refTorque = min(eCtrl_get_RefTorque(), eRamp_get_intepolation(&gFoc_Ctrl.rtLim.phaseCurrLimRamp));
|
|
float refTorque = min(eCtrl_get_RefTorque(), eRamp_get_intepolation(&gFoc_Ctrl.rtLim.phaseCurrLimRamp));
|
|
|
if (refTorque >= 0) {
|
|
if (refTorque >= 0) {
|
|
|
gFoc_Ctrl.pi_torque->max = refTorque;
|
|
gFoc_Ctrl.pi_torque->max = refTorque;
|
|
|
- gFoc_Ctrl.pi_torque->min = 0;
|
|
|
|
|
|
|
+ gFoc_Ctrl.pi_torque->min = -CONFIG_MAX_NEG_CURRENT;
|
|
|
}else {
|
|
}else {
|
|
|
gFoc_Ctrl.pi_torque->min = refTorque;
|
|
gFoc_Ctrl.pi_torque->min = refTorque;
|
|
|
gFoc_Ctrl.pi_torque->max = 0;
|
|
gFoc_Ctrl.pi_torque->max = 0;
|
|
|
}
|
|
}
|
|
|
float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
|
|
float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
|
|
|
float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
|
|
float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
|
|
|
- gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_iDC(maxTrq);
|
|
|
|
|
|
|
+ maxTrq = PMSM_FOC_Limit_iDC(maxTrq);
|
|
|
|
|
+ crosszero_step_towards(&gFoc_Ctrl.in.s_targetTorque, maxTrq);
|
|
|
}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
|
|
}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
|
|
|
float maxSpeed = eCtrl_get_FinalSpeed();
|
|
float maxSpeed = eCtrl_get_FinalSpeed();
|
|
|
float refSpeed = eCtrl_get_RefSpeed();
|
|
float refSpeed = eCtrl_get_RefSpeed();
|
|
@@ -523,10 +549,10 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
}
|
|
}
|
|
|
if (maxSpeed >= 0) {
|
|
if (maxSpeed >= 0) {
|
|
|
gFoc_Ctrl.pi_speed->max = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.phaseCurrLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
gFoc_Ctrl.pi_speed->max = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.phaseCurrLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
- gFoc_Ctrl.pi_speed->min = -gFoc_Ctrl.userLim.s_PhaseCurreBrkLim;
|
|
|
|
|
|
|
+ gFoc_Ctrl.pi_speed->min = -CONFIG_MAX_NEG_CURRENT;
|
|
|
}else if (maxSpeed < 0) {
|
|
}else if (maxSpeed < 0) {
|
|
|
gFoc_Ctrl.pi_speed->min = -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.phaseCurrLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
gFoc_Ctrl.pi_speed->min = -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.phaseCurrLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
- gFoc_Ctrl.pi_speed->max = gFoc_Ctrl.userLim.s_PhaseCurreBrkLim;
|
|
|
|
|
|
|
+ gFoc_Ctrl.pi_speed->max = CONFIG_MAX_NEG_CURRENT;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if ((maxSpeed == 0) && (gFoc_Ctrl.in.s_motRPM < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
|
|
if ((maxSpeed == 0) && (gFoc_Ctrl.in.s_motRPM < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
|
|
@@ -564,8 +590,8 @@ void PMSM_FOC_RunTime_Limit(void) {
|
|
|
|
|
|
|
|
void PMSM_FOC_Slow_Task(void) {
|
|
void PMSM_FOC_Slow_Task(void) {
|
|
|
eRamp_running(&gFoc_Ctrl.rtLim.phaseCurrLimRamp);
|
|
eRamp_running(&gFoc_Ctrl.rtLim.phaseCurrLimRamp);
|
|
|
- eRamp_running(&gFoc_Ctrl.rtLim.rpmLimRamp);
|
|
|
|
|
eRamp_running(&gFoc_Ctrl.rtLim.DCCurrLimRamp);
|
|
eRamp_running(&gFoc_Ctrl.rtLim.DCCurrLimRamp);
|
|
|
|
|
+ eRamp_running(&gFoc_Ctrl.rtLim.rpmLimRamp);
|
|
|
eRamp_running(&gFoc_Ctrl.in.cruiseRpmRamp);
|
|
eRamp_running(&gFoc_Ctrl.in.cruiseRpmRamp);
|
|
|
|
|
|
|
|
PMSM_FOC_idqCalc();
|
|
PMSM_FOC_idqCalc();
|
|
@@ -622,10 +648,10 @@ float PMSM_FOC_GetDCCurrLimit(void) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PMSM_FOC_SpeedLimit(float speedLimit) {
|
|
void PMSM_FOC_SpeedLimit(float speedLimit) {
|
|
|
- PMSM_FOC_SpeedRampLimit(speedLimit, CONFIG_LIMIT_RAMP_TIME);
|
|
|
|
|
|
|
+ PMSM_FOC_SpeedRampLimit(speedLimit, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_SpeedRampLimit(float speedLimit, u32 rampTime) {
|
|
|
|
|
|
|
+void PMSM_FOC_SpeedRampLimit(float speedLimit, u32 rampAccTime, u32 rampDecTime) {
|
|
|
if (speedLimit > gFoc_Ctrl.hwLim.s_motRPMMax) {
|
|
if (speedLimit > gFoc_Ctrl.hwLim.s_motRPMMax) {
|
|
|
speedLimit = gFoc_Ctrl.hwLim.s_motRPMMax;
|
|
speedLimit = gFoc_Ctrl.hwLim.s_motRPMMax;
|
|
|
}
|
|
}
|
|
@@ -634,7 +660,7 @@ void PMSM_FOC_SpeedRampLimit(float speedLimit, u32 rampTime) {
|
|
|
need_reset = true;
|
|
need_reset = true;
|
|
|
}
|
|
}
|
|
|
gFoc_Ctrl.userLim.s_motRPMLim = (speedLimit);
|
|
gFoc_Ctrl.userLim.s_motRPMLim = (speedLimit);
|
|
|
- eRamp_set_time(&gFoc_Ctrl.rtLim.rpmLimRamp, rampTime, rampTime);
|
|
|
|
|
|
|
+ eRamp_set_time(&gFoc_Ctrl.rtLim.rpmLimRamp, rampAccTime, rampDecTime);
|
|
|
if (need_reset) {
|
|
if (need_reset) {
|
|
|
if ((gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) && gFoc_Ctrl.out.f_vdqRation >= 1.0f) {
|
|
if ((gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) && gFoc_Ctrl.out.f_vdqRation >= 1.0f) {
|
|
|
PI_Controller_Reset(gFoc_Ctrl.pi_torque, gFoc_Ctrl.out.s_RealCurrent);
|
|
PI_Controller_Reset(gFoc_Ctrl.pi_torque, gFoc_Ctrl.out.s_RealCurrent);
|