Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器模块系列实验(40)---旋转编码器模块

[复制链接]
发表于 2021-3-16 15:42 | 显示全部楼层
eagler8 发表于 2021-3-15 18:01
有空做做实验,也许会有许多收获

30位旋转编码器EC11输出30脉冲
https://www.arduino.cn/forum.php ... 4&fromuid=79027
(出处: Arduino中文社区)

我刚找到了办法,有空可以看看,多指教。
 楼主| 发表于 2021-3-16 20:26 | 显示全部楼层
shory 发表于 2021-3-16 15:42
30位旋转编码器EC11输出30脉冲
https://www.arduino.cn/forum.php?mod=viewthread&tid=103284&fromuid=79 ...

我没有做过这个实验,要向你学习
发表于 2021-5-12 09:21 | 显示全部楼层
eagler8 发表于 2021-3-16 11:30
一般锂电池是3,7V,而舵机是5V的,需要加一块3.7---5V的升压模块(TB上1元多些)

非常感谢,问题已经解决。
 楼主| 发表于 2021-5-12 14:57 | 显示全部楼层
mlwx 发表于 2021-5-12 09:21
非常感谢,问题已经解决。

解决了就好
发表于 2021-8-31 23:23 | 显示全部楼层
eagler8 发表于 2019-6-28 11:01
[mw_shl_code=arduino,true]/*
【Arduino】66种传感器模块系列实验(40)
实验四十:360度旋转增量编码器模 ...

这个程序当中是否只用到了中断0,而中断1没用?
 楼主| 发表于 2021-9-2 07:50 | 显示全部楼层
12jichuangyi 发表于 2021-8-31 23:23
这个程序当中是否只用到了中断0,而中断1没用?
  1. /*
  2. 【Arduino】66种传感器模块系列实验(40)
  3. 实验四十:360度旋转增量编码器模块(KY-040)
  4. */

  5. int CLK = 2;
  6. int DT = 3;
  7. int SW = 4;
  8. const int interrupt0 = 0;
  9. int count = 0;
  10. int lastCLK = 0;

  11. void setup()
  12. {
  13.   pinMode(SW, INPUT);
  14.   digitalWrite(SW, HIGH);
  15.   pinMode(CLK, INPUT);
  16.   pinMode(DT, INPUT);
  17.   attachInterrupt(interrupt0, ClockChanged, CHANGE);
  18.   Serial.begin(9600);
  19. }

  20. void loop()
  21. {
  22.   if (!digitalRead(SW) && count != 0)
  23.   {
  24.     count = 0;
  25.     Serial.print("count:");
  26.     Serial.println(count);
  27.   }
  28. }

  29. void ClockChanged()
  30. {
  31.   int clkValue = digitalRead(CLK);
  32.   int dtValue = digitalRead(DT);
  33.   if (lastCLK != clkValue)
  34.   {
  35.     lastCLK = clkValue;
  36.     count += (clkValue != dtValue ? 1 : -1);
  37.     Serial.print("count:");
  38.     Serial.println(count);
  39.   }
  40. }
复制代码




通过语句
  1. const int interrupt0 = 0;
复制代码
还有
  1. attachInterrupt(interrupt0, ClockChanged, CHANGE);
复制代码
常数int的中断,这里是使用了中断0
 楼主| 发表于 2021-9-2 09:33 | 显示全部楼层
12jichuangyi 发表于 2021-8-31 23:23
这个程序当中是否只用到了中断0,而中断1没用?

中断函数介绍
  1. attachInterrupt()
复制代码

描述:外部中断配置函数。
函数原型:attachInterrupt(interrupt, ISR, mode)

参数:
interrupt: 中断号。不同Arduino开发板中断号不同。
Uno R3有两个外部中断,分别为数字管脚2(中断0)和数字管脚3(中断1)。

ISR: 中断处理函数。此函数不带参数,没有返回值。

mode: 中断触发方式四种
LOW: 低电平触发。
CHANGE:管脚状态改变触发。
RISING:上升沿触发。
FALLING:下降沿触发。

返回值:无。



发表于 2022-2-7 13:51 | 显示全部楼层
在int getEncoderTurn(void){}一句中声明的是一个整数型变量还是一个函数?在移动位置后效果没有区别,见下:
  1. const int clkPin = 2;
  2. const int dtPin = 3;
  3. const int swPin = 4 ;
  4. int encoderVal = 0;
  5. <span style="background-color: yellow;">int getEncoderTurn(void)
  6. {
  7.   static int oldA = HIGH;
  8.   static int oldB = HIGH;
  9.   int result = 0;
  10.   int newA = digitalRead(clkPin);
  11.   int newB = digitalRead(dtPin);
  12.   if (newA != oldA || newB != oldB)
  13.   {
  14.     if (oldA == HIGH && newA == LOW)
  15.     {
  16.       result = (oldB * 2 - 1);
  17.     }
  18.   }</span>
  19.   oldA = newA;
  20.   oldB = newB;
  21.   return result;
  22.   delay(500);
  23. }
  24. void setup()
  25. {
  26.   pinMode(clkPin, INPUT);
  27.   pinMode(dtPin, INPUT);
  28.   pinMode(swPin, INPUT);
  29.   digitalWrite(swPin, HIGH);
  30.   Serial.begin(9600);
  31. }

  32. void loop()
  33. {
  34.   int change = getEncoderTurn();
  35.   encoderVal = encoderVal + change;
  36.   if (digitalRead(swPin) == LOW)
  37.   {
  38.     encoderVal = 0;
  39.   }
  40.   Serial.print("count: ");
  41.   Serial.println(encoderVal);
  42. }
复制代码
  1. const int clkPin = 2;
  2. const int dtPin = 3;
  3. const int swPin = 4 ;
  4. int encoderVal = 0;

  5. void setup()
  6. {
  7.   pinMode(clkPin, INPUT);
  8.   pinMode(dtPin, INPUT);
  9.   pinMode(swPin, INPUT);
  10.   digitalWrite(swPin, HIGH);
  11.   Serial.begin(9600);
  12. }

  13. void loop()
  14. {
  15.   int change = getEncoderTurn();
  16.   encoderVal = encoderVal + change;
  17.   if (digitalRead(swPin) == LOW)
  18.   {
  19.     encoderVal = 0;
  20.   }
  21.   Serial.print("count: ");
  22.   Serial.println(encoderVal);
  23. }
  24. <span style="background-color: yellow;">int getEncoderTurn(void)
  25. {
  26.   static int oldA = HIGH;
  27.   static int oldB = HIGH;
  28.   int result = 0;
  29.   int newA = digitalRead(clkPin);
  30.   int newB = digitalRead(dtPin);
  31.   if (newA != oldA || newB != oldB)
  32.   {
  33.     if (oldA == HIGH && newA == LOW)
  34.     {
  35.       result = (oldB * 2 - 1);
  36.     }
  37.   }
  38.   oldA = newA;
  39.   oldB = newB;
  40.   return result;
  41.   delay(500);
  42. }</span>
复制代码




 楼主| 发表于 2022-2-8 06:25 | 显示全部楼层
ofteny 发表于 2022-2-7 13:51
在int getEncoderTurn(void){}一句中声明的是一个整数型变量还是一个函数?在移动位置后效果没有区别,见下 ...

早上好,不知道您的应用场景是什么?在能解决问题的前提下,选择简单的程序就好
发表于 2022-2-8 17:28 | 显示全部楼层
这些对有基础的是没问题的,对小白还是不好明白.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-11-28 00:28 , Processed in 0.070084 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表