|
|
@@ -132,10 +132,15 @@ bool mc_start(u8 mode) {
|
|
|
pwm_start();
|
|
|
adc_start_convert();
|
|
|
phase_current_calibrate_wait();
|
|
|
+
|
|
|
motor.throttle = 0;
|
|
|
motor.b_start = true;
|
|
|
motor.b_runStall = false;
|
|
|
motor.runStall_time = 0;
|
|
|
+ motor.b_epm = false;
|
|
|
+ motor.b_epm_cmd_move = false;
|
|
|
+ motor.epm_dir = EPM_Dir_None;
|
|
|
+
|
|
|
if (phase_curr_offset_check()) {
|
|
|
PMSM_FOC_SetCriticalError(FOC_CRIT_CURR_OFF_Err);
|
|
|
mc_stop();
|
|
|
@@ -196,6 +201,7 @@ bool mc_set_foc_mode(u8 mode) {
|
|
|
}
|
|
|
|
|
|
bool mc_start_epm(bool epm) {
|
|
|
+ sys_debug("%s epm mode\n", epm?"enter":"exit");
|
|
|
if (motor.b_epm == epm) {
|
|
|
return true;
|
|
|
}
|
|
|
@@ -215,17 +221,22 @@ bool mc_start_epm(bool epm) {
|
|
|
motor.b_epm = epm;
|
|
|
if (epm) {
|
|
|
motor.lim_rpm = PMSM_FOC_GetSpeedLimit();
|
|
|
+ motor.lim_phase_curr = PMSM_FOC_GetPhaseCurrLim();
|
|
|
eCtrl_set_TgtSpeed(0);
|
|
|
motor.mode = CTRL_MODE_SPD;
|
|
|
PMSM_FOC_SpeedLimit(nv_get_foc_params()->s_maxEpmRPM);
|
|
|
+ PMSM_FOC_PhaseCurrLim(nv_get_foc_params()->s_maxEpmPhaseCurrLim);
|
|
|
PMSM_FOC_SetCtrlMode(CTRL_MODE_SPD);
|
|
|
}else {
|
|
|
motor.epm_dir = EPM_Dir_None;
|
|
|
motor.mode = CTRL_MODE_TRQ;
|
|
|
+ motor.b_epm_cmd_move = false;
|
|
|
PMSM_FOC_SetCtrlMode(CTRL_MODE_TRQ);
|
|
|
PMSM_FOC_SpeedLimit(motor.lim_rpm);
|
|
|
+ PMSM_FOC_PhaseCurrLim(motor.lim_phase_curr);
|
|
|
}
|
|
|
cpu_exit_critical(mask);
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
@@ -233,16 +244,18 @@ bool mc_is_epm(void) {
|
|
|
return motor.b_epm;
|
|
|
}
|
|
|
|
|
|
-bool mc_start_epm_move(EPM_Dir_t dir) {
|
|
|
+bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
|
|
|
+ sys_debug("epm dir %d, %d\n", dir, motor.epm_dir);
|
|
|
if (!motor.b_epm || !motor.b_start) {
|
|
|
PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
return false;
|
|
|
}
|
|
|
- if (dir == motor.epm_dir) {
|
|
|
+ if ((dir == motor.epm_dir) && (is_command == motor.b_epm_cmd_move)) {
|
|
|
return true;
|
|
|
}
|
|
|
motor.epm_dir = dir;
|
|
|
if (dir != EPM_Dir_None) {
|
|
|
+ motor.b_epm_cmd_move = is_command;
|
|
|
u32 mask = cpu_enter_critical();
|
|
|
if (!PMSM_FOC_Is_Start()) {
|
|
|
PMSM_FOC_Start(motor.mode);
|
|
|
@@ -255,11 +268,20 @@ bool mc_start_epm_move(EPM_Dir_t dir) {
|
|
|
}
|
|
|
PMSM_FOC_Set_Speed(rpm);
|
|
|
}else {
|
|
|
+ motor.b_epm_cmd_move = false;
|
|
|
PMSM_FOC_Set_Speed(0);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+bool mc_command_epm_move(EPM_Dir_t dir) {
|
|
|
+ return mc_start_epm_move(dir, true);
|
|
|
+}
|
|
|
+
|
|
|
+bool mc_throttle_epm_move(EPM_Dir_t dir) {
|
|
|
+ return mc_start_epm_move(dir, false);
|
|
|
+}
|
|
|
+
|
|
|
void mc_set_spd_torque(s32 target) {
|
|
|
motor.b_ignor_throttle = true;
|
|
|
motor.s_targetFix = target;
|
|
|
@@ -551,7 +573,9 @@ void Sched_MC_mTask(void) {
|
|
|
float f_throttle = get_throttle_float();
|
|
|
if (f_throttle != motor.throttle) {
|
|
|
motor.throttle = f_throttle;
|
|
|
- torque_speed_target(runMode, f_throttle);
|
|
|
+ if (!motor.b_epm_cmd_move) {//通过命令前进后退,不处理转把
|
|
|
+ torque_speed_target(runMode, f_throttle);
|
|
|
+ }
|
|
|
}
|
|
|
PMSM_FOC_Slow_Task();
|
|
|
}
|