请教光电编码器测速问题
本帖最后由 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;
}
用中断来记录是不是会更好些 中断都不行吗?我觉得应该还好, 也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。
参照mega2560板的规格接的,pin2 pin3,程序挂接0,1号中断。
看那个encoder库说明更晕,说什么两相要接在一类中断口上,诸如a,b,c,d,类。mega没有中断c,d,但多了中断j,k xlla 发表于 2012-10-10 15:39 static/image/common/back.gif
也用过中断,调整了位置,大约半秒钟60个变化,两相不同数量,另一相20多。
参照mega2560板的规格接的, ...
低电平触发?您是指 “Failing" 类型么?我是用 “Change” 类型。
似乎和元件批次有关,又买了两个,只有一个能稳定的双相输出信号。其余只能单相稳定输出,相同安装,配置,读取方法。
中断方式的确数据波动很大。 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
... 哪里买的带编码器的电机阿,我也有速度控制问题,不知道怎么控制速度使2个电机转速一致。pid? 通常是自己装编码器,裸露的或者全密封的。
即使同转速也不一定能走直线,有安装的问题,轴线误差,负重平衡,两轮摩擦力等等。
如果要走直线,估计就不是对速度pid 了,而是对偏转角 pid. 请问光电编码器A相B相Z相输出怎么编程来接收这个信号啊 xlla 发表于 2012-10-26 15:01 static/image/common/back.gif
通常是自己装编码器,裸露的或者全密封的。
即使同转速也不一定能走直线,有安装的问题,轴线误差,负重平 ...
你的是 A89 光电编码器吗? 4根线, 码盘是100线的, 可以给出具体连接图吗?
页:
[1]