|
@@ -94,15 +94,8 @@ static void _rs_ind_timer_handler(shark_timer_t *t) {
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case 3: {
|
|
case 3: {
|
|
|
- float *iabc = motor.controller.foc.in.curr_abc;
|
|
|
|
|
- float d, q;
|
|
|
|
|
- float v_a_final = 0;
|
|
|
|
|
- float v_abc[3] = {0, 0, 0};
|
|
|
|
|
- foc_abc_2_dq(SIGN(iabc[0]), SIGN(iabc[1]), SIGN(iabc[2]), &d, &q);
|
|
|
|
|
- get_uvw_phases_raw(v_abc);
|
|
|
|
|
- v_a_final = LowPass_Filter(v_a_final, v_abc[0], 0.2f);
|
|
|
|
|
- float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_period) * motor.controller.foc.in.dc_vol * TWO_BY_THREE;
|
|
|
|
|
- float vd = (rs_vd_now - dtc) * TWO_BY_THREE;
|
|
|
|
|
|
|
+ float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_period) * motor.controller.foc.in.dc_vol * 0.2f;
|
|
|
|
|
+ float vd = rs_vd_now * TWO_BY_THREE - dtc;
|
|
|
float id = motor.controller.foc.out.curr_dq.d;
|
|
float id = motor.controller.foc.out.curr_dq.d;
|
|
|
float rs = vd / (id + 0.0001f);
|
|
float rs = vd / (id + 0.0001f);
|
|
|
rs_est_value = LowPass_Filter(rs_est_value, rs, 0.2f);
|
|
rs_est_value = LowPass_Filter(rs_est_value, rs, 0.2f);
|
|
@@ -113,8 +106,7 @@ static void _rs_ind_timer_handler(shark_timer_t *t) {
|
|
|
finish = true;
|
|
finish = true;
|
|
|
b_rs_ested = true;
|
|
b_rs_ested = true;
|
|
|
sys_debug("est rs = %f-%f\n", rs_est_value, rs);
|
|
sys_debug("est rs = %f-%f\n", rs_est_value, rs);
|
|
|
- sys_debug("vd-id is %f-%f-%f-%f, wait %d\n", rs_vd_now, id, dtc/1.5f, vd, wait_iq_0_cnt);
|
|
|
|
|
- sys_debug("Va = %f\n", v_a_final);
|
|
|
|
|
|
|
+ sys_debug("vd-id is %f-%f-%f-%f, wait %d\n", rs_vd_now, id, dtc, vd, wait_iq_0_cnt);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
default:
|
|
default:
|
|
@@ -152,7 +144,7 @@ void mot_params_ind_inductance(float v, float freq, u16 l_type) {
|
|
|
hj_n = (float)FOC_PWM_FS / hj_freq;
|
|
hj_n = (float)FOC_PWM_FS / hj_freq;
|
|
|
hj_samples = hj_n * 50;
|
|
hj_samples = hj_n * 50;
|
|
|
K_terms = (s32) (0.5f + hj_samples*hj_freq/(float)FOC_PWM_FS);
|
|
K_terms = (s32) (0.5f + hj_samples*hj_freq/(float)FOC_PWM_FS);
|
|
|
- Vdead = motor.controller.foc.in.dc_vol * (float)CONFIG_HW_DeadTime / (float)FOC_PWM_period * TWO_BY_THREE;
|
|
|
|
|
|
|
+ Vdead = motor.controller.foc.in.dc_vol * (float)CONFIG_HW_DeadTime / (float)FOC_PWM_period;
|
|
|
hj_w = 360.0f / hj_n;
|
|
hj_w = 360.0f / hj_n;
|
|
|
sys_debug("hj %f, %f, %f, %f, %f, %f, %f\n", hj_v, hj_freq, hj_n, hj_samples, K_terms, Vdead, hj_w);
|
|
sys_debug("hj %f, %f, %f, %f, %f, %f, %f\n", hj_v, hj_freq, hj_n, hj_samples, K_terms, Vdead, hj_w);
|
|
|
float fft_angle = 360.0f / hj_samples * K_terms;
|
|
float fft_angle = 360.0f / hj_samples * K_terms;
|
|
@@ -261,6 +253,7 @@ void mot_params_calc_inductance(void) {
|
|
|
goertzel_dft(i_samples, &i_real, &i_image, &i_mag);
|
|
goertzel_dft(i_samples, &i_real, &i_image, &i_mag);
|
|
|
sys_debug("v %f, %f, %f\n", v_mag/(hj_samples*0.5f), v_real, v_image);
|
|
sys_debug("v %f, %f, %f\n", v_mag/(hj_samples*0.5f), v_real, v_image);
|
|
|
sys_debug("i %f, %f, %f\n", i_mag/(hj_samples*0.5f), i_real, i_image);
|
|
sys_debug("i %f, %f, %f\n", i_mag/(hj_samples*0.5f), i_real, i_image);
|
|
|
|
|
+ sys_debug("vmag %f, %f\n", v_mag, Vdead * hj_samples*0.5f);
|
|
|
v_mag -= Vdead * hj_samples*0.5f;
|
|
v_mag -= Vdead * hj_samples*0.5f;
|
|
|
|
|
|
|
|
float z_angle = fast_atan_2(i_image, i_real) - fast_atan_2(v_image, v_real);
|
|
float z_angle = fast_atan_2(i_image, i_real) - fast_atan_2(v_image, v_real);
|
|
@@ -272,7 +265,7 @@ void mot_params_calc_inductance(void) {
|
|
|
float z_image = z_mag * s;
|
|
float z_image = z_mag * s;
|
|
|
float Rs = rs_est_value;
|
|
float Rs = rs_est_value;
|
|
|
float Ri = (SQ(z_real - Rs) + SQ(z_image))/(z_real - Rs + 0.0000001f);
|
|
float Ri = (SQ(z_real - Rs) + SQ(z_image))/(z_real - Rs + 0.0000001f);
|
|
|
- float l = Ri * (z_real - Rs)/(hj_freq * 2 * PI * z_image + 0.0000001f) * 0.9f;
|
|
|
|
|
|
|
+ float l = Ri * (z_real - Rs)/(hj_freq * 2 * PI * z_image + 0.0000001f);
|
|
|
if (n_ind_ld == L_TYPE_D) {
|
|
if (n_ind_ld == L_TYPE_D) {
|
|
|
ld_est_value = l;
|
|
ld_est_value = l;
|
|
|
b_ld_ested = true;
|
|
b_ld_ested = true;
|
|
@@ -291,7 +284,7 @@ static void _flux_ind_timer_handler(shark_timer_t *t) {
|
|
|
float delta = We - motVelRadusPers;
|
|
float delta = We - motVelRadusPers;
|
|
|
motVelRadusPers = motor.controller.foc.mot_vel_radusPers;
|
|
motVelRadusPers = motor.controller.foc.mot_vel_radusPers;
|
|
|
if (We > 100 && ABS(delta) < 40) {
|
|
if (We > 100 && ABS(delta) < 40) {
|
|
|
- float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * motor.controller.foc.in.dc_vol * 1.5f;
|
|
|
|
|
|
|
+ float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_period) * motor.controller.foc.in.dc_vol * 1.5f;
|
|
|
float vq = (motor.controller.foc.out.vol_dq.q - dtc) * TWO_BY_THREE;
|
|
float vq = (motor.controller.foc.out.vol_dq.q - dtc) * TWO_BY_THREE;
|
|
|
float flux = vq / We;
|
|
float flux = vq / We;
|
|
|
flux_est_value = LowPass_Filter(flux_est_value, flux, 0.1f);
|
|
flux_est_value = LowPass_Filter(flux_est_value, flux, 0.1f);
|