|
|
@@ -137,11 +137,14 @@ static u32 _self_check_task(void *p) {
|
|
|
return 5;
|
|
|
}
|
|
|
|
|
|
-static void mc_detect_vbus_mode(void) {
|
|
|
+static bool mc_detect_vbus_mode(void) {
|
|
|
#ifdef CONFIG_FORCE_96V_MODE
|
|
|
motor.b_is96Mode = true;
|
|
|
+ return false;
|
|
|
#else
|
|
|
+ bool is_96mode = motor.b_is96Mode;
|
|
|
motor.b_is96Mode = get_vbus_int() >= CONFIG_96V_MODE_VOL;
|
|
|
+ return (is_96mode != motor.b_is96Mode);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -159,6 +162,7 @@ static void _mc_internal_init(u8 mode, bool start) {
|
|
|
motor.b_break = false;
|
|
|
motor.b_wait_brk_release = false;
|
|
|
motor.b_force_run = false;
|
|
|
+ motor.b_cruise = false;
|
|
|
}
|
|
|
|
|
|
static void mc_gear_vmode_changed(void) {
|
|
|
@@ -332,6 +336,20 @@ u8 mc_get_gear(void) {
|
|
|
return motor.n_gear + 1;
|
|
|
}
|
|
|
|
|
|
+bool mc_enable_cruise(bool enable) {
|
|
|
+ if (PMSM_FOC_EnableCruise(enable)) {
|
|
|
+ motor.b_cruise = enable;
|
|
|
+ motor.cruise_time = enable?shark_get_seconds():0;
|
|
|
+ motor.cruise_torque = 0.0f;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool mc_is_cruise_enabled(void) {
|
|
|
+ return motor.b_cruise;
|
|
|
+}
|
|
|
+
|
|
|
bool mc_set_foc_mode(u8 mode) {
|
|
|
if (mode == motor.mode) {
|
|
|
return true;
|
|
|
@@ -971,6 +989,47 @@ static void mc_process_throttle_epm(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool mc_process_force_running(void) {
|
|
|
+ if (motor.b_calibrate || (motor.mode == CTRL_MODE_OPEN)) {
|
|
|
+ if (motor.b_force_run) {
|
|
|
+ if (_force_wait > 0) {
|
|
|
+ --_force_wait;
|
|
|
+ }else {
|
|
|
+ _force_angle += 1.0f;
|
|
|
+ rand_angle(_force_angle);
|
|
|
+ PMSM_FOC_Set_Angle(_force_angle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+#ifdef CONFIG_CRUISE_ENABLE_ACCL
|
|
|
+static void mc_process_curise(void) {
|
|
|
+ if (motor.b_cruise) {
|
|
|
+ if (PMSM_FOC_GetSpeed() < CONFIG_MIN_CRUISE_RPM) {
|
|
|
+ mc_enable_cruise(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (PMSM_FOC_Is_CruiseEnabled()) {
|
|
|
+ if ((shark_get_seconds() - motor.cruise_time >= 3) && motor.cruise_torque == 0.0f) {
|
|
|
+ motor.cruise_torque = PMSM_FOC_Get()->in.s_targetTorque;
|
|
|
+ }else if (motor.cruise_torque > 0.0f){
|
|
|
+ float trq_req = get_thro_request_torque();
|
|
|
+ if (trq_req > motor.cruise_torque * 1.2f) {
|
|
|
+ PMSM_FOC_PauseCruise(); //需要加速,暂停定速巡航
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ float trq_req = get_thro_request_torque();
|
|
|
+ if (trq_req <= motor.cruise_torque * 1.1f) {
|
|
|
+ PMSM_FOC_ResumeCruise(); //重新开始定速巡航,巡航速度还是前一次定速巡航给的速度
|
|
|
+ motor.cruise_time = shark_get_seconds();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
/*FOC 的部分处理,比如速度环,状态机,转把采集等*/
|
|
|
measure_time_t g_meas_MCTask;
|
|
|
#define mc_TaskStart time_measure_start(&g_meas_MCTask)
|
|
|
@@ -980,9 +1039,9 @@ void Sched_MC_mTask(void) {
|
|
|
|
|
|
adc_vref_filter();
|
|
|
|
|
|
- bool is96v_prev = motor.b_is96Mode;
|
|
|
- mc_detect_vbus_mode();
|
|
|
-
|
|
|
+#ifdef CONFIG_CRUISE_ENABLE_ACCL
|
|
|
+ mc_process_curise();
|
|
|
+#endif
|
|
|
u8 runMode = PMSM_FOC_CtrlMode();
|
|
|
|
|
|
/*保护功能*/
|
|
|
@@ -990,21 +1049,12 @@ void Sched_MC_mTask(void) {
|
|
|
/* 母线电流,实际采集的相电流矢量大小的计算 */
|
|
|
PMSM_FOC_Calc_Current();
|
|
|
|
|
|
- if (motor.b_calibrate || (motor.mode == CTRL_MODE_OPEN)) {
|
|
|
- if (motor.b_force_run) {
|
|
|
- if (_force_wait > 0) {
|
|
|
- --_force_wait;
|
|
|
- }else {
|
|
|
- _force_angle += 1.0f;
|
|
|
- rand_angle(_force_angle);
|
|
|
- PMSM_FOC_Set_Angle(_force_angle);
|
|
|
- }
|
|
|
- }
|
|
|
+ if (mc_process_force_running()) {
|
|
|
mc_TaskEnd;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if ((is96v_prev != motor.b_is96Mode) || limted) {
|
|
|
+ if (mc_detect_vbus_mode() || limted) {
|
|
|
mc_gear_vmode_changed();
|
|
|
}
|
|
|
|