Arduino旋转编码器
一个简单顺滑的Arduino旋转编码器代码如下
//中断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(); //记录触发时间
}注释很全 基本上依靠AB不同触发时间来判断
我自己使用很顺滑,只是超低速时第一次操作会往数值会反向增长 问题不大
后续若有什么不足请反馈给我
用的是KY-040旋转编码器模块,20脉冲/圈
用您的代码转一圈,速度中等,尽量均匀。
这是参考:解决旋转编码抖动的方案 - Arduino - 极客工坊 - Powered by Discuz!https://www.geek-workshop.com/thread-28165-1-1.html,写的代码。
同样1 圈,速度也是不定的,有的快速,有的慢慢的一格。
本帖最后由 47okey 于 2020-1-28 18:05 编辑
谢谢分享,这么简单?有空试试 正好最近在研究平衡车,用到了编码器测速,学习一下感谢分享 不好用,数字 还是乱跑。特别是超慢速,就是转一格时,乱。 本帖最后由 XlinliY.Zhang 于 2020-1-29 17:46 编辑
47okey 发表于 2020-1-29 16:10
不好用,数字 还是乱跑。特别是超慢速,就是转一格时,乱。
旋转编码器最少要转一格出才能有响应,你刻意卡一格压根没有程序能正常工作 jeeffffff 发表于 2020-1-28 19:50
正好最近在研究平衡车,用到了编码器测速,学习一下感谢分享
测试是用单中断测的,不是用这种的 XlinliY.Zhang 发表于 2020-1-29 17:35
旋转编码器最少要转一格出才能有响应,你刻意卡一格压根没有程序能正常工作 ...
刻意卡一格是什么样的,没明白。我是是转一格,转几格有时也乱的。 比如做菜单,上或下一条,也只能转一格吧 47okey 发表于 2020-1-29 22:42
比如做菜单,上或下一条,也只能转一格吧
转一格多点旋转编码器才会有响应,而不是你一次只能转2个数
页:
[1]
2