Gestion d'un codeur incrémental

Le but de cette fiche est de donner quelques trucs sur la gestion des rebonds d'un codeur incrémental. C'est en général quelque chose qui est très mal documenté. On trouvera ici des explications, des mesures et un échantillon de code assembleur PIC.

 

 

12° (30 pas par tour) entre 2 déclics


Le modèle PIHER CI-11CT-V1Y22-LFACF fournit 15 impulsions par tour, 2 détentes par période, pas de butée (rotation libre). Ainsi, on a deux commutations (changement) tous les 12°, soit 60 commutations par tour.

Les constructeurs considèrent une vitesse de rotation de test de 1 tour/s soit 360°/s, le signal carré à une demi période de 33ms (1/30Hz) dans ce cas. On peut tourner beaucoup plus vite, il faut mieux considérer 4 tours/s pour dimensionner le système d'acquisition, soit 8ms minimum par demi-période.

Les rebonds

Evidemment, les instants de commutation sont pollués par des rebonds qui peuvent durer 3ms. Le constructeur recommande l'utilisation de réseaux RC pour filtrer ces rebonds. Théoriquement, les commutations sur A ou B ne sont jamais simultanées, mais on distingue dans le dessins illustrant les rebonds, une impulsion en phase ; c'est à considérer pour la lecture.


En réalité les rebonds sont très sérieux, les captures d'écran ci dessous montre l'étendue des dégâts (on voit les 2 contacts A et B).





Traitement

On dispose donc de 2 informations digitale, A et B, dont l'évolution ne peut prendre que quelques valeurs.



Valeur de AB après



00

01

10

11

Valeur de AB avant

00


ccw

cw

erreur

01

cw


erreur

ccw

10

ccw

erreur


cw

11

erreur

cw

ccw


cw = clock wise, on tourne dans le sens d'une horloge, en général pour augmenter

ccw = counter clock wise, on tourne contraire d'une horloge, en général pour diminuer


Les µcontrôleurs modernes dispose d'une capacité à déclencher une interruption sur changement d'état (0-1 ou 1-0) d'un port. On peut utiliser cette technique ici.

On peut aussi lire le codeur par polling, périodiquement.


Dans les 2 cas, le plus simple pour le traitement consiste à construire un mot de 4 bits avec l'état antérieur et l'état courant, puis on indexe une table pour avoir l'action résultante.



aprés:avant

action

code

0

0000

Rien

00

1

0001

Décrémente

FF

2

0010

Incrémente

01

3

0011

Erreur

00

4

0100

Incrémente

01

5

0101

Rien

00

6

0110

Erreur

00

7

0111

Décrémente

FF

8

1000

Décrémente

FF

9

1001

Erreur

00

A

1010

Rien

00

B

1011

Incrémente

01

C

1100

Erreur

00

D

1101

Incrémente

01

E

1110

Décrémente

FF

F

1111

Rien

00

Si l'action est Rien ou Erreur, on ne change pas la valeur lue.


Quelques résultats ; en haut le contact, en bas la valeur bit restituée :


Le code a été réalisé sous forme de macro assembleur PIC dispo ici