看到的是:
- 顺时针拧一下
encoder_cnt不是+1- 而是经常
+2
已经 碰到"编码器计数倍频"这个知识点了。
一、为什么不是加 1,而是加 2
编码器"拧一下"的机械手感一格,不一定等于定时器计数器只加 1。
因为这里有两个概念,容易混:
1. 机械一格
- "咔哒"一下
- "卡点"一下
这是机械刻度。
2. 电气计数
这是 A/B 相在这一格过程中,产生了多少次有效边沿,被 TIM3 记了多少次数。
这是电气分辨率。
这两个不一定一一对应。
二、为什么会出现 +2
编码器有两路信号:
- A 相
- B 相
拧一格时,A/B 相会经历状态变化。
比如某种方向可能是:
- 00 -> 01 -> 11 -> 10 -> 00
这里面其实发生了多个边沿变化。
而定时器编码器模式会根据配置,按边沿来计数。
所以:
- 有的编码器一格可能记
1 - 有的可能记
2 - 有的可能记
4
三、为什么这次是 +2
如果代码里配置的是:
c
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
这个组合可以这样理解:
- CH1、CH2 两路都参与方向判断
- 但你当前是按上升沿在计
所以最终你看到的有效计数,可能是每机械一格对应 2 个有效计数。
如果换一种采样方式、换别的芯片实现细节、或者编码器本体触点结构不同,有时会看到 1、2、4 都不奇怪。
四、怎么理解
定时器 CNT 的单位,不一定是"机械一格",而是"编码器接口配置下的有效计数单位"。
所以:
- 顺时针一格 ≈
+2 - 逆时针一格 ≈
-2
后面写功能时,可以直接拿这个参数用:【目前环境下】
- 一格 = 2 count