编码器接口
本质
编码器测速相当于测频法测正交脉冲的频率,CNT计次,每隔一段时间取一次计次。高级,它是带方向的计次。
手册

编码器接口简介
通过定时器的编码器接口来实现自动计次。之前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行,操作简单的任务,一般设计一个硬件电路模块来自动完成。
使用定时器的编码器接口,再配合编码器,就可以测量旋转速度和旋转方向。编码器测速一般应用在电机控制的项目上。使用PWM驱动电机,再使用编码器测量电机的速度,然后再使用PID算法进行闭环控制。

编码器的工作流程:根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而只是编码器的位置、旋转方向和旋转速度
这是一个编码器,它有两个输出,一个是A相,一个是B相,然后接入到stm32,定制起的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减。比如初始化后,CNT初始值为0,然后编码器右转,CNT就++,右转产生一个脉冲,CNT就加一次,比如右转产生10个脉冲停下来,那么CNT就由0自增到10,停下来。编码器左转,CNT就–,左转产生一个脉冲,CNT减一次,如编码器左转产生5个脉冲,CNT就在原来10的基础上自减5停下来。

正交编码器(输出两个相位相差90°的方波信号)一般可以测量位置,或者带有方向的速度值,它一般有两个信号输出引脚,一个是A相,一个是B相,当编码器的旋转轴转起来,A和B相会输出方波信号,转的越快,方波的频率就越高,所以方波的频率就代表了速度。取出任意一相的信号来测量频率,就能知道旋转速度。
方向:当正转时,A相提前B相90度,反转时,A相滞后B相90度。接口:一个带有方向控制的外部时钟
使用正交信号精度更高,AB相都可以计次,相当于计次频率提高了一倍,还可以加抗噪声电路。
首先把A相和B相的所有边沿作为计数器的计数时钟,出现边沿信号时,就计数自增或自减,自增或自减的计数方向由另一相的状态来决定。查下表即可。

编码器接口有两个输入端,分别要接到编码器的A相和B相,有两个网络标号分别写的是TI1FP1和TI2FP2

可以看出这个编码器接口的两个引脚,借用了输入捕获单元的前两个通道,所以最终编码器的输入引脚是定时器的CH1和CH2这两个引脚

信号的通路如下(与CH3和CH4无关 ),编码器接口使用CH1和CH2的输入捕获滤波器和边沿检测,但没有使用后面的是否交叉、预分频器和CCR寄存器

编码器接口的输出部分就相当于从模式控制器,去控制CNT的计数时钟和计数方向,如果出现了边沿信号,并且对应另一相的状态为正转,则控制CNT自增,否则控制CNT自减。

注意:72MHZ内部时钟(CK_PSC)和在时基单元初始化设置的计数方向(上图的+/-)并不会使用,因为此时计数时钟和计数方向都处于编码器接口托管的状态,计数器的自增和自减受编码器的控制

编码器接口基本结构
输入捕获的前两个通道,通过GPIO口接入编码器A、B相,通过滤波器和边沿检测极性选择,产生TI1FP1和TI2FP2,通向编码器接口,编码器接口通过预分频器控制CNT计数器的时钟,同时,编码器接口还根据编码器的旋转方向,控制CNT的计数方向,编码器正转时,CNT自增,编码器反转时,CNT自减,ARR有效,一般我们设置ARR为65535,最大量程。补码:65535对应-1,依此类推(读出数据,得到负数的技巧)

工作细节和例子
在两相边沿计数,计数精度高(一般使用该模式)
正转
正转的状态都向上计数,反转的状态的都向下计数。

实例图1(向上计数、向下计数、正交编码器抗噪声)
如果出现了一个引脚不变,另一个引脚连续跳变多次的毛刺信号,计数器就会加、减、加、减来回摆动,最终计数值还是原来那个数,并不受毛刺噪声的影响。正交编码器抗噪声的原理

实例2(TI1反相,TI2不反相)极性

编码器接口测速
硬件接线图
计划用TIM3接编码器,所以需要接在PA6和PA7这两个引脚上。


编程步骤

第一步,RCC开启时钟,开启GPIO和定时器的时钟
第二步,配置GPIO,将PA6和PA7配置成输入模式
第三步,配置时基单元,这里预分频一般选择不分频
第四步, 配置输入捕获单元,只需要配置滤波器和极性两个参数
第五步,配置编码器接口模式
最后,调用TIM_Cmd启动定时器
电路初始化完成后,CNT就会随着编码器旋转而自增自减,如果想要测量编码器的位置,直接读出CNT的值即可,如果想要测量编码器的速度和方向,那就需要每隔一段固定的闸门时间,取出CNT,然后把CNT清零。

上拉输入还是下拉输入的选择
一般可以看一下接在这个引脚的外部模块输出的默认电平,如果外部模块空闲默认输出高电平,我们就选择上拉输入,默认输入高电平,如果外部模块默认输出低电平,我们配置下拉输入,默认输入低电平。总结,将需要配置电平的位置和外部模块保持默认状态一致,防止默认电平打架。

如果不确定外部模块输出的默认状态或者外部信号输出功率非常小,这时尽量选择浮空输入,浮空输入没有上下拉电阻去影响外部信号,缺点是当引脚悬空时,没有默认电平,输入就会受噪声干扰,来回不断跳变。
实验现象
测位置
A、B相各出现了一个下降沿和上升沿,所以计次总共加了4次。

如果转到0,再往左转,0自减,计数器反向溢出,回到自动重装值,65535,然后继续往下减。

如果我们想让0自减为-1,直接把uint16_t类型强制转换成int16_t即可

极性问题
硬件方面:对换AB相接线即可
软件方面:通过修改两个输入通道的极性,把任意一个极性反转一下,方向就会反过来

最低0.47元/天 解锁文章
5884





