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.
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).
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