本帖最后由 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;
- }
复制代码 |