Rumah  >  Artikel  >  hujung hadapan web  >  Cara yang berbeza untuk memahami kedudukan mutlak pengekod

Cara yang berbeza untuk memahami kedudukan mutlak pengekod

王林
王林asal
2024-01-18 09:50:07453semak imbas

Cara yang berbeza untuk memahami kedudukan mutlak pengekod

Pengekod ialah penderia kedudukan yang biasa digunakan yang boleh digunakan untuk mengukur sesaran putaran dan gerakan linear serta menukarkannya kepada isyarat digital. Fungsi kedudukan mutlak pengekod membolehkan kita mengetahui dengan tepat kedudukan objek, jadi ia digunakan secara meluas dalam banyak bidang, seperti robot, kereta, instrumen perubatan, dll.

Terdapat banyak cara untuk memahami kedudukan mutlak pengekod, antaranya yang lebih biasa adalah seperti berikut:

  1. Kaedah pengekodan binari

Kaedah pengekodan binari ialah satu cara untuk menukar gerakan fizikal kepada isyarat digital. Pengekod mengesan sama ada objek bergerak melalui penderia kedudukan dan menukar kod digital yang dikeluarkannya berdasarkan kedudukan pergerakan objek. Setiap kod digital sepadan dengan lokasi fizikal yang unik, jadi kami boleh menentukan lokasi objek dengan membaca output pengekod.

Berikut ialah contoh kod untuk pengekod binari yang dilaksanakan dengan 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. Kaedah pengekodan kod kelabu

Kod kelabu ialah varian pengekodan binari, kelebihannya ialah hanya perubahan kedudukan akan menghasilkan Bit pengekodan perubahan. Output pengekod kod Kelabu adalah serupa dengan pengekod binari, tetapi pengekodan perlu ditukar kepada perwakilan binari sebelum ia boleh dinyahkod. Ini boleh dilakukan dengan mencari jadual penukaran, atau menggunakan cip penyahkod khusus untuk melakukan penukaran secara automatik.

Berikut ialah contoh kod untuk pengekod kod Kelabu yang dilaksanakan menggunakan Shift Register 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. Kaedah pengekodan PWM

Kaedah pengekodan PWM menggunakan prinsip modulasi lebar denyut untuk menukar isyarat output pengekod isyarat nadi. Setiap lebar nadi sepadan dengan kedudukan, jadi kita boleh menentukan kedudukan dengan membaca lebar nadi.

Berikut ialah contoh kod untuk pengekod PWM yang dilaksanakan menggunakan modul PWM ESP32:

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);
}

Ringkasan

Di atas ialah contoh kod bagi tiga kaedah penentududukan mutlak pengekod biasa. Dengan memahami cara pengekod berfungsi, kami dapat memahami dengan lebih baik cara menggunakannya untuk mencapai kedudukan yang tepat, dengan itu meningkatkan kecekapan dan kualiti pengeluaran dalam bidang seperti robotik, kereta dan instrumen perubatan.

Atas ialah kandungan terperinci Cara yang berbeza untuk memahami kedudukan mutlak pengekod. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn