|
|
@@ -91,6 +91,7 @@ void mc_init(void) {
|
|
|
MC_Check_MosVbusThrottle();
|
|
|
sched_timer_enable(CONFIG_SPD_CTRL_US);
|
|
|
shark_task_create(_self_check_task, NULL);
|
|
|
+ pwm_up_enable(true);
|
|
|
}
|
|
|
|
|
|
motor_t * mc_params(void) {
|
|
|
@@ -120,6 +121,7 @@ bool mc_start(u8 mode) {
|
|
|
PMSM_FOC_SetErrCode(FOC_Throttle_Err);
|
|
|
return false;
|
|
|
}
|
|
|
+ pwm_up_enable(false);
|
|
|
motor.mode = mode;
|
|
|
eCtrl_init(1000, 3000);
|
|
|
motor_encoder_start(motor.s_direction);
|
|
|
@@ -164,7 +166,10 @@ bool mc_stop(void) {
|
|
|
adc_stop_convert();
|
|
|
pwm_stop();
|
|
|
PMSM_FOC_Stop();
|
|
|
+ pwm_up_enable(true);
|
|
|
motor.b_start = false;
|
|
|
+ motor.b_epm = false;
|
|
|
+ motor.epm_dir = EPM_Dir_None;
|
|
|
gpio_led2_enable(false);
|
|
|
return true;
|
|
|
}
|
|
|
@@ -190,6 +195,71 @@ bool mc_set_foc_mode(u8 mode) {
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+bool mc_start_epm(bool epm) {
|
|
|
+ if (motor.b_epm == epm) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (!motor.b_start) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (PMSM_FOC_GetSpeed() != 0.0f) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!mc_throttle_released()) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_Throttle_Err);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ u32 mask = cpu_enter_critical();
|
|
|
+ motor.b_epm = epm;
|
|
|
+ if (epm) {
|
|
|
+ motor.lim_rpm = PMSM_FOC_GetSpeedLimit();
|
|
|
+ eCtrl_set_TgtSpeed(0);
|
|
|
+ motor.mode = CTRL_MODE_SPD;
|
|
|
+ PMSM_FOC_SpeedLimit(nv_get_foc_params()->s_maxEpmRPM);
|
|
|
+ PMSM_FOC_SetCtrlMode(CTRL_MODE_SPD);
|
|
|
+ }else {
|
|
|
+ motor.epm_dir = EPM_Dir_None;
|
|
|
+ motor.mode = CTRL_MODE_TRQ;
|
|
|
+ PMSM_FOC_SetCtrlMode(CTRL_MODE_TRQ);
|
|
|
+ PMSM_FOC_SpeedLimit(motor.lim_rpm);
|
|
|
+ }
|
|
|
+ cpu_exit_critical(mask);
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool mc_is_epm(void) {
|
|
|
+ return motor.b_epm;
|
|
|
+}
|
|
|
+
|
|
|
+bool mc_start_epm_move(EPM_Dir_t dir) {
|
|
|
+ if (!motor.b_epm || !motor.b_start) {
|
|
|
+ PMSM_FOC_SetErrCode(FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (dir == motor.epm_dir) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ motor.epm_dir = dir;
|
|
|
+ if (dir != EPM_Dir_None) {
|
|
|
+ u32 mask = cpu_enter_critical();
|
|
|
+ if (!PMSM_FOC_Is_Start()) {
|
|
|
+ PMSM_FOC_Start(motor.mode);
|
|
|
+ pwm_enable_channel();
|
|
|
+ }
|
|
|
+ cpu_exit_critical(mask);
|
|
|
+ float rpm = nv_get_foc_params()->s_maxEpmRPM;
|
|
|
+ if (dir == EPM_Dir_Back) {
|
|
|
+ rpm = -rpm;
|
|
|
+ }
|
|
|
+ PMSM_FOC_Set_Speed(rpm);
|
|
|
+ }else {
|
|
|
+ PMSM_FOC_Set_Speed(0);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
void mc_set_spd_torque(s32 target) {
|
|
|
motor.b_ignor_throttle = true;
|
|
|
motor.s_targetFix = target;
|
|
|
@@ -376,8 +446,7 @@ void MC_Protect_IRQHandler(void){
|
|
|
|
|
|
measure_time_t g_meas_timeup = {.intval_max_time = 62, .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
|
|
|
void TIMER_UP_IRQHandler(void){
|
|
|
- //phase_current_adc_triger();
|
|
|
- time_measure_start(&g_meas_timeup);
|
|
|
+ motor_encoder_update();
|
|
|
}
|
|
|
|
|
|
measure_time_t g_meas_foc = {.exec_max_time = 20, .intval_max_time = 62, .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
|
|
|
@@ -399,6 +468,15 @@ void ADC_IRQHandler(void) {
|
|
|
TIME_MEATURE_END();
|
|
|
}
|
|
|
|
|
|
+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) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
//#define ANGLE_TEST
|
|
|
#ifdef ANGLE_TEST
|
|
|
static void _debug_angle(void) {
|
|
|
@@ -447,16 +525,20 @@ void Sched_MC_mTask(void) {
|
|
|
if ((runMode != CTRL_MODE_OPEN) || (motor.mode != CTRL_MODE_OPEN)) {
|
|
|
if (motor.mode != CTRL_MODE_OPEN) {
|
|
|
u32 mask;
|
|
|
- if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
|
|
|
- mask = cpu_enter_critical();
|
|
|
- PMSM_FOC_Stop();
|
|
|
- pwm_disable_channel();
|
|
|
- cpu_exit_critical(mask);
|
|
|
+ if (mc_can_stop_foc()) {
|
|
|
+ if (PMSM_FOC_Is_Start()) {
|
|
|
+ mask = cpu_enter_critical();
|
|
|
+ PMSM_FOC_Stop();
|
|
|
+ pwm_disable_channel();
|
|
|
+ cpu_exit_critical(mask);
|
|
|
+ }
|
|
|
}else {
|
|
|
- mask = cpu_enter_critical();
|
|
|
- PMSM_FOC_Start(motor.mode);
|
|
|
- pwm_enable_channel();
|
|
|
- cpu_exit_critical(mask);
|
|
|
+ if (!PMSM_FOC_Is_Start()) {
|
|
|
+ mask = cpu_enter_critical();
|
|
|
+ PMSM_FOC_Start(motor.mode);
|
|
|
+ pwm_enable_channel();
|
|
|
+ cpu_exit_critical(mask);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
if (runMode != CTRL_MODE_OPEN) {
|