|
|
@@ -452,6 +452,20 @@ bool mc_set_gear(u8 gear) {
|
|
|
return false;
|
|
|
}
|
|
|
if (motor.n_gear != gear) {
|
|
|
+#if TURBO_GEAR_AUTO_EXIT_TIME>0
|
|
|
+ if (gear == TURBO_GEAR) {
|
|
|
+ if (motor.mos_lim != 0 || motor.motor_lim != 0) {
|
|
|
+ mot_contrl_set_error(&motor.controller, FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (get_motor_temp_raw() >= TURBO_MIN_MOTOR_TEMP || get_mos_temp_raw() >= TURBO_MIN_MOS_TEMP) {
|
|
|
+ mot_contrl_set_error(&motor.controller, FOC_NotAllowed);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ motor.gear_last = motor.n_gear;
|
|
|
+ motor.turbo_time = get_tick_ms();
|
|
|
+ }
|
|
|
+#endif
|
|
|
u32 mask = cpu_enter_critical();
|
|
|
motor.n_gear = gear;
|
|
|
mc_gear_mode_set();
|
|
|
@@ -460,6 +474,27 @@ bool mc_set_gear(u8 gear) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static void mc_turbo_auto_exit(void) {
|
|
|
+#if TURBO_GEAR_AUTO_EXIT_TIME>0
|
|
|
+ if (motor.n_gear != TURBO_GEAR) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (motor.mos_lim != 0 || motor.motor_lim != 0) {
|
|
|
+ mc_set_gear(motor.gear_last);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ u32 delta_time = get_delta_ms(motor.turbo_time);
|
|
|
+ if (delta_time >= TURBO_GEAR_AUTO_EXIT_TIME) {
|
|
|
+ motor.turbo_remain_sec = 0;
|
|
|
+ mc_set_gear(motor.gear_last);
|
|
|
+ return;
|
|
|
+ }else {
|
|
|
+ motor.turbo_remain_sec = (TURBO_GEAR_AUTO_EXIT_TIME - delta_time) / 1000;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
u8 mc_get_gear(void) {
|
|
|
if (motor.n_gear == 3){
|
|
|
return 0;
|
|
|
@@ -1608,6 +1643,7 @@ void Sched_MC_mTask(void) {
|
|
|
if ((runMode != CTRL_MODE_OPEN) || (motor.mode != CTRL_MODE_OPEN)) {
|
|
|
#ifndef CONFIG_DQ_STEP_RESPONSE
|
|
|
mc_autohold_process();
|
|
|
+ mc_turbo_auto_exit();
|
|
|
if (motor.mode != CTRL_MODE_OPEN) {
|
|
|
mc_motor_runstop();
|
|
|
}
|