编码器模式转得乱七八糟?别只怪电机,看看 TI1/TI2 极性
摘要:TIM 配置成 Encoder Mode,正转加计数,反转减计数,低速正常,高速就乱?不是编码器精度问题,而是 TI1/TI2 的极性(Polarity)与输入滤波配置错误。本文解析正交编码器的硬件解码逻辑。
一、问题描述(现象)
**旋转编码器,慢慢拧,计数正常;
稍微转快一点,计数突然跳变或反向;
示波器看 TI1/TI2 波形很干净。**
很多工程师的排查方向是:
-
编码器坏了?
-
TIM 计数模式选错了?
-
加个软件消抖?
二、原理分析
1. 物理模型
正交编码器输出两路相位差 90° 的信号:
TI1: ___|‾‾‾|___|‾‾‾|___
TI2: _|‾‾‾|_|‾‾‾|_|‾‾‾|_
↑ ↑ ↑
A B A
2. 核心参数
-
Encoder Mode:TIM 的编码器模式(TI1/TI2 计数)。
-
Polarity(极性):上升沿 / 下降沿触发。
-
ICFilter(输入滤波):数字滤波器系数。
3. 反直觉真相
“只在上升沿计数”是错的。
-
编码器模式必须同时在 TI1 和 TI2 的边沿计数。
-
如果只选
Rising Edge:-
高速时,占空比轻微不对称 → 计数丢失或重复。
-
-
如果极性选反:
-
正转变成反转,方向永远不对。
-
三、工程级解决方案
方案 1:正确的编码器模式配置(标准解法)
必须配置为 TI1 + TI2 边沿计数。
// STM32 HAL 示例
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535;
HAL_TIM_Encoder_Init(&htim3, &sConfig);
// 关键:两个通道都要配置极性
TIM_IC_InitTypeDef sConfigIC;
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; // 或 BOTHEDGE
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 6; // 非常重要!
HAL_TIM_Encoder_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_1);
HAL_TIM_Encoder_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_2);
方案 2:ICFilter 是灵魂(消抖神器)
编码器机械触点会产生抖动。
|
转速 |
推荐 ICFilter |
|---|---|
|
低速 (< 100 RPM) |
8 ~ 12 |
|
中速 (100~1000 RPM) |
4 ~ 8 |
|
高速 (> 1000 RPM) |
0 ~ 4 |
经验公式:
ICFilter = 4≈ 采样频率 = fCK_INT / 8。
方案 3:判断方向(软件修正)
如果硬件方向始终不对,可以在软件层修正:
int16_t count = (int16_t)__HAL_TIM_GET_COUNTER(&htim3);
if (count > 32768) count -= 65536;
四、选型避坑建议
-
不要混用通道:
-
TI1 必须接 A 相,TI2 必须接 B 相,接反了方向必反。
-
-
Period 值:
-
12 位编码器:Period ≥ 4096。
-
16 位定时器:Period = 65535(防止溢出)。
-
-
不要在中断里读:
-
编码器模式是硬件计数,不要在 Update 中断里频繁清零,会破坏计数连续性。
-
五、总结 Checklist
-
[ ] 是否配置为
TIM_ENCODERMODE_TI12? -
[ ] 是否两个通道都配置了相同的 Polarity?
-
[ ] 是否开启了输入滤波(ICFilter ≥ 4)?
-
[ ] 是否在高速下测试过计数连续性?
六、写在最后(关注我,少走弯路)
我是 gqqsherry,一个拒绝调包、专注底层逻辑的嵌入式工程师。
编码器模式是 TIM 外设最像“状态机”的功能,配置对了就是丝滑,配置错了就是玄学。
关注我的专栏《嵌入式底层避坑指南》,下一篇我们将深入解析 《定时中断进不来?别只怪 Prescaler,看看 Counter Mode》。
👉 下一篇预告:《TIM 定时中断不准?别只怪 SystemCoreClock,看看 Center-Aligned 模式》
原创文章,转载请注明出处。
更多推荐
所有评论(0)