极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32726|回复: 9

请教光电编码器测速问题

[复制链接]
发表于 2012-10-6 21:16:08 | 显示全部楼层 |阅读模式
本帖最后由 xlla 于 2012-10-6 21:24 编辑

小弟初接触这块,买了一堆零件准备做个小车,编码器这儿碰到了问题。
电机是带减速的那种,空载大约 220rpm,码盘直接装在输出轴上,通过程序驱动以 40% 的速度运行  (100/255)。
编码器是4线输出,除去 +-,2相输出,规格说明是90度相差波形。

无论是中断方式还是 loop 轮询,始终只能测到  24 个左右的变化,单相,可目测转速至少 2转每秒。
码盘一周有 100个 栅格,理论上每相每秒应该捕获到 200 格变化至少,以我当前的转速。

看国外 encoder 库都是针对全密封的那种 rotatory encoder ,连接 pin 时似乎还要接 上拉电阻,我这种开放式的不知道该如何接,大概原理不同。

真心求教。  

补充一下,
电机驱动是独立供电, l298n 的板子,没有光耦,控制部分班内取电,但是与arduino板子共地了。

大致代码如下


  1. const int encoderPinA = 3;
  2. const int encoderPinB = 6;

  3. boolean encoderALast = LOW;  // remembers the previous pin state

  4. unsigned long time = 0;
  5. long encoderPos=0;



  6. // holds temp vals
  7. int val;
  8. int pinI1=42;//定义I1接口
  9. int pinI2=44;//定义I2接口
  10. int speedpin=46;//定义EA(PWM调速)接口

  11. int pinI3=31;//定义I1接口
  12. int pinI4=33;//定义I2接口
  13. int speedpin2=35;//定义EA(PWM调速)接口


  14. // Initialize
  15. void setup()
  16. {
  17.     pinMode(pinI1,OUTPUT);//定义该接口为输出接口
  18.   pinMode(pinI2,OUTPUT);
  19.   pinMode(speedpin,OUTPUT);
  20.   
  21.     pinMode(pinI3,OUTPUT);//定义该接口为输出接口
  22.   pinMode(pinI4,OUTPUT);
  23.   pinMode(speedpin2,OUTPUT);
  24.   
  25.   analogWrite(speedpin,100);//输入模拟值进行设定速度
  26.   
  27.   digitalWrite(pinI2,LOW);//使直流电机顺时针转
  28.   digitalWrite(pinI1,HIGH);
  29.   
  30.   
  31.   analogWrite(speedpin2,130);//输入模拟值进行设定速度
  32.   
  33.   digitalWrite(pinI3,LOW);//使直流电机顺时针转
  34.   digitalWrite(pinI4,HIGH);
  35.   

  36.   pinMode(encoderPinA, INPUT);
  37.   pinMode(encoderPinB, INPUT);
  38.   digitalWrite(encoderPinA, HIGH);
  39.   digitalWrite(encoderPinB, HIGH);
  40.   
  41.   Serial.begin (9600);
  42.   time = millis(); //时间初值
  43.   
  44. }

  45. void loop()
  46. {
  47.   if ((millis() - time) > 500)
  48.   {
  49.         Serial.println (encoderPos);
  50.       time = millis();
  51.   }
  52.   
  53.   boolean encoderA = digitalRead(encoderPinA);
  54.   if ((encoderALast == HIGH) && (encoderA == LOW))
  55.   {
  56.     if (digitalRead(encoderPinB) == LOW)
  57.     {
  58.       encoderPos--;
  59.     }
  60.     else
  61.     {
  62.       encoderPos++;
  63.     }
  64.    
  65.   }
  66.   encoderALast = encoderA;
  67. }
复制代码
回复

使用道具 举报

发表于 2012-10-9 16:39:18 | 显示全部楼层
用中断来记录是不是会更好些
回复 支持 反对

使用道具 举报

发表于 2012-10-9 17:43:28 | 显示全部楼层
中断都不行吗?我觉得应该还好,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-10 15:39:02 | 显示全部楼层
也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。

参照mega2560板的规格接的,pin2 pin3,程序挂接0,1号中断。

看那个encoder库说明更晕,说什么两相要接在一类中断口上,诸如a,b,c,d,类。mega没有中断c,d,但多了中断j,k
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-17 23:48:09 | 显示全部楼层
xlla 发表于 2012-10-10 15:39
也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。

参照mega2560板的规格接的, ...

低电平触发?您是指 “Failing" 类型么?我是用 “Change” 类型。
似乎和元件批次有关,又买了两个,只有一个能稳定的双相输出信号。其余只能单相稳定输出,相同安装,配置,读取方法。

中断方式的确数据波动很大。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-18 18:35:12 | 显示全部楼层
xlla 发表于 2012-10-10 15:39
也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。

参照mega2560板的规格接的, ...

关于 arduino mega 的中断口描述,希望牛人给解释下。
...
// In the Mega, there is no Port C, no Port D.  Instead, you get Port J and Port K.  Port B remains.
// Port J, however, is practically useless because there is only 1 pin available for interrupts.  Most
// of the Port J pins are not even connected to a header connection.  // </end> "Mega Support" notes
...
回复 支持 反对

使用道具 举报

发表于 2012-10-20 21:11:40 | 显示全部楼层
哪里买的带编码器的电机阿,我也有速度控制问题,不知道怎么控制速度使2个电机转速一致。pid?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-26 15:01:28 | 显示全部楼层
通常是自己装编码器,裸露的或者全密封的。
即使同转速也不一定能走直线,有安装的问题,轴线误差,负重平衡,两轮摩擦力等等。
如果要走直线,估计就不是对速度pid 了,而是对偏转角 pid.
回复 支持 反对

使用道具 举报

发表于 2015-8-19 10:53:03 | 显示全部楼层
请问光电编码器A相B相Z相输出怎么编程来接收这个信号啊
回复 支持 反对

使用道具 举报

发表于 2016-5-14 11:40:07 | 显示全部楼层
xlla 发表于 2012-10-26 15:01
通常是自己装编码器,裸露的或者全密封的。
即使同转速也不一定能走直线,有安装的问题,轴线误差,负重平 ...

你的是 A89 光电编码器  吗? 4根线, 码盘是100线的, 可以给出具体连接图吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 16:12 , Processed in 0.047026 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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