Arduino旋转编码器-Arduino中文社区 - Powered by Discuz! Archiver

XlinliY.Zhang 发表于 2020-1-28 17:45

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不同触发时间来判断
我自己使用很顺滑,只是超低速时第一次操作会往数值会反向增长 问题不大
后续若有什么不足请反馈给我

47okey 发表于 2020-1-29 23:32

用的是KY-040旋转编码器模块,20脉冲/圈

用您的代码转一圈,速度中等,尽量均匀。



这是参考:解决旋转编码抖动的方案 - Arduino - 极客工坊 - Powered by Discuz!https://www.geek-workshop.com/thread-28165-1-1.html,写的代码。
同样1 圈,速度也是不定的,有的快速,有的慢慢的一格。

47okey 发表于 2020-1-28 18:03

本帖最后由 47okey 于 2020-1-28 18:05 编辑

谢谢分享,这么简单?有空试试

jeeffffff 发表于 2020-1-28 19:50

正好最近在研究平衡车,用到了编码器测速,学习一下感谢分享

47okey 发表于 2020-1-29 16:10

不好用,数字 还是乱跑。特别是超慢速,就是转一格时,乱。

XlinliY.Zhang 发表于 2020-1-29 17:35

本帖最后由 XlinliY.Zhang 于 2020-1-29 17:46 编辑

47okey 发表于 2020-1-29 16:10
不好用,数字 还是乱跑。特别是超慢速,就是转一格时,乱。
旋转编码器最少要转一格出才能有响应,你刻意卡一格压根没有程序能正常工作

XlinliY.Zhang 发表于 2020-1-29 17:36

jeeffffff 发表于 2020-1-28 19:50
正好最近在研究平衡车,用到了编码器测速,学习一下感谢分享

测试是用单中断测的,不是用这种的

47okey 发表于 2020-1-29 22:41

XlinliY.Zhang 发表于 2020-1-29 17:35
旋转编码器最少要转一格出才能有响应,你刻意卡一格压根没有程序能正常工作 ...

刻意卡一格是什么样的,没明白。我是是转一格,转几格有时也乱的。

47okey 发表于 2020-1-29 22:42

比如做菜单,上或下一条,也只能转一格吧

XlinliY.Zhang 发表于 2020-1-29 22:50

47okey 发表于 2020-1-29 22:42
比如做菜单,上或下一条,也只能转一格吧

转一格多点旋转编码器才会有响应,而不是你一次只能转2个数
页: [1] 2
查看完整版本: Arduino旋转编码器