定时器编码器模式_以CH32X035为例检测EC11旋转编码器
编码器模式
编码器模式是定时器的一项典型应用,可用于检测编码器的输出,编码器连接到比较捕获通道1、2的输入端;编码器每输出一个脉冲会使计数器加一或减一,以下为计数方向与编码信号的关系;
定时器的初始化配置
void TIM1_EC11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0};
TIM_ICInitTypeDef TIM_ICInitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStructure.TIM_Period = 65535; // 重转载值
TIM_TimeBaseInitStructure.TIM_Prescaler = 0; // 预分频值,不分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数值
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); // TI1和TI2,都检测上升沿
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 0x0; // 输入通道的滤波参数
TIM_ICInit(TIM1, &TIM_ICInitStructure);
TIM_SetCounter(TIM1, 0x7fff); // 设置初始计数值
TIM_Cmd(TIM1, ENABLE);
}
重转载值可以设的大一点,初始的计数值可以设置为重转载值的一半,给两个方向的计数变化预留空间;当然,根据实际情况这两个值都可自定义为其他值;
EC11检测与分析
定时器按以上初始化后,是在TI1和TI2的上升边沿计数;以下为某EC11的旋转变化输出;
假设编码器的A与TI1连接,B与TI2连接,C连GND,根据计数方向与编码信号的关系;
当旋转编码器往正方向(-->)旋转,先触发了TI1的上升沿,此时TI2检测为低电平,则向上计数,计数值加一;再触发了TI2的上升沿,此时TI1检测为高电平,计数值再向上加一;
当旋转编码器往负方向(<--)旋转,将输出波形从右往左看,先触发TI2的上升沿,此时TI1检测为低电平,向下计数,计数值减一;再触发TI1的上升沿,此时TI2检测为高,计数值再向下减一;
按以上分析,编码器每旋转一小格,计数值会发生两次变化,那我们接下来通过以下检测来看看现象是否一致:
void EC11_Get(void)
{
static int16_t Temp=0;
Temp = 0x7fff-TIM_GetCounter(TIM1);
TIM_SetCounter(TIM1, 0x7fff);
if(Temp > 0) printf("EC11 turn left\r\n");
else if(Temp < 0) printf("EC11 turn right\r\n");
}
函数放在while(1)中循环检测,旋转编码器分别向两个方向旋转一小格后串口打印如下,每个方向都打印了两次,现象与上面分析一致;

以上只是简单的判断旋转方向,仅供参考,其他应用如利用计数值的变化量来确定旋转的位移等,就由各位大佬自行发挥了。
浙公网安备 33010602011771号