|
|
@@ -27,8 +27,6 @@ static bool mc_detect_hwbrake(void);
|
|
|
static bool mc_is_gpio_mlock(void);
|
|
|
static void _pwm_brake_prot_timer_handler(shark_timer_t *);
|
|
|
static shark_timer_t _brake_prot_timer = TIMER_INIT(_brake_prot_timer, _pwm_brake_prot_timer_handler);
|
|
|
-static void _autohold_beep_timer_handler(shark_timer_t *);
|
|
|
-static shark_timer_t _autohold_beep_timer = TIMER_INIT(_autohold_beep_timer, _autohold_beep_timer_handler);
|
|
|
static void _fan_det_timer_handler(shark_timer_t *);
|
|
|
static shark_timer_t _fan_det_timer1 = TIMER_INIT(_fan_det_timer1, _fan_det_timer_handler);
|
|
|
static shark_timer_t _fan_det_timer2 = TIMER_INIT(_fan_det_timer2, _fan_det_timer_handler);
|
|
|
@@ -54,7 +52,7 @@ static mc_gear_t sensorless_gear = {
|
|
|
.n_accl_time = 1500,
|
|
|
.n_torque = {100, 100, 100, 100, 0, 0, 0, 0, 0, 0},
|
|
|
};
|
|
|
-static motor_err_t mc_error;
|
|
|
+static runtime_node_t mc_error;
|
|
|
|
|
|
static void MC_Check_MosVbusThrottle(void) {
|
|
|
int count = 1000;
|
|
|
@@ -120,7 +118,7 @@ static void MC_Check_MosVbusThrottle(void) {
|
|
|
|
|
|
static u32 _self_check_task(void *p) {
|
|
|
if (ENC_Check_error()) {
|
|
|
- err_add_record(FOC_CRIT_Encoder_Err, 0);
|
|
|
+ mc_crit_err_add_s16(FOC_CRIT_Encoder_Err, 0);
|
|
|
mc_set_critical_error(FOC_CRIT_Encoder_Err);
|
|
|
}
|
|
|
if (get_tick_ms() < 5000) { //启动后5s内检测锁电机线
|
|
|
@@ -913,7 +911,6 @@ void MC_Brake_IRQHandler(void) {
|
|
|
|
|
|
static void _pwm_brake_prot_timer_handler(shark_timer_t *t){
|
|
|
pwm_brake_enable(true);
|
|
|
- mc_err_block_write(motor.n_CritiCalErrMask, (u8 *)&mc_error, sizeof(mc_error));
|
|
|
sys_debug("MC protect error\n");
|
|
|
}
|
|
|
|
|
|
@@ -935,10 +932,12 @@ void MC_Protect_IRQHandler(void){
|
|
|
mc_error.torque_ref_x10 = (s16)(PMSM_FOC_Get()->in.s_targetTorque * 10.0f);
|
|
|
mc_error.run_mode = PMSM_FOC_Get()->out.n_RunMode;
|
|
|
mc_error.rpm = (s16)motor_encoder_get_speed();
|
|
|
- mc_error.b_smo_running = !foc_observer_is_encoder();
|
|
|
+ mc_error.b_sensorless = !foc_observer_is_encoder();
|
|
|
+ mc_error.b_sensorless_stable = foc_observer_sensorless_stable();
|
|
|
mc_error.mos_temp = get_mos_temp();
|
|
|
mc_error.mot_temp = get_motor_temp();
|
|
|
- mc_error.enc_error = foc_observer_enc_errcount();
|
|
|
+ mc_error.enc_error = motor_encoder_may_error();
|
|
|
+ mc_error.sensorless_rpm = (s16)foc_observer_sensorless_speed();
|
|
|
|
|
|
mc_set_critical_error(FOC_CRIT_Phase_Err);
|
|
|
_mc_internal_init(CTRL_MODE_OPEN, false);
|
|
|
@@ -946,6 +945,7 @@ void MC_Protect_IRQHandler(void){
|
|
|
pwm_stop();
|
|
|
PMSM_FOC_Stop();
|
|
|
pwm_up_enable(true);
|
|
|
+ mc_runtime_add(&mc_error);
|
|
|
}
|
|
|
|
|
|
void motor_debug(void) {
|
|
|
@@ -954,62 +954,7 @@ void motor_debug(void) {
|
|
|
}
|
|
|
sys_debug("err1: %f, %f, %f, %d\n", (float)mc_error.vbus_x10/10.0f, (float)mc_error.id_ref_x10/10.0f, (float)mc_error.iq_ref_x10/10.0f, mc_error.run_mode);
|
|
|
sys_debug("err2: %f, %f, %f, %f\n", (float)mc_error.id_x10/10.0f, (float)mc_error.iq_x10/10.0f, (float)mc_error.vd_x10/10.0f, (float)mc_error.vq_x10/10.0f);
|
|
|
- sys_debug("err3: %f, %d, %d, %d, %d\n", (float)mc_error.ibus_x10/10.0f, mc_error.b_smo_running, mc_error.mos_temp, mc_error.mot_temp, mc_error.enc_error);
|
|
|
-}
|
|
|
-
|
|
|
-int _mc_get_phase_errinfo(motor_err_t *mc_err, u8 *data, int dlen) {
|
|
|
- int len = 0;
|
|
|
- encode_s16(data, mc_err->vbus_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->ibus_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->vacc_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->id_ref_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->iq_ref_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->id_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->iq_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->vd_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->vq_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->torque_ref_x10);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->rpm);
|
|
|
- len += 2;
|
|
|
- encode_u8(data, mc_err->run_mode);
|
|
|
- len += 1;
|
|
|
- encode_u8(data, mc_err->b_smo_running);
|
|
|
- len += 1;
|
|
|
- encode_s16(data, mc_err->mos_temp);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->mot_temp);
|
|
|
- len += 2;
|
|
|
- encode_s16(data, mc_err->enc_error);
|
|
|
- len += 2;
|
|
|
-
|
|
|
- return len;
|
|
|
-}
|
|
|
-
|
|
|
-int mc_get_phase_errinfo(u8 *data, int dlen) {
|
|
|
- return _mc_get_phase_errinfo(&mc_error, data, dlen);
|
|
|
-}
|
|
|
-
|
|
|
-int mc_get_phase_errinfo_block(u8 *data, int dlen) {
|
|
|
- motor_err_t mc_err;
|
|
|
- u32 err_mask;
|
|
|
- if (mc_error_curr_block_read(&err_mask, (u8 *)&mc_err, sizeof(mc_err)) < 0) {
|
|
|
- encode_u32(data, motor.n_CritiCalErrMask);
|
|
|
- data += 4;
|
|
|
- return _mc_get_phase_errinfo(&mc_error, data, dlen - 4) + 4;
|
|
|
- }
|
|
|
- encode_u32(data, err_mask);
|
|
|
- data += 4;
|
|
|
- return _mc_get_phase_errinfo(&mc_err, data, dlen - 4) + 4;
|
|
|
+ sys_debug("err3: %f, %d, %d, %d, %d\n", (float)mc_error.ibus_x10/10.0f, mc_error.sensorless_rpm, mc_error.mos_temp, mc_error.mot_temp, mc_error.enc_error);
|
|
|
}
|
|
|
|
|
|
void TIMER_UP_IRQHandler(void){
|
|
|
@@ -1075,10 +1020,6 @@ static bool mc_run_stall_process(u8 run_mode) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static void _autohold_beep_timer_handler(shark_timer_t *t) {
|
|
|
- gpio_beep(60);
|
|
|
-}
|
|
|
-
|
|
|
static void mc_autohold_process(void) {
|
|
|
if (nv_get_foc_params()->n_autoHold == 0) {
|
|
|
if (PMSM_FOC_AutoHoldding()) {
|
|
|
@@ -1103,7 +1044,6 @@ static void mc_autohold_process(void) {
|
|
|
if (get_delta_ms(motor.n_autohold_time) >= CONFIG_AUTOHOLD_DETECT_TIME) {
|
|
|
if (mc_auto_hold(true)) {
|
|
|
motor.b_wait_brk_release = true;
|
|
|
- shark_timer_post(&_autohold_beep_timer, 0);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1246,6 +1186,8 @@ 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;
|
|
|
@@ -1282,7 +1224,13 @@ 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();
|
|
|
- mc_set_critical_error(FOC_CRIT_Encoder_Err);
|
|
|
+ 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) {
|
|
|
motor.b_limit_pending = true;
|