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. )
la source
Réponses:
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.Voici un exemple de comptage d'une interruption
Les modes sont les suivants:
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.
la source
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.ISR()
directe de l'interruption .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/
la source