STM32驱动_旋转编码器EC11(中断触发版本)
说明:根据示波器测量的真实波形,可以看到,旋转编码器转动一格,实际上只有波形的一个电平变化,并不是输出一个完整周期的波形。
中断触发方案:将旋转编码器的A和B两个引脚设置为A下降沿触发,B上升沿触发,然后在中断处理函数中即可得到旋转数值
void HAL_GPIO_EXTI_Callback(unsigned short GPIO_Pin)
{
if(GPIO_Pin == ENCODER_PIN_A) //下降沿触发
{
if(READ_ENCODER_B == 1)
{
encoder_dev.encoderNum++;
Debug_printf("encoder_dev.encoderNum:%d",encoder_dev.encoderNum);
}
else
{
encoder_dev.encoderNum--;
Debug_printf("encoder_dev.encoderNum:%d",encoder_dev.encoderNum);
}
}
if(GPIO_Pin == ENCODER_PIN_B) //上升沿触发
{
if(READ_ENCODER_A == 0)
{
encoder_dev.encoderNum--;
Debug_printf("encoder_dev.encoderNum:%d",encoder_dev.encoderNum);
}
else
{
encoder_dev.encoderNum++;
Debug_printf("encoder_dev.encoderNum:%d",encoder_dev.encoderNum);
}
}
}
typedef struct encoder_status
{
unsigned char encoderNum;
unsigned char encoderDown;
}encoder_status_t;
extern encoder_status_t encoder_dev;
#define ENCODER_PIN_A GPIO_PIN_1
#define ENCODER_PIN_B GPIO_PIN_0
#define ENCODER_PIN_DOWN GPIO_PIN_15
#define READ_ENCODER_A HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_1)
#define READ_ENCODER_B HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_0)
#define READ_ENCODER_DOWN HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15)