一、编码器功能简介 在马达类控制应用中,正交编码器可以反馈马达的转子位置及转速信号。MM32系列MCU集成了正交编码器接口,便于客户使用。先简单回顾下编码器原理:如果两个信号相位差为90度,则这两个信号为正交。由于两个信号相差90度,因此可以根据两个信号的先后来判断方向、根据每个信号脉冲数量的多少及整个编码轮的周长即可算出当前行走的距离、如果再加上定时器的话还可计算出速度。 二、MM32编码器工作分析 编码器接口模式通过设置 tiMx_SMCR 寄存器中的 SMS,MM32编码器模式共有3种。
通过设置 TIMx_CCER 寄存器中的 CC1P 和 CC2P 位,可以选择 TI1 和 TI2 极性;如果需要,还可对输入滤波器编程。 两个输入 TI1 和 TI2 被用来作为增量编码器的接口。下表,假定计数器已经启动(TIMx_CR1寄存器中的 CEN = 1),则计数器由每次在 TI1FP1 或 TI2FP2 上的有效跳变驱动。 TI1FP1 和TI2FP2 是 TI1 和TI2 在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1 = TI1;如果没有滤波和变相,则 TI2FP2= TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数。不管计数器是依靠 TI1 计数、还是依靠 TI2 计数或是同时依靠 TI1 和 TI2 计数。 编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在 0到TIMx_ARR 寄存器的自动装载值之间连续计数(根据方向,或是 0 到 ARR 计数,或是 ARR到 0 计数)。所以在开始计数之前必须配置 TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设 TI1 和 TI2 不同时变换。
一个外部的增量编码器可直接与 MCU 连接而不需要外部接口逻辑。但是,一般使用比较器将编码器的差动输出转换到数字信号,这大大增加了抗噪声干扰能力。编码器输出的第三个信号表示机械零点,可把它连接到一个外部中断输入并触发一个计数器复位。 三、MM32编码器实例代码配置解析 下图是一个计数器操作的实例,显示了计数信号的产生和方向控制。它还显示了当选择了双边沿时,输入抖动是如何被抑制的;抖动可能会在传感器的位置靠近一个转换点时产生。在这个例子中,我们假定寄存器配置如下: CC1S = ‘01’(TIMx_CCMR1 寄存器, IC1FP1 映射到 TI1) CC2S = ‘01’(TIMx_CCMR2 寄存器, IC2FP2 映射到 TI2) CC1P= ‘0’(TIMx_CCER 寄存器, IC1FP1 不反相, IC1FP1 = TI1) CC2P = ‘0’(TIMx_CCER 寄存器, IC2FP2 不反相, IC2FP2 = TI2) SMS = ‘011’(TIMx_SMCR 寄存器,所有的输入均在上升沿和下降沿有效) CEN = ‘1’(TIMx_CR1 寄存器,计数器使能) 编码器模式下的计数器操作实例
下图为当 IC1FP1 极性反相时计数器的操作实例(CC1P = ‘1’,其他配置与上例相同) IC1FP1 反相的编码器接口模式实例
当定时器配置成编码器接口模式时,提供传感器当前位置的信息。使用第二个配置在捕获模式定时器测量两个编码器事件的间隔,可以获得动态的信息(速度,加速度,减速度)。指示机械零点的编码器输出可被用做此目的。根据两个事件间的间隔,可以按照固定的时间读出计数器。 代码配置: 1、 以MM32L073为例,其他系列可参考以下代码配置,这里我们做一个简单的演示程序。首先来看main 函数。 int main(void) { delay_init(); //初始化delay 函数 TIM3_Counter_Init(); //配置TIM3编码器模式 while(1){} } 2、接下来,我们来看TIM的编码器配置函数。
实验现象: 1、下载程序进入调试模式(KEIL 环境)并全速运行,观察TIM3计数器值为0,如下图所示。
2、从外部通过PA6, PA7输入一段波形如下图所示,根据我们设置的双边计数,从波形上看,计数器应该计数增加8。
3、观察计数器,此时计数为8,与理论值符合。
|