|
@@ -46,6 +46,7 @@ static m_contrl_t motor = {
|
|
|
.mos_lim = 0,
|
|
.mos_lim = 0,
|
|
|
.motor_lim = 0,
|
|
.motor_lim = 0,
|
|
|
.b_ind_start = false,
|
|
.b_ind_start = false,
|
|
|
|
|
+ .s_target_speed = MAX_S16,
|
|
|
.u_set.idc_lim = IDC_USER_LIMIT_NONE,
|
|
.u_set.idc_lim = IDC_USER_LIMIT_NONE,
|
|
|
.u_set.ebrk_lvl = 0,
|
|
.u_set.ebrk_lvl = 0,
|
|
|
.u_set.n_brkShutPower = CONFIG_Settings_BrkShutPower,
|
|
.u_set.n_brkShutPower = CONFIG_Settings_BrkShutPower,
|
|
@@ -482,6 +483,14 @@ bool mc_enable_cruise(bool enable) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool mc_set_target_vel(s16 vel) {
|
|
|
|
|
+ if (motor.mode != CTRL_MODE_SPD || mc_is_epm()) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ motor.s_target_speed = vel;
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool mc_is_cruise_enabled(void) {
|
|
bool mc_is_cruise_enabled(void) {
|
|
|
return motor.b_cruise;
|
|
return motor.b_cruise;
|
|
|
}
|
|
}
|
|
@@ -656,7 +665,7 @@ bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
|
|
|
#endif
|
|
#endif
|
|
|
}
|
|
}
|
|
|
PMSM_FOC_TorqueLimit(motor.f_epm_trq);
|
|
PMSM_FOC_TorqueLimit(motor.f_epm_trq);
|
|
|
- PMSM_FOC_Set_Speed(motor.f_epm_vel);
|
|
|
|
|
|
|
+ PMSM_FOC_Set_TgtSpeed(motor.f_epm_vel);
|
|
|
}else {
|
|
}else {
|
|
|
motor.b_epm_cmd_move = false;
|
|
motor.b_epm_cmd_move = false;
|
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
#ifdef CONFIG_SPEED_LADRC
|
|
@@ -664,7 +673,7 @@ bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
|
|
|
#else
|
|
#else
|
|
|
PMSM_FOC_Change_VelLoop_Params(mc_conf()->c.pid[PID_Vel_ID].kp, mc_conf()->c.pid[PID_Vel_ID].ki);
|
|
PMSM_FOC_Change_VelLoop_Params(mc_conf()->c.pid[PID_Vel_ID].kp, mc_conf()->c.pid[PID_Vel_ID].ki);
|
|
|
#endif
|
|
#endif
|
|
|
- PMSM_FOC_Set_Speed(0);
|
|
|
|
|
|
|
+ PMSM_FOC_Set_TgtSpeed(0);
|
|
|
}
|
|
}
|
|
|
cpu_exit_critical(mask);
|
|
cpu_exit_critical(mask);
|
|
|
return true;
|
|
return true;
|
|
@@ -1332,7 +1341,7 @@ static void mc_process_epm_move(void) {
|
|
|
step_towards(&motor.f_epm_vel, target_vel, step);
|
|
step_towards(&motor.f_epm_vel, target_vel, step);
|
|
|
motor.f_epm_trq = target_trq;
|
|
motor.f_epm_trq = target_trq;
|
|
|
PMSM_FOC_TorqueLimit(motor.f_epm_trq);
|
|
PMSM_FOC_TorqueLimit(motor.f_epm_trq);
|
|
|
- PMSM_FOC_Set_Speed(motor.f_epm_vel);
|
|
|
|
|
|
|
+ PMSM_FOC_Set_TgtSpeed(motor.f_epm_vel);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static bool mc_process_force_running(void) {
|
|
static bool mc_process_force_running(void) {
|
|
@@ -1406,6 +1415,9 @@ static bool mc_can_stop_foc(void) {
|
|
|
if (motor.mode == CTRL_MODE_CURRENT) {
|
|
if (motor.mode == CTRL_MODE_CURRENT) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (motor.mode == CTRL_MODE_SPD && motor.s_target_speed != MAX_S16) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
|
|
if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
|
|
|
if (!PMSM_FOC_AutoHoldding() && motor.epm_dir == EPM_Dir_None) {
|
|
if (!PMSM_FOC_AutoHoldding() && motor.epm_dir == EPM_Dir_None) {
|
|
|
return true;
|
|
return true;
|
|
@@ -1423,6 +1435,9 @@ static bool mc_can_restart_foc(void) {
|
|
|
if (!foc_observer_is_encoder() && !foc_observer_sensorless_stable()){
|
|
if (!foc_observer_is_encoder() && !foc_observer_sensorless_stable()){
|
|
|
can_start = false;
|
|
can_start = false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (motor.mode == CTRL_MODE_SPD && motor.s_target_speed != MAX_S16) {
|
|
|
|
|
+ can_start = true;
|
|
|
|
|
+ }
|
|
|
return can_start;
|
|
return can_start;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1536,9 +1551,13 @@ void Sched_MC_mTask(void) {
|
|
|
}
|
|
}
|
|
|
if (runMode != CTRL_MODE_OPEN) {
|
|
if (runMode != CTRL_MODE_OPEN) {
|
|
|
eCtrl_Running();
|
|
eCtrl_Running();
|
|
|
- if ((runMode == CTRL_MODE_SPD) && mc_is_epm()) {
|
|
|
|
|
- mc_process_throttle_epm();
|
|
|
|
|
- mc_process_epm_move();
|
|
|
|
|
|
|
+ if (runMode == CTRL_MODE_SPD) {
|
|
|
|
|
+ if (mc_is_epm()) {
|
|
|
|
|
+ mc_process_throttle_epm();
|
|
|
|
|
+ mc_process_epm_move();
|
|
|
|
|
+ }else if (motor.s_target_speed != MAX_S16) {
|
|
|
|
|
+ PMSM_FOC_Set_TgtSpeed(motor.s_target_speed);
|
|
|
|
|
+ }
|
|
|
}else {
|
|
}else {
|
|
|
float thro = throttle_get_signal();
|
|
float thro = throttle_get_signal();
|
|
|
if (motor.b_ignor_throttle) {
|
|
if (motor.b_ignor_throttle) {
|