2022-2-7 13:28:19 [显示全部楼层]
2621浏览
查看: 2621|回复: 0

[求助] 关于使用欧姆龙的绝对值旋转编码器 E6CP-AG5C 输出不稳定

[复制链接]
本人有一点点编程经验, 电子零件基本是个新手, 想学习使用欧姆龙的绝对值旋转编码器 E6CP-AG5C, 编码器的资料如下:
https://www.fa.omron.com.cn/products/family/494/specification.html
我手上的是1024解释度的版本, 所以它除了两条接电源线之外(外接了八颗1.2V AA电池的电源盒), 其余十条线则输出由个位至十位二进数的格雷码(Grey code), Arduino接脚与旋转编码器接线用接线器直接接上中间并没加上其他电子零件, 由Pin2顺序接到Pin11, 程式码如下:


  1. #define PIN_0 (2) //2^0
  2. #define PIN_1 (3) //2^1
  3. #define PIN_2 (4) //2^2
  4. #define PIN_3 (5) //2^3
  5. #define PIN_4 (6) //2^4
  6. #define PIN_5 (7) //2^5
  7. #define PIN_6 (8) //2^6
  8. #define PIN_7 (9) //2^7
  9. #define PIN_8 (10) //2^8
  10. #define PIN_9 (11) //2^9
  11. #define TO_INVERT_SIG (1) //In my case, I need to invert the signal to get the correct result.
  12. const int offset = 0; //angle offset
  13. const int numPins = 10;
  14. int8_t pinArray[numPins] = {
  15.   PIN_0,
  16.   PIN_1,
  17.   PIN_2,
  18.   PIN_3,
  19.   PIN_4,
  20.   PIN_5,
  21.   PIN_6,
  22.   PIN_7,
  23.   PIN_8,
  24.   PIN_9
  25. };
  26. void setup() {
  27.   // put your setup code here, to run once:
  28.   Serial.begin(9600);
  29.   for(int i = 0;i < numPins;i++) {
  30.     pinMode(pinArray[i], INPUT_PULLUP);
  31.   }
  32. }
  33. void loop() {
  34.   // put your main code here, to run repeatedly:
  35.   Serial.println(ConvertGrayCode(), DEC);
  36.   delay(50);
  37. }
  38. int ConvertGrayCode() {
  39.   int finalResult = 0;
  40.   int val = 0;
  41.   int curXORVal = 0;
  42.   int i = numPins - 1; //start from MSB
  43.   //assign first value
  44.   #if TO_INVERT_SIG == 1
  45.   val = 1 - digitalRead(pinArray[i]);
  46.   #else
  47.   val = digitalRead(pinArray[i]);
  48.   #endif
  49.   
  50.   finalResult = ((val & 1) << i);
  51.   for(i = numPins - 2;i >= 0;i--) {
  52.     #if TO_INVERT_SIG == 1
  53.     val = 1 - digitalRead(pinArray[i]);
  54.     #else
  55.     val = digitalRead(pinArray[i]);
  56.     #endif
  57.     curXORVal = ((finalResult >> (i + 1)) & 1) ^ (val & 1);
  58.     finalResult |= ((curXORVal & 1) << i);
  59.   }
  60.   
  61.   return finalResult - offset;
  62. }
复制代码


大致使用没问题, 但旋转途中会突然出现 0 的结果:


关于使用欧姆龙的绝对值旋转编码器 E6CP-AG5C 输出不稳定图1

关于使用欧姆龙的绝对值旋转编码器 E6CP-AG5C 输出不稳定图2

求问各位高手这输出正常吗, 还是我连接的方式有问题?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail