ロータリエンコーダを使用してArduinoをどれだけ正確に取得できますか?


15

多くの場合、ステッピングモーターは大型モーターには高価です。ただし、強力な標準DCモーターとロータリーエンコーダーを使用すると、ステッピングモーターを「シミュレート」できます。Arduinoを備えたロータリーエンコーダーは、基本的なループを使用しており、他のコードはそれほど多くありません 「パルスを逃し」、十分な回転を頻繁に記録しませんか?これをもっと多くのコードでどのように処理できますか?これを行うためのより良い方法はありますか?割り込みは役立ちますか?この問題に役立つ何らかの回路はありますか?

注:おそらく、1秒間に4回転を超えることはありません... (多くの場合もありますが、1インチあたり10回転の直線運動がある場合に1分間に24インチだけになる親ねじタイプのメカニズムを実行している場合。 )


私は高速回転時に適切に動作することを拒否したロータリーエンコーダーを使用しました。価格によって変わると思います。
ジッピー14年

回答:


10

割り込みは、この状況で使用するものです。

あなたが言及したレートはおそらくあなたがループ内でそれを数えることができるほど遅いですが、これはお勧めしません、いくつかのカウントを逃す可能性があります。

割り込みは、ループの状態に関係なくいつでもトリガーできるため、この目的で作成されます。

attachInterrupt()3つの引数をとるという名前の関数があります。

  1. 割り込みピン
  2. 割り込みサービスルーチン
  3. モード

以下は、割り込みをカウントする例です

volatile int myCounter = 0;

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

void count(){
    myCounter++;
}

モードは次のとおりです。

低、変化、上昇、落下

割り込みの使用に関する詳細は、こちらをご覧ください

使用するエンコーダーに応じて、必要なコードを調整し、さらに計算を行って位置を決定する必要がありますが、これは良い出発点です。

編集 ここではロータリエンコーダを使用するためのArduinoサンドボックスからいくつかのサンプルコードです。


1
Duemilanoveの割り込み駆動型エッジ検出器は、1秒あたり100エッジ(モーターで6500rpm)を簡単に処理します。
旅の見知らぬ人14年

@WayfaringStrangerそれでは、Unoに問題はありません。ありがとう!
匿名のペンギン14年

1
@AnnonomusPerson-どれだけの仕事をするつもりですか?裸になった場合(ISR_NAKED())、自動Cコンテキスト保存をスキップし、100-500 Khzの割り込みレートを問題なく実行できますが、基本的にはその時点でCでアセンブリを記述しています。
コナーウルフ

1
割り込み応答からの絶対的ながらくたの最適化に関する完全なバナナ文書が必要な場合は、こちらをご覧ください。割り込みテーブルにコードを直接配置して、割り込みレイテンシをさらに削減します!
コナーウルフ14

1
また、低レイテンシの割り込みを使用する場合、arduino attachInterrupt関数は、割り込みをISR()直接使用するのではなく、追加の関数呼び出しオーバーヘッドを追加することに注意してください。
コナーウルフ14

3

すでに記述されているライブラリとサンプルへの参照を追加して、異なるアプローチ間の比較を可能にし、ステップの欠落に対する速度と感受性の経験を提供します。

ロータリーエンコーダーの読み取り:http : //playground.arduino.cc/Main/RotaryEncoders

Arduinoの直交エンコーダーが速すぎる(ソリューションあり):http : //www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Teensy Encoderライブラリ:https ://www.pjrc.com/teensy/td_libs_Encoder.html

Arduinoのロータリーエンコーダーの読み取り:http : //www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.