|
|
@@ -22,6 +22,8 @@
|
|
|
extern float target_d;
|
|
|
extern float target_q;
|
|
|
#endif
|
|
|
+extern u32 enc_pwm_err_ms;
|
|
|
+extern s16 enc_delta_err1, enc_delta_err2;
|
|
|
|
|
|
static bool mc_detect_hwbrake(void);
|
|
|
static bool mc_is_gpio_mlock(void);
|
|
|
@@ -118,7 +120,7 @@ static void MC_Check_MosVbusThrottle(void) {
|
|
|
|
|
|
static u32 _self_check_task(void *p) {
|
|
|
if (ENC_Check_error()) {
|
|
|
- mc_crit_err_add_s16(FOC_CRIT_Encoder_Err, 0);
|
|
|
+ mc_crit_err_add_s16(FOC_CRIT_Encoder_Err, -1);
|
|
|
mc_set_critical_error(FOC_CRIT_Encoder_Err);
|
|
|
}
|
|
|
if (get_tick_ms() < 5000) { //启动后5s内检测锁电机线
|
|
|
@@ -914,12 +916,7 @@ static void _pwm_brake_prot_timer_handler(shark_timer_t *t){
|
|
|
sys_debug("MC protect error\n");
|
|
|
}
|
|
|
|
|
|
-void MC_Protect_IRQHandler(void){
|
|
|
- pwm_brake_enable(false);
|
|
|
- shark_timer_post(&_brake_prot_timer, 1000);
|
|
|
- if (!motor.b_start) {
|
|
|
- return;
|
|
|
- }
|
|
|
+static void mc_save_err_runtime(void) {
|
|
|
mc_error.vbus_x10 = (s16)(sample_vbus_raw() * 10.0f);
|
|
|
mc_error.ibus_x10 = (s16)(sample_ibus_raw() * 10.0f);
|
|
|
mc_error.vacc_x10 = (s16) (sample_acc_vol_raw() * 10.0f);
|
|
|
@@ -939,13 +936,22 @@ void MC_Protect_IRQHandler(void){
|
|
|
mc_error.enc_error = motor_encoder_may_error();
|
|
|
mc_error.sensorless_rpm = (s16)foc_observer_sensorless_speed();
|
|
|
|
|
|
+ mc_err_runtime_add(&mc_error);
|
|
|
+}
|
|
|
+
|
|
|
+void MC_Protect_IRQHandler(void){
|
|
|
+ pwm_brake_enable(false);
|
|
|
+ shark_timer_post(&_brake_prot_timer, 1000);
|
|
|
+ if (!motor.b_start) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
mc_set_critical_error(FOC_CRIT_Phase_Err);
|
|
|
+ mc_save_err_runtime();
|
|
|
_mc_internal_init(CTRL_MODE_OPEN, false);
|
|
|
adc_stop_convert();
|
|
|
pwm_stop();
|
|
|
PMSM_FOC_Stop();
|
|
|
pwm_up_enable(true);
|
|
|
- mc_runtime_add(&mc_error);
|
|
|
}
|
|
|
|
|
|
void motor_debug(void) {
|
|
|
@@ -979,9 +985,21 @@ void ADC_IRQHandler(void) {
|
|
|
}
|
|
|
TIME_MEATURE_START();
|
|
|
if (!PMSM_FOC_Schedule()) {/* FOC 角度错误,立即停机 */
|
|
|
- mc_set_critical_error(FOC_CRIT_Angle_Err);
|
|
|
- PMSM_FOC_Stop();
|
|
|
- pwm_disable_channel();
|
|
|
+ if (PMSM_FOC_Is_Start()) {
|
|
|
+ pwm_disable_channel();
|
|
|
+ /* 记录错误 */
|
|
|
+ mc_save_err_runtime();
|
|
|
+ mc_set_critical_error(FOC_CRIT_Angle_Err);
|
|
|
+ mc_crit_err_add_s16(FOC_CRIT_Angle_Err, (s16)motor_encoder_get_speed());
|
|
|
+ if (motor_encoder_may_error() == ENCODER_PWM_ERR) {
|
|
|
+ mc_set_critical_error(FOC_CRIT_Encoder_Err);
|
|
|
+ mc_crit_err_add_s16(FOC_CRIT_Encoder_Err, (s16)enc_pwm_err_ms);
|
|
|
+ }else if (motor_encoder_may_error() == ENCODER_AB_ERR) {
|
|
|
+ mc_set_critical_error(FOC_CRIT_ENC_AB_Err);
|
|
|
+ mc_crit_err_add(FOC_CRIT_ENC_AB_Err, enc_delta_err1, enc_delta_err2);
|
|
|
+ }
|
|
|
+ PMSM_FOC_Stop();
|
|
|
+ }
|
|
|
}
|
|
|
TIME_MEATURE_END();
|
|
|
}
|
|
|
@@ -1186,8 +1204,6 @@ static void mc_motor_runstop(void) {
|
|
|
measure_time_t g_meas_MCTask;
|
|
|
#define mc_TaskStart time_measure_start(&g_meas_MCTask)
|
|
|
#define mc_TaskEnd time_measure_end(&g_meas_MCTask)
|
|
|
-extern u32 enc_pwm_err_ms;
|
|
|
-extern s16 enc_delta_err1, enc_delta_err2;
|
|
|
void Sched_MC_mTask(void) {
|
|
|
static int vbus_err_cnt = 0;
|
|
|
static bool _sensorless_run = false;
|
|
|
@@ -1224,12 +1240,14 @@ void Sched_MC_mTask(void) {
|
|
|
bool sensor_less = !foc_observer_is_encoder();
|
|
|
if (mc_detect_vbus_mode() || (limted == FOC_LIM_CHANGE_L) || (!_sensorless_run && sensor_less)) {
|
|
|
mc_gear_vmode_changed();
|
|
|
- if (motor_encoder_may_error() == ENCODER_PWM_ERR) {
|
|
|
- mc_set_critical_error(FOC_CRIT_Encoder_Err);
|
|
|
- mc_crit_err_add_s16(FOC_CRIT_Encoder_Err, (s16)enc_pwm_err_ms);
|
|
|
- }else if (motor_encoder_may_error() == ENCODER_AB_ERR) {
|
|
|
- mc_set_critical_error(FOC_CRIT_ENC_AB_Err);
|
|
|
- mc_crit_err_add(FOC_CRIT_ENC_AB_Err, enc_delta_err1, enc_delta_err2);
|
|
|
+ if (foc_observer_sensorless_stable()) {//unstable 记录在ADC中断处理中
|
|
|
+ if (motor_encoder_may_error() == ENCODER_PWM_ERR) {
|
|
|
+ mc_set_critical_error(FOC_CRIT_Encoder_Err);
|
|
|
+ mc_crit_err_add_s16(FOC_CRIT_Encoder_Err, (s16)enc_pwm_err_ms);
|
|
|
+ }else if (motor_encoder_may_error() == ENCODER_AB_ERR) {
|
|
|
+ mc_set_critical_error(FOC_CRIT_ENC_AB_Err);
|
|
|
+ mc_crit_err_add(FOC_CRIT_ENC_AB_Err, enc_delta_err1, enc_delta_err2);
|
|
|
+ }
|
|
|
}
|
|
|
motor.b_limit_pending = false;
|
|
|
}else if (limted == FOC_LIM_CHANGE_H) {
|