1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

Pic 16F8xx Decodage codeur rotatif en quadrature

Discussion dans 'Electronique' créé par grandioso, 5 Février 2012.

  1. grandioso

    grandioso Ouvrier

    Messages:
    308
    Inscrit:
    23 Décembre 2008
    Localité:
    macon
    Pic 16F8xx Decodage codeur rotatif en quadrature
    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.
     
  2. Lnx2051

    Lnx2051 Apprenti

    Messages:
    208
    Inscrit:
    2 Août 2010
    Localité:
    Lyon
    Dernière édition par un modérateur: 16 Avril 2015
  3. grandioso

    grandioso Ouvrier

    Messages:
    308
    Inscrit:
    23 Décembre 2008
    Localité:
    macon
  4. coredump

    coredump Compagnon

    Messages:
    3 405
    Inscrit:
    8 Janvier 2007
    Localité:
    Côte d'azur
    Pic 16F8xx Decodage codeur rotatif en quadrature
    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.
     
  5. philvk75

    philvk75 Apprenti

    Messages:
    133
    Inscrit:
    14 Juin 2011
    Localité:
    Lognes
    Département:
    77185
    Dernière édition par un modérateur: 16 Avril 2015
  6. grandioso

    grandioso Ouvrier

    Messages:
    308
    Inscrit:
    23 Décembre 2008
    Localité:
    macon
    Pic 16F8xx Decodage codeur rotatif en quadrature
    -->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...
     
  7. philvk75

    philvk75 Apprenti

    Messages:
    133
    Inscrit:
    14 Juin 2011
    Localité:
    Lognes
    Département:
    77185
    Pic 16F8xx Decodage codeur rotatif en quadrature
    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
     
  8. coredump

    coredump Compagnon

    Messages:
    3 405
    Inscrit:
    8 Janvier 2007
    Localité:
    Côte d'azur
    Pic 16F8xx Decodage codeur rotatif en quadrature
    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...
     
  9. grandioso

    grandioso Ouvrier

    Messages:
    308
    Inscrit:
    23 Décembre 2008
    Localité:
    macon
    Pic 16F8xx Decodage codeur rotatif en quadrature
    ---->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.
     
  10. coredump

    coredump Compagnon

    Messages:
    3 405
    Inscrit:
    8 Janvier 2007
    Localité:
    Côte d'azur
  11. philvk75

    philvk75 Apprenti

    Messages:
    133
    Inscrit:
    14 Juin 2011
    Localité:
    Lognes
    Département:
    77185
  12. Itus

    Itus Compagnon

    Messages:
    503
    Inscrit:
    22 Décembre 2010
    Dernière édition par un modérateur: 16 Avril 2015
  13. grandioso

    grandioso Ouvrier

    Messages:
    308
    Inscrit:
    23 Décembre 2008
    Localité:
    macon
    Pic 16F8xx Decodage codeur rotatif en quadrature
    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.
     
  14. ctoutmoi

    ctoutmoi Ouvrier

    Messages:
    479
    Inscrit:
    15 Janvier 2008
    Localité:
    Cabries (A côté d'Aix en Provence...)
    Pic 16F8xx Decodage codeur rotatif en quadrature
    J'ai utilisé un encodeur avec bouton poussoir intégré avec un pic. Ce joint mon bout de code pour gérer l'encodeur.

    Code:
    void encodeur()
    {
        if  (~etat_detecte)
        {
             if (a>b)
             {
                  //sens_codeur = 1;
                  etat_detecte = 1;
                  b_low = 1;
             }
             if (b>a)
             {
                  //sens_codeur = 0;
                  etat_detecte = 1;
                  a_low = 1;
             }
        }
    if (etat_detecte)
    {
            if (b_low)
            {
                  if ((a=1) && (b=1))
                  {
                      etat_detecte = 0;
                      b_low = 0;
                      if (index_regle < max_regle)
                      {index_regle++;}
                      Delay_ms(50);
                  }
            }
            if (a_low)
            {
                  if ((a=1) && (b=1))
                  {
                      etat_detecte = 0;
                      a_low = 0;
                      if (index_regle > min_regle)
                      {index_regle--;}
                      Delay_ms(50);
                  }
            }
    
    }
    }
    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 :)
     
  15. NazzTazz

    NazzTazz Nouveau

    Messages:
    8
    Inscrit:
    30 Mai 2012
    Pic 16F8xx Decodage codeur rotatif en quadrature
    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.
     

Partager cette page