在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch。常见的有5pin和3pin产品。5pin实在左右旋转的基础上增加了向下按得功能。以EC11为例,常用语仪器仪表面板,音响面板等。其pin脚用途如下:
- 1,3pin输出编码信号,一般需要外接上拉电阻。
- 2pin公共端,接地
- 4,5pin是下按键的接线端考虑到通用性,所以下面的代码只实现旋转编码部分,按键部分忽略。下图是1,3pin旋转时输出波形图,可以看到A,B信号相位相差90°。程序中可以通过边沿出现顺序判断编码器旋转方向
考虑到资源占用以及编码器性能,采用单pin中段模式。代码中设计以pinA为中断源,上边沿下边沿均产生中断。如上图,从左到右,蓝线处开始读取A,B的值,结合中断。状态表如下
A B
0 1 CCW,下降沿
1 1 CW,上升沿
1 0 CCW,上升沿
0 0 CW,下降沿
也就是说CW时,A,B状态一致;CCW时,A,B状态相反
根据上面状态变,对应的程序代码如下:
void exProcess(void){uint8_t A = EN.a_pin->read()<<1 | EN.b_pin->read();
switch (A)
{
case 0:
EN.KEY_NUM = KEY_A; // 正向下降沿
break;
case 1:
EN.KEY_NUM = KEY_B; // 反向下降沿
break;
case 2:
EN.KEY_NUM = KEY_B; // 反向上升沿
break;
case 3:
EN.KEY_NUM = KEY_A; // 正向上升沿
break;
}
}