|
|
@@ -102,6 +102,10 @@ bool mc_start(u8 mode) {
|
|
|
#ifdef CONFIG_DQ_STEP_RESPONSE
|
|
|
mode = CTRL_MODE_CURRENT;
|
|
|
#endif
|
|
|
+ if (motor.b_lock_motor) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
MC_Check_MosVbusThrottle();
|
|
|
|
|
|
if (PMSM_FOC_GetCriticalError() != 0) {
|
|
|
@@ -156,6 +160,12 @@ bool mc_stop(void) {
|
|
|
if (!motor.b_start) {
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
+ if (motor.b_lock_motor) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
if (motor_encoder_get_speed() > 10.0f) {
|
|
|
PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
|
|
|
sys_debug("speed error\n");
|
|
|
@@ -292,11 +302,12 @@ void mc_use_throttle(void) {
|
|
|
|
|
|
void mc_get_running_status(u8 *data) {
|
|
|
data[0] = motor.mode;
|
|
|
- data[0] |= PMSM_FOC_Get()->out.n_RunMode << 2;
|
|
|
+ data[0] |= (PMSM_FOC_AutoHoldding()?1:0) << 2;
|
|
|
+ data[0] |= (motor.b_break?1:0) << 3;
|
|
|
data[0] |= (PMSM_FOC_Get()->in.b_cruiseEna?1:0) << 4;
|
|
|
data[0] |= (motor.b_start?1:0) << 5;
|
|
|
data[0] |= (mc_is_epm()?1:0) << 6;
|
|
|
- data[0] |= (0) << 7; //motor locked
|
|
|
+ data[0] |= (motor.b_lock_motor) << 7; //motor locked
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -397,23 +408,53 @@ bool mc_current_sensor_calibrate(float current) {
|
|
|
}
|
|
|
|
|
|
bool mc_lock_motor(bool lock) {
|
|
|
+ if (motor.b_lock_motor == lock) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (motor.b_start) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
if (lock && (PMSM_FOC_GetSpeed() > 10)) {
|
|
|
PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
|
|
|
return false;
|
|
|
}
|
|
|
- PMSM_FOC_LockMotor(lock); //if mot enabled, foc core will do lock
|
|
|
- if (!motor.b_start) {
|
|
|
- if (lock) {
|
|
|
- pwm_start();
|
|
|
- pwm_update_duty(0, 0, 0);
|
|
|
- }else {
|
|
|
- pwm_update_duty(FOC_PWM_Half_Period/2, FOC_PWM_Half_Period/2, FOC_PWM_Half_Period/2);
|
|
|
- pwm_stop();
|
|
|
- }
|
|
|
+ motor.b_lock_motor = lock;
|
|
|
+ if (lock) {
|
|
|
+ pwm_start();
|
|
|
+ pwm_update_duty(FOC_PWM_Half_Period/2, FOC_PWM_Half_Period/2, FOC_PWM_Half_Period/2);
|
|
|
+ pwm_enable_channel();
|
|
|
+ }else {
|
|
|
+ pwm_stop();
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+bool mc_auto_hold(bool hold) {
|
|
|
+ if (motor.b_auto_hold == hold) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (!motor.b_start) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (hold && !mc_throttle_released()) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_Throttle_Err);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ motor.b_auto_hold = hold;
|
|
|
+
|
|
|
+ u32 mask = cpu_enter_critical();
|
|
|
+ if (!PMSM_FOC_Is_Start()) {
|
|
|
+ PMSM_FOC_Start(motor.mode);
|
|
|
+ PMSM_FOC_AutoHold(hold);
|
|
|
+ pwm_enable_channel();
|
|
|
+ }else {
|
|
|
+ PMSM_FOC_AutoHold(hold);
|
|
|
+ }
|
|
|
+ cpu_exit_critical(mask);
|
|
|
+ return true;
|
|
|
+}
|
|
|
|
|
|
bool mc_throttle_released(void) {
|
|
|
return get_throttle_float() <= nv_get_foc_params()->n_minThroVol;
|
|
|
@@ -457,8 +498,10 @@ void MC_Brake_IRQHandler(void) {
|
|
|
return;
|
|
|
}
|
|
|
if (mc_is_hwbrake()) {
|
|
|
+ motor.b_break = true;
|
|
|
PMSM_FOC_Brake(true);
|
|
|
}else {
|
|
|
+ motor.b_break = false;
|
|
|
PMSM_FOC_Brake(false);
|
|
|
}
|
|
|
}
|
|
|
@@ -504,7 +547,7 @@ void ADC_IRQHandler(void) {
|
|
|
#ifndef CONFIG_DQ_STEP_RESPONSE
|
|
|
static bool mc_can_stop_foc(void) {
|
|
|
if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
|
|
|
- if (!PMSM_FOC_MotorLocking() && motor.epm_dir == EPM_Dir_None) {
|
|
|
+ if (!PMSM_FOC_AutoHoldding() && motor.epm_dir == EPM_Dir_None) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
@@ -512,7 +555,7 @@ static bool mc_can_stop_foc(void) {
|
|
|
}
|
|
|
#endif
|
|
|
static bool mc_run_stall_process(u8 run_mode) {
|
|
|
- if ((run_mode == CTRL_MODE_TRQ || run_mode == CTRL_MODE_SPD) && !PMSM_FOC_MotorLocking()) {
|
|
|
+ if ((run_mode == CTRL_MODE_TRQ || run_mode == CTRL_MODE_SPD) && !PMSM_FOC_AutoHoldding()) {
|
|
|
//堵转判断
|
|
|
if (motor.b_runStall) {
|
|
|
if (!mc_throttle_released()) {
|
|
|
@@ -561,6 +604,9 @@ void Sched_MC_mTask(void) {
|
|
|
|
|
|
if ((runMode != CTRL_MODE_OPEN) || (motor.mode != CTRL_MODE_OPEN)) {
|
|
|
#ifndef CONFIG_DQ_STEP_RESPONSE
|
|
|
+ if (PMSM_FOC_AutoHoldding() && !mc_throttle_released()) {
|
|
|
+ mc_auto_hold(false);
|
|
|
+ }
|
|
|
if (motor.mode != CTRL_MODE_OPEN) {
|
|
|
u32 mask;
|
|
|
if (mc_can_stop_foc()) {
|