Using an encoder: Jitter Incorrectly Trigger Interrupts
Hello,
I‘m creating a counter that increments/decrements according to cw/ccw direction of an encoder.
An interrupt is triggered by the rising and falling edge on each channel.
Due to mechanical jitter, the interrupts are triggered (sometimes) simultaneously and will increment by values greater than 1. I was thinking of using a delay but how can I make my interrupt handlers more robust to prevent this occurring?
int main(){
FLASH_Init();
RCC_Init();
GPIO_Init();
USART2_Init();
EXTI0_Init();
EXTI1_Init();
NVIC_Init();
while(1){
}
}
void EXTI0_IRQHandler(void){
if (EXTI -> PR & (0x01U)){
if (((GPIOA -> IDR & (0x1U)) && (GPIOA -> IDR & (0x2U))) || ((!(GPIOA -> IDR & (0x1U))) && (!(GPIOA -> IDR & (0x2U))))){
STATE++;
printf("Encoder counts = %d \n\r",STATE);
//GPIOA -> ODR ^= (0x01U << 5);
}
if (((GPIOA -> IDR & (0x1U)) && (!(GPIOA -> IDR & (0x2U)))) || ((!(GPIOA -> IDR & (0x1U))) && (GPIOA -> IDR & (0x2U)))) {
STATE --;
printf("Encoder counts = %d \n\r",STATE);
}
}
EXTI -> PR = (0xFFFFFU);
// NVIC -> ICER[0] |= (0x1U << 6);
// NVIC -> ISER[0] |= (0x1U << 7);
}
void EXTI1_IRQHandler(void){
if (EXTI -> PR & (0x01U<<1)){
if (((!(GPIOA -> IDR & (0x2U))) && (GPIOA -> IDR & (0x1U))) || ((GPIOA -> IDR & (0x2U)) && (!(GPIOA -> IDR & (0x1U))))) {
STATE ++;
printf("Encoder counts = %d \n\r",STATE);
//GPIOA -> ODR ^= (0x01U << 5);
}
if (((GPIOA -> IDR & (0x2U)) && (GPIOA -> IDR & (0x1U))) || ((!(GPIOA -> IDR & (0x2U))) && (!(GPIOA -> IDR & (0x1U))))){
STATE --;
printf("Encoder counts = %d \n\r",STATE);
}
}
EXTI -> PR = (0xFFFFFU);
// NVIC -> ICER[0] |= (0x1U << 7);
// NVIC -> ISER[0] |= (0x1U << 6);
}
