Answers:
在这种情况下,您将使用中断。
您提到的速率足够慢,您可能可以在一个循环内对其进行计数,但是不建议这样做,因为典型的循环将需要很多时钟周期才能完成,并且取决于每个循环的指令数量,您可能会错过一些计数。
出于此目的而产生中断,因为它们可以随时触发,而与循环的状态无关。
有一个名为的函数attachInterrupt()
,它将接受三个参数。
以下是计数中断的示例
volatile int myCounter = 0;
void setup(){
attachInterrupt(0, count, RISING);
}
void count(){
myCounter++;
}
模式如下:
低,变化,上升,下降
有关使用中断的更多信息,请参见此处。
根据您使用的编码器,您需要定制所需的代码,并进行更多的计算以确定您的位置,但这应该是一个很好的起点。
编辑 这是Arduino Sandbox中使用旋转编码器的一些示例代码。
ISR_NAKED()
),则可以跳过自动C上下文保存,并毫无问题地获得100-500 Khz的中断速率,但是那时候基本上是用C编写汇编语言。
ISR()
直接使用中断相比,arduino attachInterrupt函数会注入整个额外的函数调用开销。
在已经编写的库和示例中添加一些参考,以实现不同方法之间的比较,以及对缺少步骤的速度与敏感性的体验。
读取旋转编码器: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/