Dans quelle mesure puis-je obtenir Arduino en utilisant des encodeurs rotatifs?

15

Les moteurs pas à pas sont souvent chers pour un gros moteur. Cependant, avec un puissant moteur à courant continu standard et un codeur rotatif, vous pouvez «simuler» un moteur pas à pas. Quelle est la précision des encodeurs rotatifs avec Arduino juste avec une boucle de base et pas beaucoup d'autres codes? Va-t-il "manquer une impulsion" et ne pas enregistrer suffisamment de rotation souvent? Comment puis-je gérer cela avec beaucoup plus de code? Y a-t-il une meilleure manière de faire cela? Les interruptions seraient-elles utiles? Existe-t-il une sorte de circuit qui pourrait résoudre ce problème?

Remarque: Il ne dépassera probablement pas 4 rotations par seconde ... (Cela peut être beaucoup mais si vous faites un mécanisme de type vis sans fin qui ne serait que de 24 pouces par minute s'il y a 10 rotations par pouce de mouvement linéaire. )

Pingouin anonyme
la source
J'ai utilisé des encodeurs rotatifs qui refusaient de fonctionner correctement lorsqu'ils tournaient rapidement. Je suppose que cela varie avec le prix.
jippie

Réponses:

10

Les interruptions sont ce que vous utiliseriez dans cette situation.

Les taux que vous avez mentionnés sont suffisamment lents pour que vous puissiez probablement les compter à l'intérieur d'une boucle, mais ce n'est pas recommandé, car une boucle typique prendra de nombreux cycles d'horloge et dépend du nombre d'instuctiuons par boucle. , vous pourriez manquer certains comptes.

Des interruptions sont effectuées à cet effet, car elles peuvent être déclenchées à tout moment, quel que soit l'état de la boucle.

Il existe une fonction nommée attachInterrupt()qui prendra trois arguments.

  1. Broche d'interruption
  2. Routine de service d'interruption
  3. Mode

Voici un exemple de comptage d'une interruption

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Les modes sont les suivants:

FAIBLE, CHANGEMENT, HAUSSE, CHUTE

Vous trouverez plus d'informations sur l'utilisation des interruptions ici .

Selon l'encodeur que vous utilisez, vous devrez adapter le code à vos besoins et effectuer d'autres calculs pour déterminer votre position, mais cela devrait être un bon point de départ.

Modifier Voici un exemple de code d'Arduino Sandbox pour l'utilisation d'un encodeur rotatif.

Matt Clark
la source
1
Un détecteur de bord entraîné par interruption sur un Duemilanove gère facilement 100 bords par seconde (6500 tr / min sur un moteur).
Wayfaring Stranger
@WayfaringStranger Il n'y a donc pas de problème sur Uno, alors. Merci!
Pingouin anonyme
1
@AnnonomusPerson - Combien de travail êtes-vous prêt à investir? Si vous allez nu ( ISR_NAKED()), vous pouvez ignorer l'enregistrement automatique du contexte C et retirer les taux d'interruption 100-500 Khz sans problème, mais vous écrivez essentiellement l'assemblage en C à ce stade.
Connor Wolf
1
Si vous voulez un document complètement banane sur l'optimisation de la merde absolue de la réponse d'interruption, regardez ici . Placer du code directement dans la table d'interruption pour réduire encore la latence d'interruption!
Connor Wolf
1
Notez également que si vous optez pour des interruptions à faible latence, la fonction arduino attachInterrupt injecte une surcharge supplémentaire d'appel de fonction par rapport à l'utilisation ISR()directe de l'interruption .
Connor Wolf
3

Ajout de quelques références à des bibliothèques et des exemples déjà écrits, pour permettre la comparaison entre différentes approches et expériences avec la vitesse par rapport à la sensibilité aux étapes manquantes.

Lecture des encodeurs rotatifs: http://playground.arduino.cc/Main/RotaryEncoders

Encodeur en quadrature trop rapide pour Arduino (avec solution): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Bibliothèque Teensy Encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html

Lecture de l'encodeur rotatif sur Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

gwideman
la source