Table des matières:

Décodeur rotatif simple : 4 étapes
Décodeur rotatif simple : 4 étapes

Vidéo: Décodeur rotatif simple : 4 étapes

Vidéo: Décodeur rotatif simple : 4 étapes
Vidéo: L'encodeur 2024, Juillet
Anonim
Image
Image
Décodeur rotatif simple
Décodeur rotatif simple

Cette instructable décrit une méthode simple de décodage d'un encodeur rotatif séquentiel à l'aide d'un Arduino Uno R3.

Des routines logicielles compactes sont utilisées pour compter le nombre de transitions, éliminer les rebonds de contact et déterminer le sens de rotation. Des composants et des tables de recherche supplémentaires ne sont pas nécessaires.

Des versions avec et sans interruption du code sont fournies.

La version d'interruption du code ne nécessite qu'une seule broche d'interruption.

Images:

  • La photo d'ouverture montre l'encodeur assemblé.
  • La capture d'écran montre le code de la version d'interruption et le nombre lorsque l'arbre du codeur est tourné dans le sens horaire et antihoraire.
  • La vidéo montre le décompte pendant la rotation rapide.

Étape 1: schéma de circuit

Schéma
Schéma

Le schéma de câblage de l'encodeur est représenté sur la fig.1.

Les cavaliers sont soudés directement aux broches de l'encodeur.

Échangez les deux fils bleus si le sens de comptage est inversé.

Étape 2: Liste des pièces

Les pièces suivantes ont été obtenues à partir de

  • 1 seul Arduino UNO R3 avec câble USB.
  • 1 seul encodeur rotatif séquentiel (EC11 ou équivalent) avec interrupteur.
  • 1 seul bouton pour s'adapter à l'arbre.
  • 3 fils de cavalier Arduino mâle-mâle uniquement.

Étape 3: Théorie

Théorie
Théorie

Les encodeurs rotatifs séquentiels génèrent deux ondes carrées dont chacune est déplacée de 90 degrés, comme le montre la Fig.1.

Les schémas logiques au contact A et au contact B sont différents lorsque l'arbre est tourné dans le sens horaire (CW) et antihoraire (CCW) sur les positions 1 à 6.

Les méthodes courantes de détermination du sens de rotation comprennent:

  • Matériel
  • interruptions jumelles
  • tables de recherche de modèle

Ce projet utilise une méthode logicielle qui ne nécessite pas de tables de recherche. [1]

Direction

Au lieu de regarder les modèles de sortie du contact A et du contact B, concentrons-nous sur le contact A.

Si nous échantillonnons le contact B après chaque transition du contact A, nous notons que:

  • Le contact A et le contact B ont des états logiques opposés lorsque l'encodeur est tourné dans le sens horaire
  • Le contact A et le contact B ont le même état logique lorsque l'encodeur est tourné dans le sens antihoraire

Code réel:

// ----- Compter les transitions

CurrentStateA = stateContactA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead(ContactB); if (CurrentStateA == CurrentStateB) Count++; if (CurrentStateA != CurrentStateB) Count--; LastStateA = CurrentStateA; }

Cette méthode offre les avantages suivants:

  • les tables de recherche ne sont pas nécessaires
  • une seule ligne d'interruption est requise

Anti-rebond

Tous les codeurs mécaniques souffrent de « rebond de contact ».

Si un contact d'interrupteur n'ouvre/s'ouvre pas proprement, son état logique oscillera rapidement de HAUT à BAS jusqu'à ce que le contact d'interrupteur se stabilise. Cela se traduit par de faux décomptes.

Une méthode pour supprimer le rebond de contact consiste à ajouter un petit condensateur entre chaque contact de commutateur. Le condensateur et la résistance de rappel associée forment un intégrateur qui court-circuite efficacement les hautes fréquences et permet à la tension de commutation de monter/baisser gracieusement.

L'inconvénient de cette approche est que des transitions peuvent être manquées si l'arbre du codeur est tourné rapidement.

Anti-rebond logiciel

Cette méthode utilise deux compteurs (Open, Closed) qui ont été mis à zéro. [2]

Une fois qu'une transition est détectée sur le contact A:

  • Sondage en continu Contact A.
  • Incrémentez le compteur d'ouverture et réinitialisez le compteur de fermeture chaque fois que le contact A est au niveau haut.
  • Incrémentez le compteur Fermé et réinitialisez le compteur Ouvert, chaque fois que le Contact A est BAS.
  • Quittez la boucle lorsque l'un des compteurs atteint un nombre prédéterminé. Nous recherchons effectivement la période d'équilibre après tout rebond de contact.

Code réel:

// ----- Anti-rebond Contact A

while (1) { if (digitalRead(ContactA)) { // ----- ContactA is Open Closed = 0; // Intégrateur inverse vide Open++; // Intégrer if (Open > MaxCount) return HIGH; } else { // ----- ContactA est Fermé Ouvert = 0; // Intégrateur inverse vide Closed++; // Intégrer if (Fermé > MaxCount) return LOW; } }

Il n'est pas nécessaire de neutraliser le contact B car les transitions du contact A et du contact B ne coïncident pas.

Compte

Un "détente" mécanique double efficacement votre compte car deux comptes sont enregistrés entre les clics (voir fig 1).

Le nombre de « détentes » peut être déterminé en utilisant l'arithmétique modulo 2 comme indiqué ci-dessous.

Code réel:

// ----- Compter "détentes"

if (Count % 2 == 0) { Serial.print("Count: "); Serial.println(Count / 2); }

Les références

De plus amples informations peuvent être trouvées sur:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Étape 4: Logiciel

Ce projet nécessite une version récente de l'IDE Ardino Uno R3 (environnement de développement intégré) disponible sur

Téléchargez chacun des deux croquis Arduino suivants (ci-joints)

  • Rotary_encoder_1.ino (version d'interrogation)
  • Rotary_encoder_2.no (version d'interruption)

Double-cliquez sur votre version préférée et suivez les instructions à l'écran.

Prendre plaisir …

Cliquez ici pour voir mes autres instructables.

Conseillé: