市面上的电机质量参差不齐,便宜的电机普遍都有10%的误差,这意味着,Arduino控制器给出同样驱动信号,两个电机转过的角度和转速都会有较大差别。在机器人运行的过程中,如果左右轮电机不对称,机器人在直线驱动信号下将走弯路。这一点后续还会讲到,但是本节介绍的编码器,其主要功能就是反馈电机运动的速度与位置,能做到让电机基本指哪转哪。编码器的实现方式通常有磁式和光学两种,不过原理非常类似,只是磁式采用霍尔传感器检测磁场的脉动,而光学编码器采用光敏元件检测。下面就以光学编码器为例简要介绍其工作原理。为了检测细微运动并输出为数字脉冲信号,码盘(旋转运动)或码尺(直线运动)被细分成若干校区,每个小区透光或者反光。以透光式为例,当光源由码盘一侧向另一侧发射一束光时,另一侧的光敏元件进行检测。如果码盘角度正好位于光线能穿过的地方,光敏元件导通,输出高电平,反之则光敏元件管断,输出低电平。随着码盘的转动,传感器就能连续不断地输出脉冲信号,对该信号在特定时间内计数,则可测量其转过的角度,已经获得平均速度。
前面一节提到了电机的正反转驱动问题,在检测的时候也会有此困惑,上述介绍的编码盘工作方式是无法获得旋转方向的。所以有提出采用绝对编码器的方案,详情请参考附录或相关资料。在大多数情况下,许多增量编码器通过增加多一个码区,即可完成判断转向的功能。
增量编码器给出两相方波,它们的相位差90°,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比,得到旋转方向的信息。还有一个特殊信号称为Z或零通道,该通道给出编码器的绝对零位,此信号是一个方波与A通道方波的中心线重合。
旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。
增量型编码器精度取决于机械和电气两种因素,这些因素有:光栅分度误差、光盘偏心、轴承偏心、电子读数装置引入的误差以及光学部分的不精确性。确定编码器精度的测量单位是电气上的度数,编码器精度决定了编码器产生的脉冲分度。以下用360°电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要知道多少机械角度相当于电气上的360度,可以用下列公式来计算:电气360 =机械360°/n°脉冲/转
现在市面上已经有了专门的编码器模块,配合联轴器可以直接与电机相连,测量我们需要测量轴的转动情况,如右图所示,看起来很像电位器的样子,但它可以连续360°旋转,一圈脉冲数:20。
编码器(Encoder)也可以直接用现有的Arduino类库直接操作,使用起来简单方便,其代码如下,详细资料及类库下载,请访问源码作者博客或Arduino官网相关了解更多。
http://playground.arduino.cc/Main/RotaryEncoders
http://www.pjrc.com/teensy/td_libs_Encoder.html
/* 编码器示例程序 * 源码作者相关信息 * http://www.pjrc.com/teensy/td_libs_Encoder.html * 该代码位于公共域 */ #include Encoder myEnc(5, 6); void setup() { Serial.begin(9600); Serial.println("Basic Encoder Test:"); } long oldPosition = -999; void loop() { long newPosition = myEnc.read(); if (newPosition != oldPosition) { oldPosition = newPosition; Serial.println(newPosition); } }