定时器编码器模式_以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)中循环检测,旋转编码器分别向两个方向旋转一小格后串口打印如下,每个方向都打印了两次,现象与上面分析一致;

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

posted @ 2024-05-06 16:15  WCH_CH32  阅读(551)  评论(0)    收藏  举报