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

编码器接口工作模式


- 仅在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上计数)


具体步骤及代码实例
这里以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; TIM_TimeBaseStructure.Prescaler = 1 - 1; 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; 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; 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_On(TIM3); }
|