0604 编码器接口简介

本质上也是旋转编码器计次,只不过这个代码是通过定时器的编码器接口,来自动几次。

在这里插入图片描述
之前的代码是通过触发外部中断,然后在中断函数里手动进行计次,使用编码器接口的好处就是节约软件资源。
当电机高速旋转时,编码器每秒产生成千上万个脉冲,然后进入中断后,完成的任务又只是简单的加一减一,那软件资源就被这种简单而又低级的工作占用了,所以对于这种需要频繁执行,操作又比较简单的任务,一般都会设计一个硬件模块电路,来自动完成。

如果每隔一段时间取一下计次值,就能得到编码器旋转的速度了。这里编码器测速一般应用在电机控制的项目上,使用PWM驱动电机,再使用编码器测量电机的速度,然后再用PID算法进行闭环控制,这是一个比较常见的实用场景。

一般电机转速比较高,会使用无接触的霍尔式传感器或者光栅进行测速。为了方便,就使用触点式的旋钮编码器来演示,电机旋转用人工
来模拟,这个旋转编码器和电机的霍尔、光栅编码器都是一样的效果,

在这里插入图片描述
输出的两个方波信号,相位相差90度,超前90度或者滞后90度,分别代表正转和反转。这就是正交编码器

一个编码器,两个输出,一个是A相,一个是B相,然后接到STM32,定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器,运行自增或自减。比如初始化之后,CNT初始值为0,然后编码器右转,CNT就++ ,右转产生一个脉冲,CNT就加一次,这个编码器接口,就是相当于带有方向控制的外部时钟,它同时控制着CNT的计数时钟和计数方向。这样CNT的值就表示了编码器的位置。
如果我们每隔一段时间取一次CNT的值,再把CNT清零。
这个编码器测速实际就是测频法测正交脉冲的频率,CNT计次,然后每隔一段时间就取一次计次,只不过这个编码器接口计次更高级。它能根据旋转方向,不仅能自增计次,还能自减计次,是一个带方向的测速

如果一个定时器配置成了编码器接口模式,那它基本就干不了其他活了,如果编码器比较多的话,需要考虑一下这个资源够不够用,不过实在不行的话,还是可以用外部中断来接编码器的。

从这里也可以看出,硬件资源和软件资源是互补的,这样就是利用软件资源来弥补硬件资源了。硬件资源越多,软件越轻松。硬件不够呢软件来凑。

正交编码器一般可以测量位置,或者带有方向的速度值,一般有两个信号输出脚,一个是A相,一个是B相。
只有一相的信号无法测量旋转方向。
比如可以不要这个B相,再定义一个方向输出脚,正转置高电平,反转置低电平。
另一种正交信号:反转时,A相滞后B相90度,毕竟正转和反转的定义也是相对的。首先是正交信号精度更高,因为A,B相都可以计次,相当于计次频率提高了一倍。其次就是正交信号可以抗噪声,因为正交信号,两个信号必须是交替跳变的,如果一个信号不变,另一个信号连续跳变,也就是产生了噪声,那这时计次值是不会变化的。
旋转方向判断:在一相的边沿信号检测另一相的高低电平状态。

编码器接口处于定时器的这个位置。高级定时器和通用定时器都是一样的,每个定时器只有一个编码器接口,基本定时器没有此接口。
在这里插入图片描述

分别要接到编码器的A相和B相,TI1FP1和TI2FP2分别连接到滤波器和边沿检测器后面,借用了输入捕获单元的前两个通道,所以最终编码器的输入引脚,就是定时器的CH1和CH2两个引脚,CH3和CH4与编码器接口无关。
编码器接口的输出部分,其实就相当于从模式控制器了,去控制CNT的计数时钟和计数方向,简单来说,这里的输出执行流程是,按照我们总结的表,如果出现了边沿信号,并且对应另一相的状态为正转,则控制CNT自增,否则控制CNT自减。
注意在这里,我们之前一直用的72Mhz内部时钟,和我们再时基单元初始化时设置的计数方向,并不会使用,因为此时计数时钟和计数方向都处于编码器接口托管的状态,计数器的自增和自减,受编码器控制

在这里插入图片描述
编码器接口根据编码器的旋转方向,控制CNT的计数方向,一般我们会设置ARR为65535,最大量程。这样利用补码的特性,很容易得到负数,65535、65534这里负数不应该是-1,-2吗,直接把这个16位的无符号整数转换为16位的有符号数,这样就可以直接得到负数,非常方便,

在这里插入图片描述
TI1FP1和TI2FP2接的就是编码器的A相B相,TI1FP1对应TI2,就是另一相电平的意思。然后再这里,编码器分了3种工作模式。如果两个边沿都计数,计数的时刻就是两个信号都计数。一般情况下,用再TI1和TI2上都计数,因为这个模式计数精度最高。

在这里插入图片描述

在这里插入图片描述
对应手册里 14.3.12 编码器接口模式部分

编码器接口相当于使用了一个带有方向选择的外部时钟

代码编写步骤:
1.RCC开启时钟,开启GPIO和定时器的时钟
2.配置GPIO,这里需要把PA6和PA7配置成输入模式
3.配置时基单元,这里预分频器我们一般选择不分频,自动重装一般给最大65535,只需要个CNT执行计数就可以了。
4.配置输入捕获单元 不过这里输入捕获单元只有滤波器和极性两个参数有用,后面的参数没有用到,与编码器无关
5.配置编码器接口模式
6.调用TIM_Cmd,启动定时器
完事
CNT就会随着编码器旋转而自增自减,如果想要测量编码器的位置,直接读出CNT的值就可以了。如果想测量编码器的速度和方向,那就需要每隔一段固定的闸门时间,取出一次CNT,然后再把CNT清零,这样就是测频法测量速度了。

在这里插入图片描述
TIM_EncoderInterfaceConfig 定时器编码器接口配置
第二个参数选择编码器模式,然后后面两个参数,分别选择通道1和通道2的电平极性,这就是配置编码器接口的函数,其他函数,我们就不需要再了解了。
上拉和下拉的选择原则:和外部模块保持默认状态一致,防止默认电平打架。不过一般来说,默认高电平,这是一个习惯的状态,所以一般上拉输入用的比较多。或者外部信号输出功率非常小,浮空输入,没有上拉电阻和下拉电阻去影响外部信号,但是缺点就是当引脚悬空时,没有默认的电平了,输入就会收到噪声干扰,来回不断地跳变。

因为编码器接口会托管时钟,编码器接口就是一个带方向控制的外部时钟

在这里插入图片描述
这里的上升沿参数代表的是高低电平极性不反转,也就是PPT里面的TI1、TI2是否反相。对应通道,给上升沿,就是不反相,给下降沿,就是反相,属于重复配置了,可以删掉。
TIM_ICInit(TIM3, &TIM_ICInitStructure); //将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道
把这些参数写入到通道1,还有通道2。

在这里插入图片描述
这一块代码的逻辑就是:首先定义结构体变量,然后StructInit给结构体赋一个初始值,再部分修改我们想要的参数,调用ICInit配置一遍电路,这个结构体变量的配置,调用ICInit函数之后,就写入到硬件的寄存器了,所以Init之后,这个结构体我们可以换个值继续使用,不需要重新定义新的结构体了。那到这里,两个通道的滤波器和极性,就都配置好了

配置编码器接口,只需要调用一个函数就行了
TIM_EncoderInterfaceConfig

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值