Pic 16F8xx Decodage codeur rotatif en quadrature

  • Auteur de la discussion grandioso
  • Date de début
G

grandioso

Ouvrier
Bonsoir,

Je suis en train de programmer le decodage du changement de direction et comptage/decomptage d'un codeur rotatif en quadrature en assembleur pour un PIC 16F877A.
Il s'agit de la premiere etape pour gerer le deplacement d'un axe.
Comme je n'ai pas beaucoup d'experience je recherche de la doc ou des exemples de programmes, algorithmes qui traitent du sujet.
 
C

coredump

Compagnon
optique ou méchanique?
Si en optique c'est relativement simple (certain micro comme les stm32 ont meme du hard qui peut le faire), c'est pas du tout la meme chose avec les méchaniques. Il faut faire de l'anti-rebond.
Ceci dit ca prends moins d'une dizaine de lignes de code.
 
G

grandioso

Ouvrier
-->philvk75 --> Bigonoff je connais

-->coredump : C'est un capteur rotatif optique.
Il y a deux signaux en quadrature. On determine le sens en comparant l'etat precedent des signaux à celui present. Dans une table on a suivant ces etats
et leur succession le sens de la rotation.
L'algorithme est effectivement assez simple , mais c'est dans les details qu'impose
le microcontroleur utilisé et le langage assembleur que se trouvent pour une bonne
part les difficultés.
Mon programme en simulation marche....mais le réel surprend souvent...
 
P

philvk75

Apprenti
oui mais ton programme anti rebon doit etre proportionnel a la vitesse .Il me semble que juste pour un bouton poussoire c'est deux meusure a 10 ms d'ecarts
 
C

coredump

Compagnon
grandioso a dit:
L'algorithme est effectivement assez simple , mais c'est dans les details qu'impose
le microcontroleur utilisé et le langage assembleur que se trouvent pour une bonne
part les difficultés.

Alors faut changer de micro/langage. Franchement j'avais fais du code sur avr en C pour gérer un petit encodeur mécanique (pas franchement de qualité) et ça ne prenait qu'une dizaine de ligne en C, avec debounce. Dommage j'ai perdu ça dans une fausse manip de disque dur...
 
G

grandioso

Ouvrier
---->philvk75

J''y vais par etape. D'abord je teste avec des inters la sequence de rotation de l'encodeur sur la platine....peut-être demain.
Puis je m'occupe de l'anti rebond : un circuit de chez Maxim donne 40ms ,je vais commencer par là.
Faire une premiere lecture puis une deuxieme apres 40ms. J'ajusterais en fonction effectivement de la vitesse.
 
C

coredump

Compagnon
40ms c'est tres long, 10ms ca passe. Pour un optique, aucun debounce c'est fiable.
 
G

grandioso

Ouvrier
Merci Itus, il semble que ce soit la technique que j'utilise.

-->philvk75 : J'utilise le simulateur dans MPLAB v 8.83 sous windows.
J'aurais préféré l'utiliser sous MPLAB X sous linux Ubuntu qui est mon systeme d'exploitation habituel mais il n'existe pas, par contre la fonction
assembleur linkeur marche bien. Je me dis que c'est une version Beta ou alors je n'ai pas compris quelquechose.
 
C

ctoutmoi

Ouvrier
J'ai utilisé un encodeur avec bouton poussoir intégré avec un pic. Ce joint mon bout de code pour gérer l'encodeur.


Variables à déclarer bien sur et appel de la fonction pour remise à jour des variables. Aucun problème de rebonds avec implémentation d'un délai, faut baisser en fonction du matos. Pour moi, cela fonctionne. (Pour info, l'application était de gérer un pas à pas pour sortir une règle de profondeur de x mm pour une scie radiale DIY )
Bon codage :)
 
N

NazzTazz

Nouveau
Un peu tard, mais toujours utile si quelqu'un arrive sur ce post via une recherche.

Pour le debounce ("anti rebond"), si on a "pas le temps" dans le programme pour une raison ou une autre (beaucoup d'autres calculs à faire, acquisitions A/N...), on peut câbler les deux signaux de l'encodeur rotatif sur deux lignes pour lesquelles le pic est capable de générer une interruption au changement d'état (branchement conditionnel lors du 0->1 ou 1->0), et debouncer les signaux avec un simple réseau R/C. Ce genre de drôlerie peut optimiser la durée du traitement d'un facteur 10.
 
G

grandioso

Ouvrier
Bonjour NazzTazz,

Pour l'anti rebond et le decodage des signaux en quadrature, j'ai abandonné le traitement par programme ça marchait en simulation mais
une fois sur la platine d'essai c'était le fiasco.
Je me suis replié sur une note d'application Microchip (AN696) avec 2 circuits 74HC14 comme filtre et 74HC74 comme decodeur on obtient
une sortie en niveau 0 ou 1 comme signal pour la direction et une autre sortie pour les pas. C'est plus facile à gérer : une interuption a lieu à
chaque pas on regarde le sens et on incremente ou décrémente suivant le résultat.
 
N

NazzTazz

Nouveau
Bonjour, c'est une solution qui a le mérite d'être simple à implémenter, mais qui prend de la place sur le PCB ! On a pas toujours une liberté totale sur sa taille..

En revanche je suis surpris que la maquette ne fonctionne pas. Même sur une plaque d'essais avec des connexions pourries et un câblage approximatif, ça devrait filer droit, du premier coup.

Le principe général de décodage "rapide et dégueu" de signaux en quadrature, est de considérer les deux lignes venant de l'encodeur comme deux bits consécutifs d'un entier (qui variera donc de 0 a 3).

On stocke deux "générations" de cet entier, l'un représentant le dernier état, l'autre représentant l'état précédent. Il suffit alors d'appliquer une table de vérité, une génération en colonne, une génération en ligne, le résultat étant fixé parmi: INC (incrémenter), DEC (décrémenter), et NA (parasite / faux mouvement).

Si l'anglais n'est pas un problème, voir ce lien: http://www.piclist.com/techref/io/sensor/pos/enc/quadrature.htm qui détaille la table de vérité dont je parle.
 
Dernière édition par un modérateur:
Haut