旋转编码器中断方式实现计数
旋转编码器正转两路信号相位关系
旋转编码器反转两路信号相位关系
↓↓↓↓利用中断方式实现编码器计数↓↓↓↓↓
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信号归零计数值,结果如下图