Roue Codeuse et Programmation PIC
Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

Roue Codeuse et Programmation PIC



  1. #1
    Waldoo

    Post Roue Codeuse et Programmation PIC


    ------

    Bonjour à toutes et à tous,

    Je voudrais utiliser une roue codeuse de ce type: HEDS-5701-A00 de chez AVAGO

    Page 3 de la doc sont donnés les signaux de sortie de la roue codeuse.

    J'utilise un pic 18F4550.

    J'ai donc relié ma première roue codeuse directement à mon pic (CH A - pin 35 (RB2), CH B - pin 36 (RB3)) et une seconde roue codeuse aux pins 37 et 38.

    Je me grattais la tête a savoir comment exploiter les résultats des roue codeuses pour déterminer l'angle de mon plateau (les roues codeuses servent a déterminer un angle d'inclinaison)

    -----

  2. #2
    Qristoff
    Animateur Électronique

    Re : Roue Codeuse et Programmation PIC

    Bonjour,
    ces codeurs sont incrémentaux, ce n'est pas plutôt un codeur absolu qu'il faut pour mesurer un angle ?
    Tout existe, il suffit de le trouver...!

  3. #3
    Zig38

    Re : Roue Codeuse et Programmation PIC

    Bonjour,

    Comme te l'indique indirectement Qristoff, il te manque un "Top Tour" pour caller le 0° sur le "0" de ton codeur.

    Le codeur que tu utilise à 2 voies, A et B, il lui faudrait une 3 éme voie, celle que le fabricant appelle "optional index pulse" et qui te donne 1 pulse par tour.

    Si tu calle cette pulse sur ce que tu choisit être l'angle 0° de ta mécanique, ce signal peur être utilisé pour remettre à 0 les compteurs que tu va utilisés pour compter les signaux codeurs.

    Cela peut trés bien être facultatif.

    J'imagine que tu a compris que les voies A et B perlmettent de déterminer aussi ton sens de rotation, pour COMPTER ou DECOMPETR l'angle?

    Quand tu tourne dans un sens, la voie B est en avance sur A, et si tu tourne dans le sens inverse, elle est en retard.

    Donc si par exemple tu fais un ET de la voie A et B, et que tu lis l'état de ce ET sur le front montant de la voie A, l'état (1 ou 0) de ce ET sur front montant de A t'indique le sens de rotation.

    De même que j'imagine que tu a compris que si ce codeur a 500 cycles par tour, c'est à dire 500 pts, le rapport degré/points est (360/500) x Nb points compté sur 1 voie = angle en °.

  4. #4
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Merci pour vos réactions rapides

    Nous utilisons un optocoupleur détectant une surface réfléchissante pour déterminer le 0°.

    c'est pourquoi on comptai prendre ce modele de roue codeuse,

    Pour la résolution, on va utiliser un réducteur 1:10 pour avoir une résolution de 5000points/tour

    Je vais étudier de plus près ta méthode de ET Zig, j'espère que j'arriverais à m'en sortir ^^

  5. A voir en vidéo sur Futura
  6. #5
    Zig38

    Re : Roue Codeuse et Programmation PIC

    Encore plus simple
    Images attachées Images attachées  

  7. #6
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Citation Envoyé par Zig38 Voir le message
    Encore plus simple
    oui mais...

    Quel est la commande en langage C sous pic 18F "détecter" le front montant ou descendant ?

    Ayant, A en pin 35 (RB2) et B en pin 36 (RB3) pour ma première roue.

  8. #7
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    j'ai trouvé un lien intéressant, je vais étudier cette piste:

  9. #8
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Cette piste n'est pas bonne, c'est plus compliqué que ça !

    Il faut échantillonner les deux entrées "A" et "B"
    Pour voir un "step" sur les deux entrées "A" et "B" du capteur, il faut quatre échantillons 00 01 11 10 . Donc si ton timer d'échantillonnage est à 1mS, il ne ne peut "voir" qu'un step de 4mS

    L'algorithme est simple :
    Etat précédent de AB =00 Etat lu de AB=01 Compte=+1
    Etat précédent de AB =00 Etat lu de AB=00 Compte=0
    Etat précédent de AB =00 Etat lu de AB=10 Compte=-1

    Etat précédent de AB =01 Etat lu de AB=11 Compte=+1
    Etat précédent de AB =01 Etat lu de AB=01 Compte=0
    Etat précédent de AB =01 Etat lu de AB=00 Compte=-1

    Etat précédent de AB =11 Etat lu de AB=10 Compte=+1
    Etat précédent de AB =11 Etat lu de AB=11 Compte=0
    Etat précédent de AB =11 Etat lu de AB=01 Compte=-1

    Etat précédent de AB =10 Etat lu de AB=00 Compte=+1
    Etat précédent de AB =10 Etat lu de AB=10 Compte=0
    Etat précédent de AB =10 Etat lu de AB=11 Compte=-1
    J'aime pas le Grec

  10. #9
    Zig38

    Re : Roue Codeuse et Programmation PIC

    Citation Envoyé par Waldoo Voir le message
    oui mais...

    Quel est la commande en langage C sous pic 18F "détecter" le front montant ou descendant ?
    Bonsoir,

    Désolé je ne connais pas les PIC, la méthode de DAUDET78 me semble parfaite, avec bien entendu une fréquence d'échantillonnage adaptée au système.

    Sinon un vieux électronicien moustachu t'aurais surement dit de mettre une "bascule" électronique qui marche sur front, comme ceci (voir bascule D)
    http://www.ac-nancy-metz.fr/pres-eta...quentielle.htm

    Un petit CI de plus sur ta carte en souvenir des temps ancien d'avant les PIC !!!



    Avec voie A en Ck, voie B en D, si Q=1 tu compte sur la voie A, sinon tu décompte sur cette même voie ...

    Désolé te ne pas t'en dire plus.

  11. #10
    RISC

    Re : Roue Codeuse et Programmation PIC

    Salut,

    Il y a encore plus facile....choisir un PIC18 avec un encodeur à quadrature intégré (QEI) comme le PIC18Fxx31 (xx=23,24,43,44).

    a+

  12. #11
    RISC

    Re : Roue Codeuse et Programmation PIC

    Re-

    Je viens de tomber par hasard là-dessus : Rotary Encoder Demonstration.

    T'as plus qu'à adapter

    a+

  13. #12
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Citation Envoyé par DAUDET78 Voir le message
    Cette piste n'est pas bonne, c'est plus compliqué que ça !

    Il faut échantillonner les deux entrées "A" et "B"
    Pour voir un "step" sur les deux entrées "A" et "B" du capteur, il faut quatre échantillons 00 01 11 10 . Donc si ton timer d'échantillonnage est à 1mS, il ne ne peut "voir" qu'un step de 4mS

    L'algorithme est simple :
    Etat précédent de AB =00 Etat lu de AB=01 Compte=+1
    Etat précédent de AB =00 Etat lu de AB=00 Compte=0
    Etat précédent de AB =00 Etat lu de AB=10 Compte=-1

    Etat précédent de AB =01 Etat lu de AB=11 Compte=+1
    Etat précédent de AB =01 Etat lu de AB=01 Compte=0
    Etat précédent de AB =01 Etat lu de AB=00 Compte=-1

    Etat précédent de AB =11 Etat lu de AB=10 Compte=+1
    Etat précédent de AB =11 Etat lu de AB=11 Compte=0
    Etat précédent de AB =11 Etat lu de AB=01 Compte=-1

    Etat précédent de AB =10 Etat lu de AB=00 Compte=+1
    Etat précédent de AB =10 Etat lu de AB=10 Compte=0
    Etat précédent de AB =10 Etat lu de AB=11 Compte=-1

    Je pense tenter cette solution, concaténer mes bits RB2 & RB3, et faire ainsi, ça me semble dans mes compétences

  14. #13
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Ce n'est pas une concaténation, mais une "machine d'état" à 8 états
    Quelques explications :
    http://w3.gel.ulaval.ca/~maldagx/gel10279/chap7.pdf
    http://fr.wikipedia.org/wiki/Machine_de_Mealy
    http://www-verimag.imag.fr/~tripakis...test-Mealy.ppt
    J'aime pas le Grec

  15. #14
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Citation Envoyé par DAUDET78 Voir le message
    Ce n'est pas une concaténation, mais une "machine d'état" à 8 états
    Oui mais il faut bien creer la variable "AB" avec mes 2 bits ?

    voici comment je comptais faire:
    Code:
    AB1 = PORTBbits.RB2 << 1 + PORTBbits.RB3; // concaténation de CHA1(RB2) et CHB1(RB3) pour avoir AB1.
    AB2 = PORTBbits.RB4 << 1 + PORTBbits.RB5; // concaténation de CHA2(RB4) et CHB2(RB5) pour avoir AB2.
    (AB1 et AB2 car j'ai 2 roues codeuses)


    J'avais étudié les machines de mealy et moore en cours mais disons que je n'ai retenu que les noms

    Je pensais faire un code avec des if selon toutes les conditions (mais je sens que ça doit faire horripiler certains

  16. #15
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    J'y connais rien en programmation . Mais tu fais une variable de 4 bits avec les deux bits lus A et B et les deux bits mémorisés Ao et Bo
    • A chaque interruption du timer tu as un quartet Bo Ao B A (Bo et Ao, les valeurs lues au coup d'avant . B et A les valeur lu)
    • En fonction de la valeur du quartet, avec un "case", tu as 16 sélections (dont certaines impossibles 0011 , 1100 , 0110 , 1001 )
    • Pour chaque sélection, tu fais le job : Incrémentation, rien , décrémentation
    • Pour chaque sélection, tu mets à jour Bo et Ao avec B et A
    • Pour chaque sélection tu fais le job +1, rien, -1
    A
    J'aime pas le Grec

  17. #16
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    ton idée DAUDET78 est très intéressante.

    Par contre (pour ceux, s'y connaissant plus)

    peut on faire un case en utilisant en variable un tableau ?
    (un tableau de 4 valeurs contenant, 1o,Bo,A,B, comme le suggère DAUDET78)

  18. #17
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Non, ce n'est pas un tableau mais une variable octet dont je n'utilise que le quartet de droite
    Bo = 0 ou 1
    Ao = 0 ou 1
    B = 0 ou 1
    A = 0 ou 1

    0 0 0 0 Ao Bo A B

    Donc ce que je propose (malgré mon ignorance de la programmation) est faisable .....
    Dernière modification par DAUDET78 ; 14/05/2010 à 18h20.
    J'aime pas le Grec

  19. #18
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Bonjour après m'être creuser la tete, j'ai plusieurs questions:

    Code:
    unsigned char AoBoAB=0; // A_prec,B_prec,A,B
    
    unsigned int A1,B1,A2,B2;
    if (PORTBbits.RB2==1) A1=1; else A1=0; //roue codeuse 1 channel A
    if (PORTBbits.RB3==1) B1=1; else B1=0; //roue codeuse 1 channel B
    if (PORTBbits.RB4==1) A2=1; else A2=0; //roue codeuse 2 channel A
    if (PORTBbits.RB5==1) B1=1; else B2=0; //roue codeuse 2 channel B
    
    
    strcat (AoBoAB,A1);
    strcat (AoBoAB,B1);
    strcat (AoBoAB,A1);
    strcat (AoBoAB,B1);
    
    
    
           switch (AoBoAB) {
         
             case '0000' : 
                //
    			break;
             case '0010' : 
                //
    			break;
             case '1110' : 
                //
    			break;
             default:
          
          }
    Je crée une variable A1 et B1 puisque apparemment on ne peut utiliser directement les valeurs PORTBbits.RB2 (par exemple A1=PORTBbits.RB2

    Ensuite, je concatène (grace à strcat) A1,B1,A1,B1 dans une seule variable AoBoAB.

    Malheureusement je ne sais pas en quel type mettre, mais unsigned char me semblait plus adéquate pour l'exploiter dans un case.

    ensuite par rapport à mon case, dois-je mettre case '0000', case "0000", case 0000: ? car en fait, aucune des 3 ne marche là (à moins que l'erreur vienne d'ailleurs)

    Merci

  20. #19
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Je n'y connait rien en programmation (en fait, je ne veux plus en faire !)

    Mais il faut une variable "octet" dont les 8 bits représentent
    Bit7=0
    Bit6=0
    Bit5=0
    Bit4=0
    Bit3= etat précedent de la broche B (B_prec)
    Bit2= etat précedent de la broche A (A_prec)
    Bit1= etat lu de la broche B
    Bit0= etat lu de la broche A

    Donc cet octet prend les valeurs de 0x00 à 0x0F et tu fais ton case dessus
    J'aime pas le Grec

  21. #20
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Citation Envoyé par DAUDET78 Voir le message
    Mais il faut une variable "octet" dont les 8 bits représentent
    Bit7=0
    Bit6=0
    Bit5=0
    Bit4=0
    Bit3= etat précedent de la broche B (B_prec)
    Bit2= etat précedent de la broche A (A_prec)
    Bit1= etat lu de la broche B
    Bit0= etat lu de la broche A
    Je fais de mon mieux pour trouver une solution, mais pour le moment je rame...

    Merci de ton aide Daudet78

  22. #21
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Voilà l'organigramme (non testé)
    Images attachées Images attachées  
    J'aime pas le Grec

  23. #22
    paulfjujo

    Re : Roue Codeuse et Programmation PIC

    bonjour

    il y a des erruers de typage:

    A1,B1,A2,B3 sont des entiers numerique
    or strcat concatene des characteres (strings) !
    il faut traiter des strings et non des entiers
    un usage de unsigned short au lieu de unsigned int
    devrait suffire pour A1,B1,A2,B2,
    AoBoAB doit etre un pointeur de string et non un charactere.
    utiliser A1=49 ; pour avoir le caracatere '1 ' // (1+48)
    ou A1=48; pour '0'

    Code:
    unsigned char * AoBoAB=0; 
    
    unsigned short A1,B1,A2,B2;
    if (PORTBbits.RB2==1) A1=49; else A1=48; //roue codeuse 1 channel A
    if (PORTBbits.RB3==1) B1=49; else B1=48; //roue codeuse 1 channel B
    if (PORTBbits.RB4==1) A2=49; else A2=48; //roue codeuse 2 channel A
    if (PORTBbits.RB5==1) B1=49; else B2=48; //roue codeuse 2 channel B
    
    
    strcat (AoBoAB,A1);
    strcat (AoBoAB,B1);
    strcat (AoBoAB,A2);
    strcat (AoBoAB,B2);
    
    
    
           switch (AoBoAB) {
         
             case '0000' : 
                //
    			break;
             case '0010' : 
                //
    			break;
             case '1110' : 
                //
    			break;
             default:
          
          }

  24. #23
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Citation Envoyé par paulfjujo Voir le message
    utiliser A1=49 ; pour avoir le caracatere '1 ' // (1+48)
    ou A1=48; pour '0'
    48 pour 110000 et
    49 pour 110001 je suppose ?


    ---

    Mais mon but en fait aurait de été de créer une variable, prenant seulement les valeurs 0000, 0010, 1110, etc .. je voulais passer par une chaine de caractère car je n'avais pas trouvé d'autres solutions pour concaténer, mais s'il y a une manière de garder des entiers, je suis preneur...

    tant que je peux faire un case qui marche

    et dois-je coder
    Code:
    case 0000:
    Code:
    case "0000":
    Code:
    case '0000':
    ?

    Merci
    Dernière modification par Waldoo ; 17/05/2010 à 17h13.

  25. #24
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Regarde mon algo en #21
    J'aime pas le Grec

  26. #25
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    J'ai vérifié mon algo #21 sur simulateur , il marche parfaitement bien et supprime les parasites de commutation sur les aléas de A et B.
    J'aime pas le Grec

  27. #26
    DAUDET78

    Re : Roue Codeuse et Programmation PIC

    Voila le résultat. Avec les signaux A_capteur et B_capteur, je teste les 16 cas de la machine d'état ( ce n'est pas facile de voir que c'est deux signaux en quadrature car j'ai rajouté du bruit sur les transition !)

    Le signal d'erreur au départ est normal. En effet, les deux signaux du capteur sont à "11" et la valeur mémorisée est "00"
    Images attachées Images attachées  
    J'aime pas le Grec

  28. #27
    Waldoo

    Re : Roue Codeuse et Programmation PIC

    Merci, je vais étudier ça de plus près.
    Mais le temps presse je dois finaliser une autre partie de mon projet avant de continuer sur la roue codeuse.

    Merci encore Daudet78

Discussions similaires

  1. Roue codeuse
    Par invite8763919d dans le forum Électronique
    Réponses: 3
    Dernier message: 10/03/2010, 08h56
  2. Roue codeuse
    Par invite244b0c93 dans le forum Électronique
    Réponses: 13
    Dernier message: 12/06/2009, 21h34
  3. Roue codeuse
    Par invite99e8052e dans le forum Électronique
    Réponses: 3
    Dernier message: 17/05/2008, 21h54
  4. Tension roue codeuse
    Par jorg1n dans le forum Électronique
    Réponses: 5
    Dernier message: 30/11/2007, 10h41
  5. Roue codeuse + Afficheur = ???
    Par invite8de48731 dans le forum Électronique
    Réponses: 36
    Dernier message: 16/06/2007, 17h56
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...