Partage
  • Partager sur Facebook
  • Partager sur Twitter

encodeur de vitesse infrarouge

problème avec la fonction attachInterrupt

    23 décembre 2016 à 14:36:06

    bonjour, je souhaite asservir des moteurs CC avec une roue codeuse et un encodeur de vitesse. J'ai pour cela utilisé la fonction  "attachInterrupt" et le timer1 de  l'atmega 328 afin de ne rien mettre dans 'void loop' pour l'utiliser avec une autre partie de mon code plus tard. Le problème est que la fonction déclenché par 'attachInterrupt' doit incrémenter une variable ors elle le fait plusieurs fois.

      voici le programme que j'ai écrit pour arduino UNO:

    volatile int nbTG = 0;
    void nb(){
        nbTG++;
    }
    
    void setup() {
    Serial.begin(9600);
    
    noInterrupts();
      TCCR1A = 0;
      TCCR1B = 0;
      TCNT1  = 0;
    
      OCR1A = 62500;
      TCCR1B |= (1 << WGM12);
      TCCR1B |= (1 << CS12);
      TIMSK1 |= (1 << OCIE1A);
      interrupts();
    
      attachInterrupt(digitalPinToInterrupt(2), nb, RISING);
    
    }
    
    void loop() {
      }
    ISR(TIMER1_COMPA_vect){
        Serial.println(nbTG);
    }
    




    • Partager sur Facebook
    • Partager sur Twitter
      29 décembre 2016 à 23:41:40

      J'avoue ne pas trop comprendre là où tu veux en venir... c'est plutôt logique que la variable est incrémentée plusieurs fois non ?

      Elle le sera à chaque front montant (RISING) sur la pin 2.

      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2017 à 12:33:00

        Je voulais dire que  la variable s'incrémente plusieurs fois par "passage" de la led infrarouge dans un trou de la roue crantée.

        (désolé pour le temps de réponse)

        • Partager sur Facebook
        • Partager sur Twitter
          15 janvier 2017 à 19:23:05

          C'est probablement dû au fait que la surface du trou n'est pas extrêmement lisse.

          Du coup, avant que le signal se stabilise à HIGH sur un trou, il va bouger plusieurs fois et donc provoquer plusieurs front montant.

          Il faudrait mettre un petit temps d'attente dans le traitement de l'interruption de façon à ce que l'arduino ignore les autres fronts.

          Exemple :

          void nb() {
              volatile uint16_t tmp;
              nbTG++;
              for ( tmp = 200 ; tmp > 0 ; tmp-- ) { }
          }

          Le ciffre 200 est à ajuster pour que le temps d'attente soit plus ou moins long.

          • Partager sur Facebook
          • Partager sur Twitter

          encodeur de vitesse infrarouge

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown