一、编码器接口
编码器接口可以接收正交编码器的信号,根据编码器旋转产生的正交信号脉冲,通过硬件自动控制CNT值的自增或自减,从而指出编码器的位置、旋转方向和旋转速度。
每个高级定时器和通用定时器都有一个编码器接口,他们会占用TIM的CH1和CH2两个通道。
二、编码器接口结构框图
编码器接到CH1和CH2通过滤波器和和边沿检测电路,通过TI1FP1和TI2FP2来到编码器接口,编码器接口这时给下面的时基单元提供基础脉冲,来促使CNT++或CNT--,从而达到记录速度和位置的特点。
将上图简化一下可以得到这样的一个图。
三、计数方向与编码器信号的关系
在一般情况下我们会选择最后一种,在TI1和TI2上计数,也就是CH1和CH2任意一个引脚跳变,都会导致CNT计数。
A相一边接到TI1FP1 , B相是TI1FP2。
正转时,A相超前B相90度,A相出现上升沿,B相为低,则CNT++。B相上升沿,A相高,则CNT++。当A相下降沿B项高CNT++。当B相下降沿,A相低时,CNT++;
反转时,A相滞后B相90度。查表同理。
四、硬件抗干扰
这里我们仅分析毛刺阶段,计数器如何操作的。当A相上升沿,B相低,CNT++; A相下降沿,B相低,CNT--。这种毛刺信号并不会导致CNT的值累加,实现硬件抗干扰。
五、代码
在本次实验中,我们使用单片机一边进行定时器TIM2定时中断,在定时中断里面读取TIM3接收编码器的CNT值。这里仅介绍Encoder的编码逻辑,TIM2的不详细介绍。 ①开启TIM3、GPIO时钟。②配置GPIO和时基单元。③配置输入捕获IC,捕获CH1和CH2。④配置成编码器模式后开启时钟。
为了节省文章篇幅,代码已经放在github仓库里了。hal库的暂未更新,请耐心等待。
STM32F103c8t6_learning/GPIO_std/STM32f1_Encoder at main · Jiang-kun02/STM32F103c8t6_learning
参考
[6-7] TIM编码器接口_哔哩哔哩_bilibili
[6-8] 编码器接口测速_哔哩哔哩_bilibili