EC11编码器消抖

发布时间 2023-07-29 22:25:32作者: 一月一星辰

前言

之前在网上看到一篇文章优雅的对旋转编码器消抖(EC11,正交) - 知乎 (zhihu.com)感觉大佬用的方法挺不错的,这里在STM32上使用一下看下效果。

消抖原理

img

消抖的核心思路:

A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状态,来判断正反转一次。

优点:只需要一个管脚的外部触发,另一脚单纯获取电平状态即可。

还是要建议给AB脚各加上1颗103电容最好,避免频繁进入中断消耗资源。

核心代码

PA6 PA4中任意一个设为外部中断,上下沿均会触发。

#include "main.h"
#include "ec11.h"
#include <stdio.h>
static uint8_t EC11_flag = 0;
static uint8_t CW_1 = 0;
static uint8_t CW_2 = 0;  

void EC11_callback(void)
{   
    // 只要处理一个脚的外部中断--上升沿&下降沿
    GPIO_PinState alv = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);
    GPIO_PinState blv = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);

    if(EC11_flag == 0 && alv == GPIO_PIN_RESET)
    {
        CW_1 = blv;
        EC11_flag = 1;
    }

    if(EC11_flag && alv)
    {
        CW_2 = !blv;//取反是因为 alv,blv必然异步,一高一低。
        if(CW_1&&CW_2)
        {
            printf("right on\n");
        }
        if(CW_1 == 0 && CW_2 == 0)
        {
            printf("left on\n");
        }
        EC11_flag = 0;
    }
}

测试验证

每次旋转,均会打印一下,测试现象无跳帧效果。

参考文章