|
@@ -46,9 +46,9 @@ void mot_params_ind_stop(void) {
|
|
|
b_rs_ind = false;
|
|
b_rs_ind = false;
|
|
|
b_ldq_ind = false;
|
|
b_ldq_ind = false;
|
|
|
b_flux_ind = false;
|
|
b_flux_ind = false;
|
|
|
|
|
+ cpu_exit_critical(mask);
|
|
|
PMSM_FOC_SetOpenVdq(0, 0);
|
|
PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
PMSM_FOC_Set_Current(0);
|
|
PMSM_FOC_Set_Current(0);
|
|
|
- cpu_exit_critical(mask);
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void _rs_ind_timer_handler(shark_timer_t *t) {
|
|
static void _rs_ind_timer_handler(shark_timer_t *t) {
|
|
@@ -73,21 +73,22 @@ static void _rs_ind_timer_handler(shark_timer_t *t) {
|
|
|
PMSM_FOC_SetOpenVdq_Immediate(rs_vd_now, 0);
|
|
PMSM_FOC_SetOpenVdq_Immediate(rs_vd_now, 0);
|
|
|
}else {
|
|
}else {
|
|
|
rs_ind_step = 2;
|
|
rs_ind_step = 2;
|
|
|
|
|
+ sys_debug("id reach the set\n");
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case 2:
|
|
case 2:
|
|
|
- if (PMSM_FOC_Get()->out.s_RealIdq.d < rs_id_max) {
|
|
|
|
|
- rs_vd_now += 0.1f;
|
|
|
|
|
- wait_iq_0_cnt = 0;
|
|
|
|
|
- if (rs_vd_now >= rs_vd_max) {
|
|
|
|
|
|
|
+ if (ABS(PMSM_FOC_Get()->out.s_FilterIdq.q) > 5.0f) {
|
|
|
|
|
+ wait_iq_0_cnt++;
|
|
|
|
|
+ if (wait_iq_0_cnt >= 200) {
|
|
|
PMSM_FOC_SetOpenVdq(0, 0);
|
|
PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
b_rs_ind = false;
|
|
b_rs_ind = false;
|
|
|
- sys_debug("id not reach max id %f\n", PMSM_FOC_Get()->out.s_RealIdq.d);
|
|
|
|
|
|
|
+ sys_debug("iq is larger %f\n", PMSM_FOC_Get()->out.s_FilterIdq.q);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- PMSM_FOC_SetOpenVdq_Immediate(rs_vd_now, 0);
|
|
|
|
|
}else {
|
|
}else {
|
|
|
|
|
+ wait_iq_0_cnt = 0;
|
|
|
rs_ind_step = 3;
|
|
rs_ind_step = 3;
|
|
|
|
|
+ sys_debug("start rs calc, %d\n", rs_meas_time);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case 3: {
|
|
case 3: {
|
|
@@ -96,7 +97,7 @@ static void _rs_ind_timer_handler(shark_timer_t *t) {
|
|
|
PMSM_FOC_ABC2Dq(SIGN(iabc[0]), SIGN(iabc[1]), SIGN(iabc[2]), &d, &q);
|
|
PMSM_FOC_ABC2Dq(SIGN(iabc[0]), SIGN(iabc[1]), SIGN(iabc[2]), &d, &q);
|
|
|
float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * PMSM_FOC_Get()->in.s_vDC * 1.5f;
|
|
float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * PMSM_FOC_Get()->in.s_vDC * 1.5f;
|
|
|
float vd = (rs_vd_now - dtc) * TWO_BY_THREE;
|
|
float vd = (rs_vd_now - dtc) * TWO_BY_THREE;
|
|
|
- float rs = vd / (PMSM_FOC_Get()->out.s_RealIdq.d + 0.00000000001f);
|
|
|
|
|
|
|
+ float rs = vd / (PMSM_FOC_Get()->out.s_RealIdq.d + 0.0001f);
|
|
|
rs_est_value = LowPass_Filter(rs_est_value, rs, 0.2f);
|
|
rs_est_value = LowPass_Filter(rs_est_value, rs, 0.2f);
|
|
|
if (rs_meas_time-- <= 0) {
|
|
if (rs_meas_time-- <= 0) {
|
|
|
mc_ind_motor_start(false);
|
|
mc_ind_motor_start(false);
|
|
@@ -275,9 +276,11 @@ void mot_params_calc_inductance(void) {
|
|
|
b_ldq_ind = false;
|
|
b_ldq_ind = false;
|
|
|
}
|
|
}
|
|
|
static float motVelRadusPers, flux_wait_cnt = 0, flux_do_cnt = 0, flux_est_value = 0;
|
|
static float motVelRadusPers, flux_wait_cnt = 0, flux_do_cnt = 0, flux_est_value = 0;
|
|
|
|
|
+static bool _pending_flux_mc_stop = false;
|
|
|
static void _flux_ind_timer_handler(shark_timer_t *t) {
|
|
static void _flux_ind_timer_handler(shark_timer_t *t) {
|
|
|
float We = PMSM_FOC_Get()->in.s_motVelRadusPers;
|
|
float We = PMSM_FOC_Get()->in.s_motVelRadusPers;
|
|
|
float delta = We - motVelRadusPers;
|
|
float delta = We - motVelRadusPers;
|
|
|
|
|
+ motVelRadusPers = PMSM_FOC_Get()->in.s_motVelRadusPers;
|
|
|
if (We > 100 && ABS(delta) < 40) {
|
|
if (We > 100 && ABS(delta) < 40) {
|
|
|
float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * PMSM_FOC_Get()->in.s_vDC * 1.5f;
|
|
float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * PMSM_FOC_Get()->in.s_vDC * 1.5f;
|
|
|
float vq = (PMSM_FOC_Get()->out.s_OutVdq.q - dtc) * TWO_BY_THREE;
|
|
float vq = (PMSM_FOC_Get()->out.s_OutVdq.q - dtc) * TWO_BY_THREE;
|
|
@@ -287,27 +290,33 @@ static void _flux_ind_timer_handler(shark_timer_t *t) {
|
|
|
}else {
|
|
}else {
|
|
|
flux_wait_cnt ++;
|
|
flux_wait_cnt ++;
|
|
|
}
|
|
}
|
|
|
- if ((flux_wait_cnt >= 100) || (flux_do_cnt >= 400)) {
|
|
|
|
|
|
|
+ if ((flux_wait_cnt >= 500) || (flux_do_cnt >= 400)) {
|
|
|
b_flux_ind = false;
|
|
b_flux_ind = false;
|
|
|
- if (flux_wait_cnt >= 100) {
|
|
|
|
|
|
|
+ if (flux_wait_cnt >= 500) {
|
|
|
sys_debug("ind flux error\n");
|
|
sys_debug("ind flux error\n");
|
|
|
}else {
|
|
}else {
|
|
|
b_flux_ested = true;
|
|
b_flux_ested = true;
|
|
|
sys_debug("ind_flux finish, %f\n", flux_est_value);
|
|
sys_debug("ind_flux finish, %f\n", flux_est_value);
|
|
|
}
|
|
}
|
|
|
|
|
+ mot_params_ind_stop();
|
|
|
|
|
+ if (PMSM_FOC_GetSpeed() < CONFIG_ZERO_SPEED_RPM) {
|
|
|
|
|
+ mc_ind_motor_start(false);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ _pending_flux_mc_stop = true;
|
|
|
|
|
+ }
|
|
|
}else {
|
|
}else {
|
|
|
shark_timer_post(&_flux_ind_timer, 10);
|
|
shark_timer_post(&_flux_ind_timer, 10);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void mot_params_ind_flux(float id, float iq) {
|
|
void mot_params_ind_flux(float id, float iq) {
|
|
|
- if (b_rs_ind || b_ldq_ind || b_flux_ind) {
|
|
|
|
|
|
|
+ if (b_rs_ind || b_ldq_ind || b_flux_ind || _pending_flux_mc_stop) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
b_flux_ind = true;
|
|
b_flux_ind = true;
|
|
|
flux_wait_cnt = 0;
|
|
flux_wait_cnt = 0;
|
|
|
flux_do_cnt = 0;
|
|
flux_do_cnt = 0;
|
|
|
- flux_est_value = 0;
|
|
|
|
|
|
|
+ b_flux_ested = false;
|
|
|
mc_set_foc_mode(CTRL_MODE_CURRENT);
|
|
mc_set_foc_mode(CTRL_MODE_CURRENT);
|
|
|
PMSM_FOC_Set_Current(iq);
|
|
PMSM_FOC_Set_Current(iq);
|
|
|
shark_timer_post(&_flux_ind_timer, 10);
|
|
shark_timer_post(&_flux_ind_timer, 10);
|
|
@@ -336,4 +345,13 @@ float mot_params_get_est_flux(void) {
|
|
|
return flux_est_value;
|
|
return flux_est_value;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void mot_params_flux_stop(void) {
|
|
|
|
|
+ if (_pending_flux_mc_stop && (PMSM_FOC_GetSpeed() < CONFIG_ZERO_SPEED_RPM)) {
|
|
|
|
|
+ mc_ind_motor_start(false);
|
|
|
|
|
+ _pending_flux_mc_stop = false;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+bool mot_params_flux_pending(void) {
|
|
|
|
|
+ return _pending_flux_mc_stop;
|
|
|
|
|
+}
|