|
|
@@ -43,7 +43,9 @@ static motor_t motor = {
|
|
|
.mode = CTRL_MODE_OPEN,
|
|
|
.mos_lim = 0,
|
|
|
.motor_lim = 0,
|
|
|
- .idc_user_lim = IDC_USER_LIMIT_NONE,
|
|
|
+ .u_set.idc_lim = IDC_USER_LIMIT_NONE,
|
|
|
+ .u_set.ebrk_torque = IDC_USER_LIMIT_NONE,
|
|
|
+ .u_set.ebrk_time = MAX_U16,
|
|
|
};
|
|
|
/* 无感运行的挡位,限制速度,母线电流,最大扭矩 */
|
|
|
static mc_gear_t sensorless_gear = {
|
|
|
@@ -185,7 +187,7 @@ static void mc_gear_vmode_changed(void) {
|
|
|
mc_gear_t *gears = mc_get_gear_config();
|
|
|
|
|
|
PMSM_FOC_SpeedLimit(gears->n_max_speed);
|
|
|
- PMSM_FOC_DCCurrLimit(min(gears->n_max_idc, motor.idc_user_lim));
|
|
|
+ PMSM_FOC_DCCurrLimit(min(gears->n_max_idc, motor.u_set.idc_lim));
|
|
|
PMSM_FOC_TorqueLimit(gears->n_max_trq);
|
|
|
}
|
|
|
|
|
|
@@ -425,15 +427,34 @@ bool mc_set_cruise_speed(bool rpm_abs, float target_rpm) {
|
|
|
}
|
|
|
|
|
|
void mc_set_idc_limit(s16 limit) {
|
|
|
- if ((limit == motor.idc_user_lim) || (limit < 0)) {
|
|
|
+ if ((limit == motor.u_set.idc_lim) || (limit < 0)) {
|
|
|
return;
|
|
|
}
|
|
|
- motor.idc_user_lim = limit;
|
|
|
+ motor.u_set.idc_lim = limit;
|
|
|
s16 g_limit = mc_get_gear_idc_limit();
|
|
|
limit = min(g_limit, limit);
|
|
|
PMSM_FOC_DCCurrLimit(limit);
|
|
|
}
|
|
|
|
|
|
+void mc_set_ebrk_level(s16 trq, u16 time) {
|
|
|
+ motor.u_set.ebrk_torque = MAX(0, trq);
|
|
|
+ motor.u_set.ebrk_time = MAX(1, time);
|
|
|
+
|
|
|
+ eCtrl_Set_eBrk_RampTime(mc_get_ebrk_time());
|
|
|
+ PMSM_FOC_SetEbrkTorque(mc_get_ebrk_torque());
|
|
|
+}
|
|
|
+
|
|
|
+s16 mc_get_ebrk_torque(void) {
|
|
|
+ return min(motor.u_set.ebrk_torque, nv_get_foc_params()->s_TorqueBrkLim);
|
|
|
+}
|
|
|
+
|
|
|
+u16 mc_get_ebrk_time(void) {
|
|
|
+ if (motor.u_set.ebrk_time == MAX_U16) {
|
|
|
+ return (u16)nv_get_foc_params()->n_ebrk_time;
|
|
|
+ }
|
|
|
+ return motor.u_set.ebrk_time;
|
|
|
+}
|
|
|
+
|
|
|
bool mc_set_foc_mode(u8 mode) {
|
|
|
if (mode == motor.mode) {
|
|
|
return true;
|
|
|
@@ -801,14 +822,24 @@ bool mc_auto_hold(bool hold) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-void mc_set_critical_error(u8 err) {
|
|
|
+bool mc_set_critical_error(u8 err) {
|
|
|
+ if (mc_critical_err_is_set(err)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
motor.n_CritiCalErrMask |= (1u << err);
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
void mc_clr_critical_error(u8 err) {
|
|
|
motor.n_CritiCalErrMask &= ~(1u << err);
|
|
|
}
|
|
|
|
|
|
+bool mc_critical_err_is_set(u8 err) {
|
|
|
+ u32 mask = (1u << err);
|
|
|
+ return (motor.n_CritiCalErrMask & mask) != 0;
|
|
|
+}
|
|
|
+
|
|
|
u32 mc_get_critical_error(void) {
|
|
|
return motor.n_CritiCalErrMask;
|
|
|
}
|
|
|
@@ -1228,10 +1259,11 @@ void Sched_MC_mTask(void) {
|
|
|
|
|
|
if ((PMSM_FOC_GetVbusCurrent() > (CONFIG_MAX_VBUS_CURRENT * 1.1f)) || (PMSM_FOC_GetVbusCurrent() < CONFIG_MAX_CHRG_CURRENT)) {
|
|
|
vbus_err_cnt ++;
|
|
|
- if (vbus_err_cnt > 10) {
|
|
|
- mc_set_critical_error(FOC_CRIT_IDC_OV);
|
|
|
- mc_crit_err_add(FOC_CRIT_IDC_OV, (s16)sample_vbus_raw(), (s16)sample_ibus_raw());
|
|
|
- mc_save_err_runtime();
|
|
|
+ if (vbus_err_cnt >= 5) {
|
|
|
+ if (mc_set_critical_error(FOC_CRIT_IDC_OV)) {
|
|
|
+ mc_crit_err_add(FOC_CRIT_IDC_OV, (s16)sample_vbus_raw(), (s16)sample_ibus_raw());
|
|
|
+ mc_save_err_runtime();
|
|
|
+ }
|
|
|
}
|
|
|
}else {
|
|
|
vbus_err_cnt = 0;
|