
一、左右编码器方向不一致问题左右两个编码器中断处理函数用了完全相同的 /-- 判断逻辑但两个电机左右对装同一前进运动下 A/B 相位关系相反导致 Encoder_L 和 Encoder_R 一个递增、一个递减。修复VOFA 实测左编码器方向反了将 EXTI15_10_IRQHandler 中 Encoder_L 和 Encoder_L-- 全部互换右编码器不动。在上一篇文章中已经将此错误修改C// 修复后的左编码器中断if(aBit_SET){if(bBit_RESET)Encoder_L--;// 反转elseEncoder_L;// 正转}else{if(bBit_RESET)Encoder_L;// 正转elseEncoder_L--;// 反转}二、编码器脉冲数 → 轮胎角度换算改动原来 GetPos_R 直接返回脉冲数没有换算。现在统一做了单位换算返回轮胎实际角度CfloatApp_Encoder_GetPos_L(void){returnEncoder_L/22.0f/20.4f*360.0f;}floatApp_Encoder_GetPos_R(void){returnEncoder_R/22.0f/20.4f*360.0f;}每步含义÷22.0f11 对磁极 × 双边沿捕获 每圈 22 脉冲 → 得到编码器旋转圈数÷20.4f减速比 → 得到轮胎旋转圈数×360.0f→ 得到轮胎旋转角度度返回类型也从 int64_t 改为 float保留角度精度。三、M 法测速低速异常原理M法/每圈线数得到编码器旋转的圈数/减速比得到轮胎旋转的圈数*360°得到旋转过的角度M法测速固定时间T内计数编码器脉冲数M经减速比换算得轮胎转角。误差来源采样周期Δt与编码器边沿无法完全对齐导致±1脉冲计数误差高速时相对误差小低速时大。T法测速固定脉冲数M1测量相邻两个边沿的时间间隔T。误差来源定时器分辨率有限测T存在±1个时钟周期误差。转速越低T越大分辨率引起的相对误差越小例同样0.5μs误差10.5μs时误差率5%100.5μs时仅0.5%现象M 法测速1ms 采样波形全是尖刺不是平滑曲线。voidEncoder_M_Method_Test(void){App_Encoder_Init();while(1){Delay(1);floatpos_LApp_Encoder_GetPos_L();//左轮胎当前位置floatpos_RApp_Encoder_GetPos_R();//右轮胎当前位置floatM_L(pos_L-last_pos_L);//左轮胎位置变化MfloatM_R(pos_R-last_pos_R);//右轮胎位置变化Mfloatomega_LM_L/0.001;//左轮胎角速度floatomega_RM_R/0.001;//右轮胎角速度//打印左右两轮胎旋转角速度My_USART_Printf(USART2,%f,%f,%f,%f,%f\n,omega_L,omega_R,pos_L,pos_R,M_L,M_R);//单片机用printf显示float类型数据last_pos_Lpos_L;last_pos_Rpos_R;}}原因编码器每圈仅 22 脉冲减速比 20.4轮胎每圈 448.8 脉冲每个脉冲约 0.8°。低速下 1ms 内大概率 0 个脉冲偶尔蹦出 1 个导致速度在 0 和 800°/s 之间跳变。这是 M 法的固有缺陷低速量化噪声大。临时方案加大采样周期如 10ms让每次采样累积更多脉冲。后续计划明天改用 T 法测速测相邻脉冲的时间间隔低速下精度更高。