stm32.TIM定时器编码器模式

8 篇文章 28 订阅

最近用到编码器控制电机,因为编码器用到了定时器的输入捕获功能,初学时候没有认真去看,这边打算结合代码重新整理一遍。

编码器接口模式

1.选择编码器接口模式的方法是:
如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;
如果只在TI1边沿计数,则置SMS=010;
如果计数器同时在TI1和TI2边沿计数,则置SMS=011。

通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;
如果需要,还可以对输入滤波器编程。

两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;
如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数,
同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。

编码器接口模式—基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计 数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。

在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1和TI2不同时变换
在这里插入图片描述

接下来配置一个计数器:
● 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寄存器,计数器使能)

在这里插入图片描述这个图便是计数器操作的实例,结合表77其实就可以很好地理解为什么能通过TI1和TI2如何来检测编码器前进后退,频率则可以达到测速的效果

AB相的电平和跳变沿决定了CNT的加数和减数。
CNT增计数时:
A上升沿,B逻辑低
B上升沿,A逻辑高
B下降沿,A逻辑低
A下降沿,B逻辑高
CNT减计数是:
A下降沿,B逻辑低
B下降沿,A逻辑高
B上升沿,A逻辑低
A上升沿,B逻辑高

编码器配置源码如下

void Encoder_Init_TIM2(void)
{
	RCC->APB1ENR|=1<<0;     //TIM2时钟使能
	RCC->APB2ENR|=1<<2;    //使能PORTA时钟
	GPIOA->CRL&=0XFFFFFF00;//PA0 PA1    为编码器的ab相
	GPIOA->CRL|=0X00000044;//浮空输入  (这边为什么使用浮空输入暂时不清楚,希望指点)
	/* 把定时器初始化为编码器模式 */ 
	TIM2->PSC = 0x0;//预分频器
	TIM2->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值 65535    
  TIM2->CCMR1 |= 1<<0;          //输入模式,IC1FP1映射到TI1上
  TIM2->CCMR1 |= 1<<8;          //输入模式,IC2FP2映射到TI2上
  TIM2->CCER |= 0<<1;           //IC1不反向   捕获发生在上升沿
  TIM2->CCER |= 0<<5;           //IC2不反向     捕获发生在上升沿
	TIM2->SMCR |= 3<<0;	          //SMS='011' 所有的输入均在上升沿和下降沿有效
	TIM2->CR1 |= 0x01;    //CEN=1,使能定时器
}

TIM2->CCMR1 |= 1<<0; //输入模式,IC1FP1映射到TI1上
TIM2->CCMR1 |= 1<<8; //输入模式,IC2FP2映射到TI2上
在这里插入图片描述
在这里插入图片描述

TIM2->CCER |= 0<<1; //IC1不反向
TIM2->CCER |= 0<<5; //IC2不反向
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从模式控制寄存器(TIMx_SMCR)

smcr寄存器的sms位存在几种模式,如下
在这里插入图片描述
当sms为111时外部时钟源模式1被选中,计数器可以在选定输入端的每个上升沿
或下降沿计数

在这里插入图片描述例:要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

  1. 配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿
  2. 配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)
    注: 捕获预分频器不用作触发,所以不需要对它进行配置
  3. 配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性
  4. 配置TIMx_SMCR寄存器的SMS=’111’,选择定时器外部时钟模式1
  5. 配置TIMx_SMCR寄存器中的TS=’110’,选定TI2作为触发输入源
  6. 设置TIMx_CR1寄存器的CEN=’1’,启动计数器
    当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。

外部时钟源模式2
选定此模式的方法为:令TIMx_SMCR寄存器中的ECE=1 计数器能够在外部触发ETR的每一个上升沿或下降沿计数。

例:要配置在ETR下每2个上升沿计数一次的向上计数器,使用下列步骤:

  1. 本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF[3:0]=0000
  2. 设置预分频器,置TIMx_SMCR寄存器中的ETPS[1:0]=01
  3. 设置在ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=0
  4. 开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1
  5. 启动计数器,置TIMx_CR1寄存器中的CEN=1
    计数器在每2个ETR上升沿计数一次。
  • 17
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值