旋转编码器中断方式实现计数

发布时间 2023-09-09 21:26:20作者: Yannnnnnn

旋转编码器正转两路信号相位关系

旋转编码器反转两路信号相位关系

↓↓↓↓利用中断方式实现编码器计数↓↓↓↓↓

int32_t EncoderNum=0;
/*初始化PA0,PA1,PA4,打开EXTI中断*/
void Encoder_GPIO_Init(void )
{
    /*PA0=S1,PA1=S2,PA4=KEY*/
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_Init_Struct;
    GPIO_Init_Struct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4;
    GPIO_Init_Struct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_Init_Struct.Pull = GPIO_NOPULL;
    GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_MEDIUM;
    HAL_GPIO_Init(GPIOA,&GPIO_Init_Struct);
    
    /*设置中断优先级,并使能中断*/
    HAL_NVIC_SetPriority(EXTI0_IRQn,3,3);
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    HAL_NVIC_SetPriority(EXTI1_IRQn,3,3);
    HAL_NVIC_EnableIRQ(EXTI1_IRQn);
    HAL_NVIC_SetPriority(EXTI4_IRQn,2,3);
    HAL_NVIC_EnableIRQ(EXTI4_IRQn);

}

/*EXTI中断回调函数*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0)
    {
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)EncoderNum++;
        printf("EncoderNum=%d\n",EncoderNum);
    }
    if(GPIO_Pin == GPIO_PIN_1)
    {
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)EncoderNum--;
        printf("EncoderNum=%d\n",EncoderNum);
    }
    if(GPIO_Pin == GPIO_PIN_4)
    {
        EncoderNum=0;
        printf("EncoderNum=%d\n",EncoderNum);
    }

}

编码器正转与反转两路信号相位不同,由此实现计数值增减,KEY信号归零计数值,结果如下图