Maison  >  Article  >  interface Web  >  Différentes façons de comprendre le positionnement absolu des codeurs

Différentes façons de comprendre le positionnement absolu des codeurs

王林
王林original
2024-01-18 09:50:07453parcourir

Différentes façons de comprendre le positionnement absolu des codeurs

Un encodeur est un capteur de position couramment utilisé qui peut être utilisé pour mesurer le déplacement de rotation et le mouvement linéaire et le convertir en signal numérique. La fonction de positionnement absolu de l'encodeur nous permet de connaître avec précision la position de l'objet, elle est donc largement utilisée dans de nombreux domaines, tels que les robots, les automobiles, les instruments médicaux, etc.

Il existe de nombreuses façons de comprendre le positionnement absolu des encodeurs, parmi lesquelles les plus courantes sont les suivantes :

  1. Méthode de codage binaire

La méthode de codage binaire est un moyen de convertir un mouvement physique en signaux numériques. L'encodeur détecte si l'objet se déplace grâce à un capteur de position et modifie le code numérique qu'il émet en fonction de la position du mouvement de l'objet. Chaque code numérique correspond à un emplacement physique unique, nous pouvons donc déterminer l'emplacement de l'objet en lisant la sortie de l'encodeur.

Voici un exemple de code pour un encodeur binaire implémenté avec 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. Méthode d'encodage par code Gray

Le code Gray est une variante de l'encodage binaire, son avantage est que seul un changement de position entraînera un Bit d'encodage changements. La sortie d'un encodeur à code Gray est similaire à celle d'un encodeur binaire, mais l'encodage doit être converti en représentation binaire avant de pouvoir être décodé. Cela peut être fait en recherchant une table de conversion ou en utilisant une puce de décodeur spécifique pour effectuer la conversion automatiquement.

Ce qui suit est un exemple de code pour un encodeur à code Gray implémenté à l'aide du registre à décalage 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. Méthode d'encodage PWM

La méthode d'encodage PWM utilise le principe de modulation de largeur d'impulsion pour convertir le signal de sortie de l'encodeur en un signal d'impulsion. Chaque largeur d'impulsion correspond à une position, nous pouvons donc déterminer la position en lisant la largeur d'impulsion.

Ce qui suit est un exemple de code pour un encodeur PWM implémenté à l'aide du module PWM d'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);
}

Résumé

Ce qui précède sont des exemples de code de trois méthodes de positionnement absolu d'encodeur courantes. En comprenant le fonctionnement d'un encodeur, nous pouvons mieux comprendre comment l'appliquer pour obtenir un positionnement précis, améliorant ainsi l'efficacité et la qualité de la production dans des domaines tels que la robotique, l'automobile et les instruments médicaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn