南柯梦秋 发表于 2016-3-3 12:59:21

arduino mega2560+欧姆龙旋转编码器测速试验问题,新人求解答,谢谢!

新人一枚~刚入手一个欧姆龙旋转编码器E6A2-CW3C,用于电机测速,板子用的是Arduino Mega2560。
一开始进行测试编码器的过程中就出现问题了,测试程序是从官网encoder介绍上拿来用的:
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup() {   
   pinMode (encoder0PinA,INPUT);   
   pinMode (encoder0PinB,INPUT);   
   Serial.begin (9600);
}
void loop() {   
   n = digitalRead(encoder0PinA);   
   if ((encoder0PinALast == LOW) && (n == HIGH)) {   
      if (digitalRead(encoder0PinB) == LOW) {      
            encoder0Pos--;   
            }
      else {      
             encoder0Pos++;   
            }   
      Serial.print (encoder0Pos);   
      Serial.print ("/");   
      }   
   encoder0PinALast = n;
}
问题如下:
1.会自动读数:   
   也就是说正常情况下,应当是电机转动时,有数据产生;
   但是实际情况是,当电机停止转动时,依旧有读数产生,不会停止。   
   同时我发现编码器非常灵敏,往往稍有振动就开始有数据产生,且不停止。   
   这是什么情况,是因为抖动的原因么?应该如何解决。


2. 读数过程中会有反跳现象:   
   电机正向旋转时,读数应该不断上升,但实际读数会是,如1/2/3/4/5/6/7/6/5/6/7/8/9/10/11/12/13/12/13/14....这种情况   
   请问该如何解决其中的5/6/7/6/5这一现象。

3.digitialRead()的问题   
    在最初试验的时候,我是只用了A相读数,并且仅测试了端口电位的高低变化   
    const int codeA= 3;   
    .....   
   boolean n = digitialRead( codeA );   
   Serial.print(n);
   在未旋转电机时就有输出,且输出结果很奇怪,是有规律的01变化:00000000000111111000000000001111111..... 类似与方波。
   我查询了下digitialRead()的说明,在引脚无信号时,digitaiRead()会随机赋值。
   也看了下,选用的编码器属于增量式编码器,脉冲应当与位移有关,那么当单机不旋转时,应该没有脉冲,也就是输出应当为00000.....
   所以我想请教的问题是,这个输出现象是由于digitialRead()的这个特性产生的,还编码器出了问题?


希望各位大牛能给予一些提示或解答,谢谢!

Super169 发表于 2016-3-3 14:56:06

我最近也買了幾個 旋轉編碼器, 我是用 interrupt 去做, 一開始也有同樣情況, interrupt 在沒轉之下也會觸發.
後來自己加上幾個上拉電阻就好了.

旋轉編碼器原本應該是內置上拉電阻的, 但不知何故好像不太有效.在沒轉的情況下好像是懸空的效果.

你也可以嘗試對兩個輸入的訊號線加入上拉電阻, 看看是否可以解決問題.
電阻的大小也有影響, 我按 PCB 背後的記號加上 10 K 的電阻也不行, 最後改用 1K 的就好了.你最好也試試不同的電阻.

banye 发表于 2016-3-3 19:13:34

不带正交编码接口(QEI)的单片机,处理编码器信号时是比较费力的;单纯计数的话,编码器转速较快时,就可能会丢失脉冲,鉴相(判断编码器转向)时,也可能出现错误。有可能的话,可以使用HCTL2000或者HCTL2032作为正交编码接口电路;也可以找一个CPLD实现类似的正交编码器接口功能,减轻单片机的处理负担。

南柯梦秋 发表于 2016-3-3 21:31:19

Super169 发表于 2016-3-3 14:56 static/image/common/back.gif
我最近也買了幾個 旋轉編碼器, 我是用 interrupt 去做, 一開始也有同樣情況, interrupt 在沒轉之下也會觸發 ...

我加的就是10K的上拉电阻,效果不明显。现在放弃旋转编码器,打算改用光电式的U型槽编码器试试了。
谢谢帮助!

Super169 发表于 2016-3-3 21:38:50

南柯梦秋 发表于 2016-3-3 21:31 static/image/common/back.gif
我加的就是10K的上拉电阻,效果不明显。现在放弃旋转编码器,打算改用光电式的U型槽编码器试试了。
谢谢 ...

我用 10K 的也是沒分別, 試試改用 1K 的吧.

eddiewwm 发表于 2016-3-4 09:59:41

Super169 发表于 2016-3-3 21:38 static/image/common/back.gif
我用 10K 的也是沒分別, 試試改用 1K 的吧.

按規格書,E6A2-CW3C 是沒上接電阻的。對 Arduino 接口,用10k 上接電阻應可接受了,再小的電阻值,基本已沒有甚麼特別的好處了。

Super169 发表于 2016-3-4 11:08:42

本帖最后由 Super169 于 2016-3-4 11:14 编辑

eddiewwm 发表于 2016-3-4 09:59 static/image/common/back.gif
按規格書,E6A2-CW3C 是沒上接電阻的。對 Arduino 接口,用10k 上接電阻應可接受了,再小的電阻值,基本已 ...

硬件既野我真係唔多掂, 或耆我將我既諗法同亂試既野講下, 可唔可以幫忙指證.

初時我都係見唔轉佢既讀數亂跳, 我就估有可能係懸空左, 之前網上睇下, 類似既情形可以加上拉/下拉電阻.
我見佢本身應該係 HIGH 既, 初時就試 arduino 內置既, 用 input_pullup, 但都係唔 work.
咁睇番佢背面有幾粒 10K 既電阻, 我估佢可能壞左掛, 就自己接個 10K 上拉比佢, 都係唔 work.

我就開始亂黎, 因為我都唔知點解要 10K, 所以試下唔同既電阻.
換左 20K, 都係亂跳, 咁我就估電阻太大, 所以轉用 1K.

換左 1K 上拉, 佢真係定左好多, 基本上無再亂跳.但係我就唔知點解了, 我仲以為 1K 無咁大阻力,佢通過既電流更大, 訊號會更明確(唔燒的話), 但太低既話, 就會變成長期去哂呢邊.

以我既理解, 加入上拉電阻, 就會比多一條 path 佢, 當另一邊懸空, 就會有電到, 會接收到 HIGH.
而另一邊接地, 一旦通左, 如果呢邊阻力無咁大, 就會清哂, 結果會接收到 LOW.
但係, 個電阻要用幾多至正確, 真係唔識諗.可唔可以解釋下.


Sorry, 唔記得補充番, 我果隻只係淘X幾蚊雞既平野 KY-040, 可能同 E6A2-CW3C 唔同.
初時一直睇漏左, 只係見到 旋转编码器 就亂搭傘.兩者可能分別好大.

eddiewwm 发表于 2016-3-4 15:59:53

Super169 发表于 2016-3-4 11:08 static/image/common/back.gif
硬件既野我真係唔多掂, 或耆我將我既諗法同亂試既野講下, 可唔可以幫忙指證.

初時我都係見唔轉佢既讀 ...

兩者差別真的很大,價錢差了差不多百倍。

cauwangchao 发表于 2021-10-8 17:01:23

banye 发表于 2016-3-3 19:13
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,可以添加联系方式吗,有关于HCTL-2000的使用问题需要求助。
页: [1]
查看完整版本: arduino mega2560+欧姆龙旋转编码器测速试验问题,新人求解答,谢谢!