使用旋转编码器可以获得Arduino的精度如何?


15

对于大型电动机,步进电动机通常很昂贵。但是,借助功能强大的标准直流电动机和旋转编码器,您可以“模拟”步进电动机。仅使用基本循环而没有太多其他代码的Arduino旋转编码器的精度如何?是否会“错过一个脉冲”而不会经常记录足够的旋转?如何使用更多代码处理此问题?有一个更好的方法吗?中断会有所帮助吗?是否有某种电路可以解决此问题?

注意:每秒可能不会超过4圈... (这可能很多,但是如果您正在做导螺杆式机械装置,则每英寸直线运动10圈时,每分钟只有24英寸。 )


我使用的旋转编码器在快速旋转时无法正常工作。我猜价格会有所不同。
jippie 2014年

Answers:


10

在这种情况下,您将使用中断。

您提到的速率足够慢,您可能可以在一个循环内对其进行计数,但是不建议这样做,因为典型的循环将需要很多时钟周期才能完成,并且取决于每个循环的指令数量,您可能会错过一些计数。

出于此目的而产生中断,因为它们可以随时触发,而与循环的状态无关。

有一个名为的函数attachInterrupt(),它将接受三个参数。

  1. 中断针
  2. 中断服务程序
  3. 模式

以下是计数中断的示例

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

模式如下:

低,变化,上升,下降

有关使用中断的更多信息,请参见此处

根据您使用的编码器,您需要定制所需的代码,并进行更多的计算以确定您的位置,但这应该是一个很好的起点。

编辑 是Arduino Sandbox中使用旋转编码器的一些示例代码。


1
Duemilanove上的中断驱动边缘检测器可以轻松地每秒处理100个边缘(电动机上为6500rpm)。
Wayfaring Stranger 2014年

@WayfaringStranger因此,Uno没问题。谢谢!
匿名企鹅2014年

1
@AnnonomusPerson-您愿意投入多少工作?如果赤身裸体(ISR_NAKED()),则可以跳过自动C上下文保存,并毫无问题地获得100-500 Khz的中断速率,但是那时候基本上是用C编写汇编语言。
康纳·沃尔夫

1
如果您希望获得有关优化绝对废话的完整banannas文档,请参见此处。将代码直接放在中断表中,以进一步减少中断等待时间!
康纳·沃尔夫

1
另外,请注意,如果要使用低延迟中断,则与ISR()直接使用中断相比,arduino attachInterrupt函数会注入整个额外的函数调用开销。
康纳·沃尔夫2014年

3

在已经编写的库和示例中添加一些参考,以实现不同方法之间的比较,以及对缺少步骤的速度与敏感性的体验。

读取旋转编码器:http : //playground.arduino.cc/Main/RotaryEncoders

正交编码器对于Arduino来说太快了(带有解决方案):http : //www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Teensy编码器库:https ://www.pjrc.com/teensy/td_libs_Encoder.html

在Arduino上读取旋转编码器:http//www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.