|
一个简单顺滑的Arduino旋转编码器
代码如下
[mw_shl_code=arduino,true]//中断1连接DT
//中断2连接SCK
//VCC - 5V
//GND - GND
bool Modes = true; //布尔储存触发状态
long count = 0;
unsigned long timers = 0; //无符号长整形储存触发时间并用于消抖
void setup()
{
Serial.begin(115200); //串口初始化
attachInterrupt(1, A_inter, RISING); //开启中断 中断IO1 触发方式:上升沿 回调函数:A_inter
attachInterrupt(0, B_inter, RISING); //开启中断 中断IO0 触发方式:上升沿 回调函数:B_inter
}
void loop()
{
}
void A_inter() //中断函数A
{
if (!Modes && millis() - timers >= 20) //消抖并判断哪个先触发 A|B
{
count++; //数值自增
Serial.println(count); //串口打印
}
Modes = true; //更改触发标志
timers = millis(); //记录触发时间
}
void B_inter() //中断函数B
{
if (Modes && millis() - timers >= 20) //消抖并判断哪个先触发 A|B
{
count--; //数值自减
Serial.println(count); //串口打印
}
Modes = false; //更改触发标志
timers = millis(); //记录触发时间
}[/mw_shl_code]注释很全 基本上依靠AB不同触发时间来判断
我自己使用很顺滑,只是超低速时第一次操作会往数值会反向增长 问题不大
后续若有什么不足请反馈给我
|
|