5

ロータリー エンコーダを AVR マイクロ コントローラで正しく動作させるのに問題があります。エンコーダーは機械式ALPS エンコーダーで、 Atmega168を使用しています。

明確化

I have tried using an External Interrupt to listen to the pins, but it seems like it is too slow. When Pin A goes high, the interrupt procedure starts and then checks if Pin B is high. The idea is that if Pin B is high the moment Pin A went high, then it is rotating counter clock-wise. If Pin B is low, then it is rotating clock-wise. But it seems like the AVR takes too long to check Pin B, so it is always read as high.

I've also tried to create a program that simply blocks until Pin B or Pin A changes. But it might be that there is too much noise when the encoder is rotated, because this does not work either. My last attempt was to have a timer which stores the last 8 values in a buffer and checks if it is going from low to high. This did not work either.

I have tried scoping the encoder, and it seems to use between 2 and 4ms from the first Pin changes till the other Pin changes.

4

5 に答える 5

10

ロータリー エンコーダとその使用方法に関する Web ページがあります。

残念ながら、これ以上の情報がないと、特定の問題のトラブルシューティングを行うことができません。

エンコーダーに接続されているマイクロコントローラーのピンはどれですか?パルスをデコードするために現在使用しているコードは何ですか?

わかりました、いくつかの異なる問題に対処しています。最初の問題は、これが機械式エンコーダーであるため、スイッチ ノイズ (バウンス、チャター) に対処する必要があることです。データシートによると、パーツがバウンスして誤った出力を生成しなくなるまでに最大 3 ミリ秒かかる場合があります。

デバウンス ルーチンを作成する必要があります。最も簡単な方法は、A が高くなるかどうかを継続的に確認することです。その場合は、タイマーを開始し、3 ミリ秒後にもう一度確認します。それでも高い場合は、B をチェックできます。高くない場合は、スプリアス パルスを無視して、引き続き A の高い値を探します。B をチェックしたら、それを見て、3 ミリ秒のタイマーを開始してから、もう一度 B を見てください。両方とも同じだった場合は、その値を使用できます。3 ミリ秒以内に変化した場合は、もう一度実行する必要があります (B を読み取り、3 ミリ秒待ってから、もう一度読み取って一致するかどうかを確認します)。

atmega は十分に高速であるため、クロック速度が遅い場合を除き、これらのチェックが遅くなることを心配する必要はありません。

機械的ノイズを処理したら、適切なグレイ コード ルーチンを調べます。B がローになるときに A がハイである場合はデクリメントも行わない限り、従うアルゴリズムは機能しません。通常、人々は 2 つの入力の最後の値を保存し、それを 2 つの入力の新しい値と比較し、小さな関数を使用してそれに基づいて増減します。(表については、上記のウェブサイトの「高解像度の読み取り」という見出しを確認してください)。2 つの読み取り値を 4 ビットの数値に結合し、単純な配列を使用してカウンターをインクリメントするかデクリメントするかを示しますが、さらに高度なソリューションがあり、コード サイズ、速度、またはコード メンテナンスの容易さを最適化します。

于 2008-08-29T19:37:37.503 に答える
6

アナログ ローパス フィルターを追加すると、信号が大幅に改善されます。ローパス フィルターを使用すると、AVR のコードは非常に単純になります。

       _________
        |         |
        | Encoder |
        |_________|
          |  |  |
          |  |  |
     100n |  O  | 100n  
 GND O-||-+ GND +-||-O GND
          |     | 
          \     /
      3K3 /     \ 3K3
          \     /
          |     |    
VCC O-/\/-+     +-\/\-O VCC
     15K  |     |  15K
          |     |
          O     O
          A     B

ああ、アスキー アートの素​​晴らしさ :p

これがAVRのプログラムです。A と B を avr の入力 PORTB に接続します。

#include <avr/io.h>

#define PIN_A (PINB&1)
#define PIN_B ((PINB>>1)&1)

int main(void){
    uint8_t st0 = 0;
    uint8_t st1 = 0;
    uint8_t dir = 0;
    uint8_t temp = 0;
    uint8_t counter = 0;
    DDRD = 0xFF;
    DDRB = 0;
    while(1){   
    if(dir == 0){
        if(PIN_A & (!PIN_B)){
            dir = 2;
        }else if(PIN_B & (!PIN_A)){
            dir = 4;
        }else{
            dir = 0;
        }
    }else if(dir == 2){
        if(PIN_A & (!PIN_B)){
            dir = 2;
        }else if((!PIN_A) & (!PIN_B)){
            counter--;
            dir = 0;
        }else{
            dir = 0;
        }
    }else if(dir == 4){
        if(PIN_B & (!PIN_A)){
            dir = 4;
        }else if((!PIN_A) & (!PIN_B)){
            counter++;
            dir = 0;
        }else{
            dir = 0;
        }
    }else if(PIN_B & PIN_A){
        dir = 0;
    }
        PORTD = ~counter;
    }
    return 0;
}

このコードは、エンコーダーを非常に速く回転させない限り機能します。その後、1 つか 2 つのステップを逃す可能性がありますが、それは重要ではありません。エンコーダーを使用している人は、エンコーダーを何ステップ回したか分からないからです。

于 2008-11-23T11:41:37.050 に答える
1

速度は問題になりません。ほとんどすべてのメカニカル スイッチには、デバウンス ルーチンが必要です。割り込みでこれを行いたい場合は、トリガー時に割り込みをオフにし、数ミリ秒後に割り込みをオンに戻すタイマーを開始します。あなたのプログラムをポーリングフリーに保ちます >:)

于 2008-10-21T20:30:16.420 に答える
0
/* into 0 service rutine */
if(CHB)
{
  if(flagB)
   Count++;
  FlagB=0;
}
else
{
  if(FlagB)
   count--:
  FlagB=0:
}

/* into 1 service rutine */
FlagB=1;

/* make this give to you a windows time of 1/4 of T of the encoder resolution
   that is in angle term: 360/ (4*resolution)
 */
于 2008-11-03T00:02:12.183 に答える
0

いったい何に困っているのでしょうか?あなたが提供したFarnellページにリンクされている技術仕様に従って、エンコーダーのピンをPICに接続できたと思いますが、データの読み取りに問題がありますか? エンコーダーからデータを取得していませんか? 返されたデータを解釈する方法がわかりませんか?

于 2008-08-29T17:18:46.433 に答える