前言
之前在网上看到一篇文章优雅的对旋转编码器消抖(EC11,正交) - 知乎 (zhihu.com)感觉大佬用的方法挺不错的,这里在STM32上使用一下看下效果。
消抖原理
消抖的核心思路:
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;
}
}
测试验证
每次旋转,均会打印一下,测试现象无跳帧效果。