エンコーダの絶対位置を理解するさまざまな方法

王林
リリース: 2024-01-18 09:50:07
オリジナル
514 人が閲覧しました

エンコーダの絶対位置を理解するさまざまな方法

エンコーダは、回転や直線運動の変位を測定し、デジタル信号に変換するために使用できる、一般的に使用される位置センサーです。エンコーダの絶対位置決め機能により、物体の位置を正確に知ることができるため、ロボット、自動車、医療機器など幅広い分野で活用されています。

エンコーダの絶対位置を理解する方法はたくさんありますが、より一般的な方法は次のとおりです。

  1. バイナリ エンコード方式

バイナリ エンコード方式 物理的な動きをデジタル信号に変換する方式です。エンコーダは、位置センサーを通じて物体が動いているかどうかを検出し、物体の動きの位置に基づいて出力するデジタルコードを変更します。各デジタル コードは一意の物理的位置に対応するため、エンコーダーの出力を読み取ることでオブジェクトの位置を特定できます。

以下は、Arduino で実装されたバイナリ エンコーダのサンプル コードです。

const int encoderPinA = 2;
const int encoderPinB = 3;
volatile int encoderPos = 0;
volatile bool aSet = false;
volatile bool bSet = false;

void setup() {
  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);
  attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoderA, CHANGE);
  attachInterrupt(digitalPinToInterrupt(encoderPinB), updateEncoderB, CHANGE);
}

void loop() {
  // 读取编码器当前位置
  int newPos = encoderPos;
  Serial.println(newPos);
}

void updateEncoderA() {
  aSet = digitalRead(encoderPinA);
  if (aSet && !bSet) {
    encoderPos++;
  } else if (!aSet && bSet) {
    encoderPos--;
  }
  bSet = digitalRead(encoderPinB);
}

void updateEncoderB() {
  bSet = digitalRead(encoderPinB);
  if (bSet && !aSet) {
    encoderPos--;
  } else if (!bSet && aSet) {
    encoderPos++;
  }
  aSet = digitalRead(encoderPinA);
}
ログイン後にコピー
  1. グレー コード エンコード方法

グレー コードは、バイナリ エンコードのバリアントです。これには、1 つの位置の変更だけで 1 つのコーディング ビットが変更されるという利点があります。グレイ コード エンコーダの出力はバイナリ エンコーダに似ていますが、デコードする前にエンコードをバイナリ表現に変換する必要があります。これは、変換テーブルを検索するか、特定のデコーダ チップを使用して自動的に変換を行うことによって実行できます。

以下は、シフト レジスタ 74HC595 を使用して実装されたグレイ コード エンコーダのコード例です。

const int encoderPinClock = 4;
const int encoderPinData = 5;
const int encoderPinLatch = 6;

unsigned int encoderValue = 0;

void setup() {
  pinMode(encoderPinClock, OUTPUT);
  pinMode(encoderPinData, OUTPUT);
  pinMode(encoderPinLatch, OUTPUT);
}

void loop() {
  // 读取编码器当前位置
  unsigned int newPos = 0;
  for (int i = 0; i < 16; i++) {
    digitalWrite(encoderPinLatch, LOW);
    shiftOut(encoderPinData, encoderPinClock, MSBFIRST, 1 << i);
    digitalWrite(encoderPinLatch, HIGH);
    delayMicroseconds(10);
    newPos |= digitalRead(encoderPinData) << i;
  }
  encoderValue = newPos;
  Serial.println(encoderValue);
}
ログイン後にコピー
  1. PWM エンコード方式

PWM エンコード方式はパルスを利用します。幅変調の原理によりエンコーダの出力信号をパルス信号に変換します。各パルス幅は位置に対応するため、パルス幅を読み取ることで位置を決定できます。

以下は、ESP32 の PWM モジュールを使用して実装された PWM エンコーダのサンプル コードです。

const int encoderPin = 5;
volatile int encoderPos = 0;
volatile unsigned long lastPulseTime = 0;

void IRAM_ATTR pulseHandler() {
  unsigned long pulseTime = micros();
  if (pulseTime - lastPulseTime > 10) {
    if (digitalRead(encoderPin) == HIGH) {
      encoderPos--;
    } else {
      encoderPos++;
    }
    lastPulseTime = pulseTime;
  }
}

void setup() {
  pinMode(encoderPin, INPUT);
  attachInterrupt(encoderPin, pulseHandler, CHANGE);
  ledcSetup(0, 5000, 8);
  ledcAttachPin(encoderPin, 0);
}

void loop() {
  // 读取编码器当前位置
  int newPos = map(ledcRead(0), 0, 255, -100, 100);
  encoderPos = newPos;
  Serial.println(encoderPos);
}
ログイン後にコピー

概要

上記は、3 つの一般的なエンコーダ絶対位置決め方法のコード例です。エンコーダの仕組みを理解することで、正確な位置決めを実現するためのエンコーダの適用方法をより深く理解できるようになり、ロボット、自動車、医療機器などの分野で生産効率と品質を向上させることができます。

以上がエンコーダの絶対位置を理解するさまざまな方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!