TIM(编码器接口)(STM32学习笔记)

编码器接口简介

·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;配置编码器接口

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sakabu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值