最近项目上用到了旋转编码器,但是抖动很厉害,看了几篇文章后,写出的如下的消抖代码。
旋转编码器引脚分别连接单片机的PA9,PA10引脚,旋转编码器型号为EC12E24204A7 。
#include "encoder.h"
#include "systick.h"
int16_t encoder_count;
void Encoder_Init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);//开启GPIOA时钟
rcu_periph_clock_enable(RCU_AF);//开启AFIO时钟
//初始化PA9和PA10引脚,配置为上拉输入模式
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
//AFIO外部中断选择引脚配置
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_9);
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_10);
//EXTI初始化
exti_init(EXTI_9,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
exti_init(EXTI_10,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
//NVIC初始化
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(EXTI5_9_IRQn,1U,1U);
nvic_irq_enable(EXTI10_15_IRQn,1U,2U);
//清除中断标志位
exti_interrupt_flag_clear(EXTI_9);
exti_interrupt_flag_clear(EXTI_10);
}
int16_t encoder_get(void)
{
int16_t temp;
temp=encoder_count;
encoder_count=0;
return temp;
}
enum Direction
{
JUMP,
RIGHT,
LIFT,
};
//定义旋钮转动方向标志位
static uint8_t flag = JUMP;
//PA9外部中断函数
void EXTI5_9_IRQHandler(void)
{
if(exti_interrupt_flag_get(EXTI_9)==SET)
{
if(gpio_input_bit_get(GPIOA,GPIO_PIN_10)==1&& flag == RIGHT) //右转
{
encoder_count++;
flag = JUMP;
}
else if(gpio_input_bit_get(GPIOA,GPIO_PIN_10)==1&& flag == LIFT) //左转
{
encoder_count--;
flag = JUMP;
}
exti_interrupt_flag_clear(EXTI_9);//清空中断标志位
}
}
//PA10外部中断函数
void EXTI10_15_IRQHandler(void)
{
if(exti_interrupt_flag_get(EXTI_10)==SET)
{
if(gpio_input_bit_get(GPIOA,GPIO_PIN_9) == 1) //右转
{
flag = RIGHT;
}
else if(gpio_input_bit_get(GPIOA,GPIO_PIN_9 )== 0) //左转
{
flag = LIFT;
}
exti_interrupt_flag_clear(EXTI_10);//清空中断标志位
}
}
#ifndef _ENCODER_H_
#define _ENCODER_H_
#include "gd32f10x.h"
void Encoder_Init(void);
int16_t encoder_get(void);
#endif