1,思想:通过旋钮编码器信号识别旋钮正转or反转从而进行需要的操作
2,资料:编码器数据手册
(1)从数据手册得知 A通道先来下降沿并且完成一个周期则为正转。
(2)B通道先来下降沿并完成一个周期则为反转。
(3)细化正反识别 (去掉抖动与毛刺)
① A来下降沿中断后读取电平 A 低 B 高 + 延时3ms后B来中断后读取电平A低 B低为正转
②B来下降沿中断后读取电平 B 低 A 高 + 延时3ms后A来中断后读取电平A低 B低为反转
3,具体实现
void dk05e01t_clearA(void)
{
uint8_t b = 0 , b1 = 0;
if( dk05e01_count.knob_a_count>>DK05E01T_VALUE)//滤波
{
b = app_io_read_pin(ROTARY_A_PIN_TYPE , ROTARY_A_PIN );
b1 = app_io_read_pin(ROTARY_B_PIN_TYPE , ROTARY_B_PIN );
// b = app_io_read_pin(ROTARY_B_PIN_TYPE , ROTARY_B_PIN );
if( b1 == 1 &&b == 0)
{
dk05e01_count.knob_one = B_WAY;
DK05E01T_LOG_printf(" dk05e01_count.knob_one = B_WAY; \r\n" );
}
else if(dk05e01_count.knob_one == A_WAY && b == 0 && b1 == 0)
{
dk05e01_count.knob_one = A_WAY;
DK05E01T_LOG_printf(" A_WAY \r\n" );
send_cmd_count = 0;
send_cmd_buf[ ++send_cmd_count ] = dk05e01_count.knob_one ;
dk05e01_count.knob_one =WAY_NULL;
dk05e01_count.knob_tow =WAY_NULL;
dk05e01_count.knob_thr =WAY_NULL;
}
else
{
dk05e01_count.knob_one =WAY_NULL;
dk05e01_count.knob_tow =WAY_NULL;
dk05e01_count.knob_thr =WAY_NULL;
}
dk05e01_count.knob_a_count =0;
}
app_gpiote_init(&rotary_gpios[0], 2);
}
void dk05e01t_clearB(void)
{
uint8_t b = 0 , b1 = 0;
if( dk05e01_count.knob_b_count>>DK05E01T_VALUE)//滤波
{
b = app_io_read_pin(ROTARY_A_PIN_TYPE , ROTARY_A_PIN );
b1 = app_io_read_pin(ROTARY_B_PIN_TYPE , ROTARY_B_PIN );
if(b == 1 && b1 == 0)
{
dk05e01_count.knob_one = A_WAY;
DK05E01T_LOG_printf(" dk05e01_count.knob_one = A_WAY; \r\n" );
}
else if( dk05e01_count.knob_one == B_WAY && b == 0 && b1 == 0)
{
dk05e01_count.knob_one = B_WAY;
DK05E01T_LOG_printf(" B_WAY \r\n" );
send_cmd_count = 0;
send_cmd_buf[ ++send_cmd_count ] = dk05e01_count.knob_one ;
dk05e01_count.knob_one =WAY_NULL;
dk05e01_count.knob_tow =WAY_NULL;
dk05e01_count.knob_thr =WAY_NULL;
}
else
{
dk05e01_count.knob_one =WAY_NULL;
dk05e01_count.knob_tow =WAY_NULL;
dk05e01_count.knob_thr =WAY_NULL;
}
dk05e01_count.knob_b_count =0;
}
app_gpiote_init(&rotary_gpios[0], 2);
}
详情查看我上传的源码资源