|||
上图为ALPS的旋钮编码器动作的时序图,这里以SRGPWJ0200为例。
每旋转一个单位,①②端口都产生一个上升沿或者下降沿,往右旋转时,①端口相位先于②端口,往左旋转时,②端口相位先于①端口。图中11.25°标识的范围是旋转一个单位产生的边沿跳变。
单片机分别检测①②端口的上升沿和下降沿中断,在各自的中断中判断两个端口的电平就可以区分出左转右转了。
下面是基于nrf52832编写的驱动代码,中断实现部分。
void GPIOTE_IRQHandler(void)
{
if(NRF_GPIOTE->EVENTS_IN[0]==1)
{
NRF_GPIOTE->EVENTS_IN[0] = 0;
if( (nrf_gpio_pin_read(26)==0 && nrf_gpio_pin_read(27)==0)||
(nrf_gpio_pin_read(26)==1 && nrf_gpio_pin_read(27)==1) )
{
spin_left++;
}
}
if(NRF_GPIOTE->EVENTS_IN[1]==1)
{
NRF_GPIOTE->EVENTS_IN[1] = 0;
if( (nrf_gpio_pin_read(26)==0 && nrf_gpio_pin_read(27)==0)||
(nrf_gpio_pin_read(26)==1 && nrf_gpio_pin_read(27)==1) )
{
spin_right++;
}
}
}