旋转编码器不使用中断实现加减
旋转编码器外观上看起来很像电位器,在一些数码设备上经常遇到,比如汽车音响的旋钮。它的功能相当于三个按键,加、减、按压,按压和普通微动开关没区别,加和减相当于两个微动开关,优于微动开关的是,你可以迅速旋转很多角度,相当于连续按压很多次微动开关,效率很高。比如要调节一个参数,范围值是100,如果是用微动开关,需要按100次,当然也可以设置成长按开关快速变化,但是也比较麻烦。用旋钮就可以快速调整参数变化了。
常用的旋转编码器ec11如下:
这种编码器一共有五个针脚,两个是按压的微动开关使用,和其他功能毫无关系。剩余三个,一个是公共端,两个是用于反应旋转的端子。这种开关如果用于arduino等单片机需要做软件消抖,因为和其他微动开关一样,按下的时候,电压会出现抖动,影响程序的判断。
卖家提供的例程,往往是使用中断来实现的,当一个板子上出现多个旋钮的时候,就占用了过多的宝贵中断端口,而且,中断会使程序里的millis()也暂停,所以,我不是很喜欢用中断的方式。
这时,我们可以选择下图这种:
可以看到,它在ec11的基础上加了几个电容电阻,实现了硬件消抖,那么就不用在软件中使用消抖了,使用起来非常方便。
这种模块有五个针脚,定义和ec11已经不一样了。原本用于按压的两个针脚已经废止不用,当然,你要是还需要的话,可以另外焊接两根跳线出来使用。
五个针脚的定义如下,两个是vcc和接地,剩余三个是表达旋转的两个端子和A、B、接地C,接地是重复的,所以连接一个使用就行。
把旋转编码器模块接入逻辑测试仪,旋转之后,电平变化如下:
通过上图可以看出,当你不旋转的时候,ab两端都是高电平,当旋转的时候,ab轮流出现高低变化,此时判断a或b谁先变成低电平,就知道旋钮的旋转方向了。
arduino代码如下:如果顺时针不是想表达的加,只要交换ab两个端口的跳线即可。
byte a = 0;
byte b = 0;
byte a0 = 0;
byte b0 = 0;
byte k=0;
void setup() {// put your setup code here, to run once:pinMode(11, INPUT);pinMode(12, INPUT);Serial.begin(9600);
}void loop() {// put your main code here, to run repeatedly:a0 = digitalRead(11);b0 = digitalRead(12);delay(3);a = digitalRead(11);b = digitalRead(12);//Serial.println(b);if (a !=b ) {if(a==1 && a0==0){k++; }if(b==1 && b0==0){k--;}//k++;Serial.println(k);}}
这种方式代码比较简单,也不占用中断。缺点是,每次程序loop一次才能检测一次旋转,连续快速旋转的时候,可能会漏掉几格。因为程序loop一次也是非常快的,所以这种小差错完全是可以接受的。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
