À l'aide d'un bouton rotatif avec AVR Micro contrôleur
Je vais avoir du mal à trouver un encodeur rotatif pour fonctionner correctement avec AVR micro-contrôleurs. L'encodeur est une mécanique ALPES de l'encodeur, et je suis en utilisant Atmega168.
Clarification
J'ai essayé d'utiliser une Interruption Externe pour écouter les broches, mais il semble que c'est trop lent. Lorsque la Broche de haute, l'interruption de la procédure commence et vérifie ensuite si la Broche B est élevé. L'idée est que si la Broche B est élevée, le moment Broche passe à l'état haut, il est contre-rotation dans le sens horaire. Si la Broche B est faible, alors qu'il est en rotation dans le sens horaire. Mais il semble que le RÉGULATEUR prend trop de temps à vérifier la Broche B, il est donc toujours lire aussi élevé.
J'ai aussi essayé de créer un programme qui bloque tout simplement jusqu'à ce que la Broche B ou la Broche de changements. Mais il se pourrait qu'il y est trop de bruit lorsque le codeur de rotation, parce que cela ne fonctionne pas non plus. Ma dernière tentative était d'avoir un timer qui stocke les 8 dernières valeurs dans une mémoire tampon et vérifie si elle va de faible à élevé. Cela ne fonctionne pas non plus.
J'ai essayé de portée de l'encodeur, et il semble qu'il utilise entre 2 et 4 ms à partir de la première Broche de change jusqu'à l'autre Pin changements.
Vous devez vous connecter pour publier un commentaire.
J'ai une page web sur encodeurs rotatifs et comment les utiliser, qui pourrait vous être utile.
Malheureusement sans plus d'informations, je ne peux pas résoudre votre problème particulier.
Qui les broches du microcontrôleur sont connectés à l'encodeur, et qu'est-ce que le code que vous utilisez actuellement pour décoder les impulsions?
Ok, vous avez affaire à quelques questions différentes, la première question est que c'est une mécanique du codeur, de sorte que vous avez à traiter avec le commutateur de bruit (bounce, chatter). Le fiche de données de indique qu'il peut prendre jusqu'à 3mS pour l'arrêt de toutes les pièces de rebondir et de créer de fausses sorties.
Vous avez besoin pour créer un anti-rebond de la routine. Le plus simple est de vérifier en permanence pour voir si A est élevé. Si elle le fait, démarrer une minuterie et vérifier de nouveau dans les 3 ms. Si elle est encore haute, ensuite, vous pouvez voir B - si elle n'est pas élevé, alors vous ignorer les fausses impulsions et de continuer la recherche d'Un haut. Lorsque vous cochez la case B, vous le regardez, démarrer une minuterie de 3 ms, et puis regarder B de nouveau. Si c'était le même les deux fois, alors vous pouvez utiliser cette valeur - en cas de changement dans les 3 ms, alors vous devez le faire à nouveau (lire B, attendre 3 ms, puis de le lire à nouveau et de voir si elle correspond).
L'atmega est assez rapide pour que vous ne devriez pas avoir à vous soucier de ces vérifications va lentement, sauf si vous êtes également l'exécution d'une lente vitesse de l'horloge.
Une fois que vous infligez avec les bruits mécaniques, alors vous voulez regarder un bon gris code routine - l'algorithme que vous êtes suivantes ne fonctionnent pas si vous aussi décrémenter si A est haut quand B passe au niveau bas. Généralement, les gens magasin de la dernière valeur de deux entrées, puis à les comparer à la nouvelle valeur de deux entrées et d'utiliser une petite fonction pour incrémenter ou décrémenter sur cette base. (Consultez la rubrique "à haute résolution de la lecture", sur le site je l'ai mentionné ci-dessus de la table). Je combine les deux lectures en une à quatre du nombre de bits et d'utiliser un simple tableau de me dire si j'ai d'incrémenter ou de décrémenter le compteur, mais il y a des solutions qui sont plus avancés, et de l'optimiser pour la taille du code, de la vitesse, ou la facilité de maintenance du code.
L'ajout d'un filtre passe-bas analogique améliore considérablement le signal. Avec le filtre passe-bas, le code de l'AVR est vraiment simple.
Ah, les merveilles de l'art ASCII :p
Voici le programme du RÉGULATEUR. Se connecter A et B du PORTB en entrée du régulateur:
Ce code fonctionne, sauf si vous faites pivoter le codeur vraiment rapide. Ensuite, il pourrait manquer une étape ou deux, mais ce n'est pas important, tant que la personne à l'aide de l'encodeur ne sais pas combien d'étapes qu'ils ont tourné.
Vitesse ne devrait pas être un problème. La plupart du temps tous les interrupteurs mécaniques besoin d'antirebond de routines. Si tu veux le faire avec des interruptions éteindre l'interrompre quand il déclenche, démarrer une minuterie qui va la retourner sur le dos après une couple de ms. Garder votre programme de bureaux de libre - >:)
Exactement ce que vous rencontrez des problèmes avec? Je suppose que vous avez été en mesure de brancher les broches de l'encodeur de votre PIC selon les spécifications techniques liées à la Farnell page, vous a donné, est donc le problème avec la lecture des données? N'avez-vous pas obtenir de données à partir du codeur? Ne savez-vous pas comment interpréter les données que vous obtenez de retour?