|
@@ -511,6 +511,7 @@ void PMSM_FOC_Schedule(void) {
|
|
|
void PMSM_FOC_LogDebug(void) {
|
|
void PMSM_FOC_LogDebug(void) {
|
|
|
sys_debug("DC curr %f --- %f, - %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_CalciDC2, gFoc_Ctrl.hwLim.s_iDCMax);
|
|
sys_debug("DC curr %f --- %f, - %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_CalciDC2, gFoc_Ctrl.hwLim.s_iDCMax);
|
|
|
sys_debug("%s\n", gFoc_Ctrl.out.empty_load?"NoLoad Running":"Load Runing");
|
|
sys_debug("%s\n", gFoc_Ctrl.out.empty_load?"NoLoad Running":"Load Runing");
|
|
|
|
|
+ sys_debug("cruise vel: %d\n", (s16)gFoc_Ctrl.in.s_cruiseRPM);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*called in media task */
|
|
/*called in media task */
|
|
@@ -542,7 +543,6 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
#endif
|
|
#endif
|
|
|
}else if ((preMode == CTRL_MODE_TRQ) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
|
|
}else if ((preMode == CTRL_MODE_TRQ) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
- //ladrc_reset(&gFoc_Ctrl.vel_adrc, gFoc_Ctrl.in.s_motVelocity, gFoc_Ctrl.in.s_targetTorque);
|
|
|
|
|
ladrc_copy(&gFoc_Ctrl.vel_adrc, &gFoc_Ctrl.vel_lim_adrc);
|
|
ladrc_copy(&gFoc_Ctrl.vel_adrc, &gFoc_Ctrl.vel_lim_adrc);
|
|
|
#else
|
|
#else
|
|
|
float target_troque = gFoc_Ctrl.in.s_targetTorque;
|
|
float target_troque = gFoc_Ctrl.in.s_targetTorque;
|
|
@@ -557,16 +557,16 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
#else
|
|
#else
|
|
|
PI_Controller_Reset(&gFoc_Ctrl.pi_torque, gFoc_Ctrl.in.s_targetTorque);
|
|
PI_Controller_Reset(&gFoc_Ctrl.pi_torque, gFoc_Ctrl.in.s_targetTorque);
|
|
|
#endif
|
|
#endif
|
|
|
- }else if ((preMode == CTRL_MODE_TRQ) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_EBRAKE)) {
|
|
|
|
|
-#if 0
|
|
|
|
|
- float real_trq = PMSM_FOC_Get_Real_dqVector() * 0.9f;
|
|
|
|
|
- eCtrl_reset_Current(min(real_trq, gFoc_Ctrl.in.s_targetTorque));
|
|
|
|
|
- eCtrl_set_TgtCurrent(-PMSM_FOC_GetEbrkTorque());
|
|
|
|
|
-#else
|
|
|
|
|
|
|
+ }else if ((preMode != gFoc_Ctrl.out.n_RunMode) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_EBRAKE)) {
|
|
|
eCtrl_reset_Torque(gFoc_Ctrl.in.s_targetTorque);
|
|
eCtrl_reset_Torque(gFoc_Ctrl.in.s_targetTorque);
|
|
|
- eCtrl_set_TgtTorque(-PMSM_FOC_GetEbrkTorque());
|
|
|
|
|
|
|
+ eCtrl_set_TgtTorque(motor_get_ebreak_toruqe(gFoc_Ctrl.in.s_motVelocity));
|
|
|
|
|
+ }else if ((preMode == CTRL_MODE_EBRAKE) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
|
|
|
|
|
+#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());
|
|
|
#endif
|
|
#endif
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return gFoc_Ctrl.out.n_RunMode;
|
|
return gFoc_Ctrl.out.n_RunMode;
|
|
@@ -603,7 +603,6 @@ static void crosszero_step_towards(float *value, float target) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (!cross_zero) {
|
|
if (!cross_zero) {
|
|
|
- //*value = target;
|
|
|
|
|
step_towards(value, target, 2.0f);
|
|
step_towards(value, target, 2.0f);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -628,7 +627,7 @@ static __INLINE void PMSM_FOC_VelCtrl_Decide(void) {
|
|
|
if (f_te <= 0.0f) {
|
|
if (f_te <= 0.0f) {
|
|
|
change_cnt = 0;
|
|
change_cnt = 0;
|
|
|
change_time = 0xFFFFFFFF;
|
|
change_time = 0xFFFFFFFF;
|
|
|
- gFoc_Ctrl.out.empty_load = false;
|
|
|
|
|
|
|
+ //gFoc_Ctrl.out.empty_load = false;
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -636,12 +635,12 @@ static __INLINE void PMSM_FOC_VelCtrl_Decide(void) {
|
|
|
/* 误判空转,发现电机给定的N大于空气阻力,说明不是空转 */
|
|
/* 误判空转,发现电机给定的N大于空气阻力,说明不是空转 */
|
|
|
if (gFoc_Ctrl.out.empty_load) {
|
|
if (gFoc_Ctrl.out.empty_load) {
|
|
|
float f_air = F_get_air();
|
|
float f_air = F_get_air();
|
|
|
- if ((f_accl > 0) && (f_te > (f_air + f_accl))) {
|
|
|
|
|
|
|
+ if ((f_accl > 1.0f) && (f_te >= (f_air + f_accl))) {
|
|
|
change_cnt ++;
|
|
change_cnt ++;
|
|
|
}else {
|
|
}else {
|
|
|
change_cnt = 0;
|
|
change_cnt = 0;
|
|
|
}
|
|
}
|
|
|
- if (change_cnt >= 50) {
|
|
|
|
|
|
|
+ if (change_cnt >= 500) {
|
|
|
gFoc_Ctrl.out.empty_load = false;
|
|
gFoc_Ctrl.out.empty_load = false;
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
|
ladrc_change_b0(&gFoc_Ctrl.vel_lim_adrc, nv_get_foc_params()->f_adrc_vel_lim_B0);
|
|
ladrc_change_b0(&gFoc_Ctrl.vel_lim_adrc, nv_get_foc_params()->f_adrc_vel_lim_B0);
|
|
@@ -661,7 +660,7 @@ static __INLINE void PMSM_FOC_VelCtrl_Decide(void) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ((f_accl > 200.0f) && (f_accl/f_te > 1.5f )) {
|
|
|
|
|
|
|
+ if ((f_accl > 200.0f) && (f_accl/f_te > 3.0f )) {
|
|
|
change_cnt++;
|
|
change_cnt++;
|
|
|
}else if ((F_get_MotAccl() >= 10.0f) && (f_accl/f_te > 1.2f )) {
|
|
}else if ((F_get_MotAccl() >= 10.0f) && (f_accl/f_te > 1.2f )) {
|
|
|
change_cnt = CHANGE_MAX_CNT;
|
|
change_cnt = CHANGE_MAX_CNT;
|
|
@@ -683,7 +682,7 @@ static __INLINE void PMSM_FOC_VelCtrl_Decide(void) {
|
|
|
ladrc_change_b0(&gFoc_Ctrl.vel_adrc, 2500.0f);
|
|
ladrc_change_b0(&gFoc_Ctrl.vel_adrc, 2500.0f);
|
|
|
ladrc_change_K(&gFoc_Ctrl.vel_adrc, 3);
|
|
ladrc_change_K(&gFoc_Ctrl.vel_adrc, 3);
|
|
|
#endif
|
|
#endif
|
|
|
- }else if (!change_done && (change_cnt <= -20)) {
|
|
|
|
|
|
|
+ }else if (!change_done && (change_cnt <= -200)) {
|
|
|
change_done = true;
|
|
change_done = true;
|
|
|
change_cnt = 0;
|
|
change_cnt = 0;
|
|
|
gFoc_Ctrl.out.empty_load = false;
|
|
gFoc_Ctrl.out.empty_load = false;
|
|
@@ -808,7 +807,8 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
float errRef = refSpeed - gFoc_Ctrl.in.s_motVelocity;
|
|
float errRef = refSpeed - gFoc_Ctrl.in.s_motVelocity;
|
|
|
float maxTrq = PI_Controller_Run(&gFoc_Ctrl.pi_speed, errRef);
|
|
float maxTrq = PI_Controller_Run(&gFoc_Ctrl.pi_speed, errRef);
|
|
|
#endif
|
|
#endif
|
|
|
- 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);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
PMSM_FOC_idq_Assign();
|
|
PMSM_FOC_idq_Assign();
|
|
@@ -1014,7 +1014,7 @@ bool PMSM_FOC_EnableCruise(bool enable) {
|
|
|
PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
|
|
PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
- eRamp_init_target2(&gFoc_Ctrl.in.cruiseRpmRamp, motSpd, CONFIG_CRUISE_RAMP_TIME);
|
|
|
|
|
|
|
+ eRamp_reset_target(&gFoc_Ctrl.in.cruiseRpmRamp, motSpd);
|
|
|
gFoc_Ctrl.in.s_cruiseRPM = motSpd;
|
|
gFoc_Ctrl.in.s_cruiseRPM = motSpd;
|
|
|
gFoc_Ctrl.in.b_cruiseEna = enable;
|
|
gFoc_Ctrl.in.b_cruiseEna = enable;
|
|
|
}
|
|
}
|