旋转编码器不使用中断实现加减

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