xlla 发表于 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板子共地了。

大致代码如下


const int encoderPinA = 3;
const int encoderPinB = 6;

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

unsigned long time = 0;
long encoderPos=0;



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

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


// Initialize
void setup()
{
    pinMode(pinI1,OUTPUT);//定义该接口为输出接口
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);

    pinMode(pinI3,OUTPUT);//定义该接口为输出接口
pinMode(pinI4,OUTPUT);
pinMode(speedpin2,OUTPUT);

analogWrite(speedpin,100);//输入模拟值进行设定速度

digitalWrite(pinI2,LOW);//使直流电机顺时针转
digitalWrite(pinI1,HIGH);


analogWrite(speedpin2,130);//输入模拟值进行设定速度

digitalWrite(pinI3,LOW);//使直流电机顺时针转
digitalWrite(pinI4,HIGH);


pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
digitalWrite(encoderPinA, HIGH);
digitalWrite(encoderPinB, HIGH);

Serial.begin (9600);
time = millis(); //时间初值

}

void loop()
{
if ((millis() - time) > 500)
{
      Serial.println (encoderPos);
      time = millis();
}

boolean encoderA = digitalRead(encoderPinA);
if ((encoderALast == HIGH) && (encoderA == LOW))
{
    if (digitalRead(encoderPinB) == LOW)
    {
      encoderPos--;
    }
    else
    {
      encoderPos++;
    }
   
}
encoderALast = encoderA;
}

shenhaiyu 发表于 2012-10-9 16:39:18

用中断来记录是不是会更好些

Tim 发表于 2012-10-9 17:43:28

中断都不行吗?我觉得应该还好,

xlla 发表于 2012-10-10 15:39:02

也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。

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

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

xlla 发表于 2012-10-17 23:48:09

xlla 发表于 2012-10-10 15:39 static/image/common/back.gif
也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。

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

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

中断方式的确数据波动很大。

xlla 发表于 2012-10-18 18:35:12

xlla 发表于 2012-10-10 15:39 static/image/common/back.gif
也用过中断,调整了位置,大约半秒钟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
...

laoyang 发表于 2012-10-20 21:11:40

哪里买的带编码器的电机阿,我也有速度控制问题,不知道怎么控制速度使2个电机转速一致。pid?

xlla 发表于 2012-10-26 15:01:28

通常是自己装编码器,裸露的或者全密封的。
即使同转速也不一定能走直线,有安装的问题,轴线误差,负重平衡,两轮摩擦力等等。
如果要走直线,估计就不是对速度pid 了,而是对偏转角 pid.

星空星辰 发表于 2015-8-19 10:53:03

请问光电编码器A相B相Z相输出怎么编程来接收这个信号啊

pig881 发表于 2016-5-14 11:40:07

xlla 发表于 2012-10-26 15:01 static/image/common/back.gif
通常是自己装编码器,裸露的或者全密封的。
即使同转速也不一定能走直线,有安装的问题,轴线误差,负重平 ...

你的是 A89 光电编码器吗? 4根线, 码盘是100线的, 可以给出具体连接图吗?
页: [1]
查看完整版本: 请教光电编码器测速问题