编码器接口简介
·Encoder Interface 编码器接口
·编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
·每个高级定时器和通用定时器都拥有1个编码器接口
·两个输入引脚借用了输入捕获的通道1和通道2,因此通道3和4不可用于编码器接口
配置编码器接口的基本结构
图1
计数方向与编码器信号的关系
图2
我们一般选择TI1和TI2都计数,这样结果比较准确。
对于正交编码器,区分正反转参考下图
图3
对照图3和图2,可知正转的时候,计数器自增计数,反转的时候,计数器自减计数。
编码器接口初始化配置模板
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//选择上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式
TIM_TimeBaseInitStructure.TIM_Period=65536-1;//ARR 给最大值,方便换算成负数
TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//PSC 不分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器 高级计数器才有 置0
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//初始化输入捕获单元(编码器接口借用)
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//选择通道1 对应PA6引脚
TIM_ICInitStructure.TIM_ICFilter=0xF;//配置输入捕获的滤波器 0x0~0xF 越大滤波效果越好
TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;//选择通道2 对应PA7引脚
TIM_ICInitStructure.TIM_ICFilter=0xF;//配置输入捕获的滤波器 0x0~0xF 越大滤波效果越好
TIM_ICInit(TIM3,&TIM_ICInitStructure);
//配置编码器接口
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
TIM_Cmd(TIM3,ENABLE);
可见之前的定时器内容,在配置时基单元之前,我们都需要选择时钟,内部时钟或者外部输入时钟等,但是我们这节内容不需要,直接初始化GPIO后配置时基单元,参考手册里有这样一句话:“编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟”,因为编码器接口会托管时钟,可以理解为编码器接口就是一个带方向控制的外部时钟。
回到模板里来,选择TIM3的通道1和通道2,对应PA6和PA7引脚。
PSC选择不分频,ARR给最大值,当编码器反转、计数器自减小于0时,会从65535开始继续减小,但强制转换成int16_t类型时,会转换成从-1开始减小,这样就能用OLED屏幕显示出来。
由简介和基本结构(图1)可知,配置输入捕获单元,这里只用配置滤波器和极性选择/边沿检测两个参数,所以定义结构体后调用TIM_ICStructInit函数初始化不需要用的参数,再对需要的参数修改,这里的极性选择可以删除,因为后面配置编码器接口时也会进行配置,即函数TIM_EncoderInterfaceConfig,该函数有四个参数,第一个选择TIMx,第二个选择TI1和TI2都计数,第三和第四个函数就是选择两个信号的极性,这里的极性其实指的是要不要反相,选择Rising就是通道不反相,一般选择不反相。这样就配置完所有参数了,最后打开定时器。
想要测速度,可以定义下面这个函数
int16_t Encoder_Get(void)
{
int16_t Temp;
Temp=TIM_GetCounter(TIM3);//读取CNT的值
TIM_SetCounter(TIM3,0);//将CNT的值置0
return Temp;
}
在while循环里,调用这个函数后Delay1秒,就可以读出每秒CNT变化了多少。
重要函数
TIM_EncoderInterfaceConfig;配置编码器接口