|
@@ -72,6 +72,7 @@ void encoder_init_clear(void) {
|
|
|
g_encoder.start_dianostic_cnt = 0;
|
|
g_encoder.start_dianostic_cnt = 0;
|
|
|
g_encoder.align_cnt = 0;
|
|
g_encoder.align_cnt = 0;
|
|
|
g_encoder.align_step = 0;
|
|
g_encoder.align_step = 0;
|
|
|
|
|
+ g_encoder.align_cnt_final = 0;
|
|
|
g_encoder.pwm_time_ms = get_tick_ms();
|
|
g_encoder.pwm_time_ms = get_tick_ms();
|
|
|
_init_pll();
|
|
_init_pll();
|
|
|
}
|
|
}
|
|
@@ -286,8 +287,9 @@ float encoder_get_theta(bool detect_err) {
|
|
|
g_encoder.interpolation = 0.0f;
|
|
g_encoder.interpolation = 0.0f;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- step_towards_s16(&g_encoder.align_step, g_encoder.align_cnt, 2);
|
|
|
|
|
- g_encoder.abi_angle = ENC_Pluse_Nr_2_angle((float)(cnt/* + g_encoder.align_step*/) + g_encoder.interpolation) * g_encoder.motor_poles + g_encoder.enc_offset;
|
|
|
|
|
|
|
+ step_towards(&g_encoder.align_step, (float)g_encoder.align_cnt_final, 0.01f);
|
|
|
|
|
+ float angle_count = cnt + g_encoder.align_step + g_encoder.interpolation;
|
|
|
|
|
+ g_encoder.abi_angle = ENC_Pluse_Nr_2_angle(angle_count) * g_encoder.motor_poles + g_encoder.enc_offset;
|
|
|
g_encoder.abi_angle += _eccentricity_compensation(cnt);
|
|
g_encoder.abi_angle += _eccentricity_compensation(cnt);
|
|
|
rand_angle(g_encoder.abi_angle);
|
|
rand_angle(g_encoder.abi_angle);
|
|
|
g_encoder.last_cnt = cnt;
|
|
g_encoder.last_cnt = cnt;
|
|
@@ -379,30 +381,42 @@ static void encoder_sync_pwm_abs(void) {
|
|
|
g_encoder.b_index_found = true;
|
|
g_encoder.b_index_found = true;
|
|
|
g_encoder.last_delta_cnt = MAX_S16;
|
|
g_encoder.last_delta_cnt = MAX_S16;
|
|
|
g_encoder.align_cnt = g_encoder.align_step = 0;
|
|
g_encoder.align_cnt = g_encoder.align_step = 0;
|
|
|
|
|
+ g_encoder.align_cnt_final = 0;
|
|
|
|
|
+ g_encoder.z_index_counter = 0;
|
|
|
PLL_Reset(&g_encoder.est_pll, (float)_abi_count());
|
|
PLL_Reset(&g_encoder.est_pll, (float)_abi_count());
|
|
|
cpu_exit_critical(mask);
|
|
cpu_exit_critical(mask);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*I 信号的中断处理,一圈一个中断*/
|
|
/*I 信号的中断处理,一圈一个中断*/
|
|
|
-//static int abi_I_delta = 0xFFFFFFF;
|
|
|
|
|
-static int abi_z_count = 0;
|
|
|
|
|
|
|
+#define CONFIG_Z_IDX_MARGIN 5
|
|
|
|
|
+#define CONFIG_Z_IDX_FIXED_COUNT 30 /* Z信号最大允许的补偿机角度为 (30-5)/4096*360=2.2度*/
|
|
|
|
|
+#define CONFIG_Z_IDX_MAX_CNT_PER_IRQ 4 /* 每次z信号中断,最大补偿机械角度(4)/4096*360=0.34,类似做低通滤波 */
|
|
|
|
|
+#define CONFIG_Z_IDX_IGNORE_MAX_CNT 5
|
|
|
void ENC_ABI_IRQHandler(u32 count) {
|
|
void ENC_ABI_IRQHandler(u32 count) {
|
|
|
#ifdef ENCODER_CC_INVERT
|
|
#ifdef ENCODER_CC_INVERT
|
|
|
g_encoder.z_index_cnt = (g_encoder.cpr -1) - count;
|
|
g_encoder.z_index_cnt = (g_encoder.cpr -1) - count;
|
|
|
#else
|
|
#else
|
|
|
g_encoder.z_index_cnt = count;
|
|
g_encoder.z_index_cnt = count;
|
|
|
#endif
|
|
#endif
|
|
|
- abi_z_count++;
|
|
|
|
|
-
|
|
|
|
|
- if (g_encoder.z_index_cnt > 10 && g_encoder.z_index_cnt < 50) {
|
|
|
|
|
- g_encoder.align_cnt = -(g_encoder.z_index_cnt - 5);
|
|
|
|
|
- }else if (g_encoder.z_index_cnt > (g_encoder.cpr - 50) && g_encoder.z_index_cnt < (g_encoder.cpr - 10)) {
|
|
|
|
|
- g_encoder.align_cnt = g_encoder.cpr - g_encoder.z_index_cnt - 5;
|
|
|
|
|
|
|
+ g_encoder.z_index_counter++;
|
|
|
|
|
+ s16 pre_cnt = g_encoder.align_cnt;
|
|
|
|
|
+ if (g_encoder.z_index_cnt <= CONFIG_Z_IDX_MARGIN) {
|
|
|
|
|
+ g_encoder.align_cnt = 0;
|
|
|
|
|
+ }else if (g_encoder.z_index_cnt >= (g_encoder.cpr - CONFIG_Z_IDX_MARGIN)) {
|
|
|
|
|
+ g_encoder.align_cnt = 0;
|
|
|
|
|
+ }else if (g_encoder.z_index_cnt > CONFIG_Z_IDX_MARGIN && g_encoder.z_index_cnt < CONFIG_Z_IDX_FIXED_COUNT) {
|
|
|
|
|
+ g_encoder.align_cnt = -(g_encoder.z_index_cnt - CONFIG_Z_IDX_MARGIN);
|
|
|
|
|
+ }else if (g_encoder.z_index_cnt > (g_encoder.cpr - CONFIG_Z_IDX_FIXED_COUNT) && g_encoder.z_index_cnt < (g_encoder.cpr - CONFIG_Z_IDX_MARGIN)) {
|
|
|
|
|
+ g_encoder.align_cnt = g_encoder.cpr - g_encoder.z_index_cnt - CONFIG_Z_IDX_MARGIN;
|
|
|
}else {
|
|
}else {
|
|
|
- if (g_encoder.z_index_cnt <=10 || g_encoder.z_index_cnt >= (g_encoder.cpr - 10)) {
|
|
|
|
|
- g_encoder.align_cnt = 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ //maybe error?
|
|
|
|
|
+ g_encoder.z_index_err_counter++;
|
|
|
|
|
+ }
|
|
|
|
|
+ s16 delta = pre_cnt - g_encoder.align_cnt;
|
|
|
|
|
+ if (ABS(delta) >= CONFIG_Z_IDX_IGNORE_MAX_CNT) {
|
|
|
|
|
+ g_encoder.align_cnt = pre_cnt;
|
|
|
}
|
|
}
|
|
|
|
|
+ step_towards_s16(&g_encoder.align_cnt_final, g_encoder.align_cnt, CONFIG_Z_IDX_MAX_CNT_PER_IRQ);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* 编码器AB信号读书溢出处理 */
|
|
/* 编码器AB信号读书溢出处理 */
|
|
@@ -485,7 +499,8 @@ float encoder_get_abi_angle(void) {
|
|
|
|
|
|
|
|
void encoder_log(void) {
|
|
void encoder_log(void) {
|
|
|
sys_debug("pwm %f, abi %f\n", encoder_get_pwm_angle(), encoder_get_abi_angle());
|
|
sys_debug("pwm %f, abi %f\n", encoder_get_pwm_angle(), encoder_get_abi_angle());
|
|
|
- sys_debug("pwm count %d, I count %d,%d,%d\n", g_encoder.pwm_count, g_encoder.pwm_start_cnt, g_encoder.z_index_cnt, abi_z_count);
|
|
|
|
|
|
|
+ sys_debug("Z idx %d,%d,%d,%d\n", g_encoder.z_index_err_counter, g_encoder.pwm_start_cnt, g_encoder.z_index_cnt, g_encoder.z_index_counter);
|
|
|
|
|
+ sys_debug("Z err: %f, %d,%d\n", g_encoder.align_step, g_encoder.align_cnt, g_encoder.align_cnt_final);
|
|
|
sys_debug("pwm freq %f, err %d, %f, %f\n", enc_get_pwm_freq(), pwm_duty_err, pwm_err_min, pwm_err_max);
|
|
sys_debug("pwm freq %f, err %d, %f, %f\n", enc_get_pwm_freq(), pwm_duty_err, pwm_err_min, pwm_err_max);
|
|
|
if (g_encoder.enc_maybe_err) {
|
|
if (g_encoder.enc_maybe_err) {
|
|
|
sys_debug("E:%d,%d,%d,%d,%d,%d\n", enc_test1, enc_test2, enc_test3, enc_cnt, enc_last_cnt, enc_test4);
|
|
sys_debug("E:%d,%d,%d,%d,%d,%d\n", enc_test1, enc_test2, enc_test3, enc_cnt, enc_last_cnt, enc_test4);
|