国民技术N32定时器编码器接口模式
GaoSheng Lv4

编码器接口简介

  • 编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2
    image

编码器接口工作模式

image
image

  • 仅在TI1计数:只计数TI1FP1的脉冲数量。在TI1FP1上升、TI2FP2为高电平和TI1FP1下降、TI2FP2为低电平时向下计数;在TI1FP1上升、TI2FP2为低电平和TI1FP1下降、TI2FP2为高电平时向上计数。
  • 仅在TI2计数:只计数TI1FP2的脉冲数量。在TI2FP2上升、TI1FP1为低电平和TI2FP2下降、TI1FP1为高电平时向下计数;在TI2FP2上升、TI1FP1为高电平和TI2FP2下降、TI1FP1为低电平时向上计数。
  • 在TI1和TI2上计数:计数TI1FP1和TI1FP2的脉冲数量。向上计数和向下计数将上面结合。
    注:1、正转的状态都向上计数,反转的状态都向下计数
    2、一般选择第三个模式(在TI1和TI2上计数)
    image

image

具体步骤及代码实例

这里以N32G401系列TIM3 CH1,CH2(PA6,PA7)为例
第一步:RCC开启时钟,开启GPIO和定时器的时钟
第二步:配置GPIO,PA6和PA7配置成输入模式
第三步:配置时基单元,预分频器选择不分频,自动重装,一般给最大65535,只需要给CNT执行计数即可
第四步:配置输入捕获单元(只有滤波器和极性两个参数)
第五步:配置编码器接口模式(调用库函数)

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void Encoder_Init(void)
{
 GPIO_InitType GPIO_InitStructure;
 TIM_TimeBaseInitType TIM_TimeBaseStructure; 
 RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM3);
       RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);
 RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);
 //空闲默认高电平,选择上拉输入,空闲默认低电平,选择下拉输入
 //浮空输入:没有上拉电阻和下拉电阻去影响外部信号,
 //缺点:当引脚浮空时,没有默认的电平,易受到噪声的影响,来回不断跳变
 GPIO_Structure_Initialize(&GPIO_InitStructure);
 GPIO_InitStructure.Pin        = GPIO_PIN_6;
 GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_INPUT;
 GPIO_InitStructure.GPIO_Pull  = GPIO_PULL_UP;
 GPIO_InitStructure.GPIO_Current = GPIO_DS_4MA;
 GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM3;
 GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);

 GPIO_InitStructure.Pin        = GPIO_PIN_7;
 GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_INPUT;
 GPIO_InitStructure.GPIO_Pull  = GPIO_PULL_UP;
 GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM3;
 GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);

 TIM_Base_Initialize(TIM8, &TIM_TimeBaseStructure);
 TIM_TimeBaseStructure.Period    = 65536 - 1;  //ARR
 TIM_TimeBaseStructure.Prescaler = 1 - 1;      //PSC
 TIM_TimeBaseStructure.ClkDiv    = 0x0;
 TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;
 TIM_Base_Initialize(TIM3, &TIM_TimeBaseStructure);
  
 TIM_Input_Struct_Initialize(&TIM_ICInitStructure);
 TIM_ICInitStructure.Channel     = TIM_CH_1;
 TIM_ICInitStructure.IcPolarity  = TIM_IC_POLARITY_RISING;
 TIM_ICInitStructure.IcFilter    = 0xF;//0xF;
 TIM_Input_Channel_Initialize(TIM3, &TIM_ICInitStructure);
 TIM_Input_Struct_Initialize(&TIM_ICInitStructure);
 
 TIM_ICInitStructure.Channel     = TIM_CH_2;
 TIM_ICInitStructure.IcPolarity  = TIM_IC_POLARITY_RISING;
 TIM_ICInitStructure.IcFilter    = 0xF;//0xF;
 TIM_Input_Channel_Initialize(TIM3, &TIM_ICInitStructure); 
 TIM_Encoder_Interface_Set(TIM3, TIM_ENCODE_MODE_TI12, TIM_IC_POLARITY_RISING, TIM_IC_POLARITY_RISING);
 //编码器模式:TIM_EncoderMode_TI12,TI1和TI2都计数
 //后面两个参数为通道1和通道2的电平特性,上升沿:高低电平不反转(编码器上升沿和下降沿都有效) 
 TIM_On(TIM3);
}
本站由 提供部署服务