dimanche 1 juillet 2012

contrôle d'un servo-moteur avec PIC10F202

Dans cette chronique je montre comment contrôler un servo-moteur avec un PIC10F202 et 2 boutons momentanés. matériel requis:

  • 1 PIC10F202-I/P
  • 2 boutons momentanés
  • 1 servo-moteur

Montage

J'ai découvert un logiciel très intéressant et gratuit, ça s'appelle Fritzing. J'ai réalisé le plan de montage suivant avec ce logiciel. Il fait plus que ca, il permet aussi de réaliser le schéma électronique et le circuit imprimé.

Pour mon montage j'ai utilisé ce que j'avais en main, un Hitec HS-422 mais n'importe quel autre servo-moteur devrait faire l'affaire. Si vous ne connaissez pas les servo-moteurs lisez l'encadré à la fin de cette article.

Description du code MPASM

Vous pouvez télécharger le code assembleur ici ou vous référez au code source ci-bas.

Certains MCU possèdent des circuits PWM dédiés ce n'est pas le cas du PIC10F202. De plus il ne supporte pas les interruptions sur son TIMER. Il faut donc tout faire en code. Si on veut que le servo-moteur conserve sa position il est important de respecter la durée et la fréquence des impulsions. C'est ce qu'on appelle une application temps réel. Mais il faut aussi lire les 2 boutons sans altérer le timing de la tâche qui contrôle le servo-moteur. Pour régler ce problème j'ai décider de faire la lecture des boutons seulement dans l'intervalle de temps entre 2 impulsions. On dispose durant cette interval de près de 20 milli-secondes pour faire la lecture des boutons et modifier la variable servo_pos si requis. La logique de la boucle principale est la suivante:

  1. Envoyer un impulsion de contrôle au servo-moteur
  2. Faire une lecture des boutons
  3. Vérifier si un bouton est enfoncé et le cas échéant modifier la variable servo_pos
  4. Attendre la fin du cycle de 20 milli-secondes
  5. Retourner à 1

La variable 16 bits servo_pwm compte les micro-secondes. Le cycle du servo-moteur est de 20 000 micro-secondes. Donc lorsque ce compteur atteint 20 000 le cycle est terminé et on retourne au début (point 1). Comme on ne peut pas incrémenter le compteur servo_pwm par code il faut utiliser le TIMER0 qui est configuré pour incrémenter à chaque micro-seconde. A intervalle régulier on prend le contenu du TIMER0 et on l'additionne à la variable servo_pwm et on réinitialise le TIMER0. Notez qu'on ne réinitialise pas TIMER0 à la valeur 0 car il y a des cycles perdus pendant l'exécution de la macro add_timer. De plus lorsqu'on écris dans le registre TMR0 il y a 3 Tcy de perdu. En tenant compte de tout ça on initialise le TIMER0 à 5. La variable servo_pos contient la valeur de consigne et détermine donc la largeur de l'impulsion. Lorsque servo_pwm atteint cette valeur on termine l'impulsion et on sort de la routine servo_pulse, c'est la fin de l'étape 1. On appelle la routine read_buttons (étape 2). Cette routine utilise un compteur d'annulation de rebonds pour chaque bouton. Cette routine incrémente le compteur btnx_cntr à chaque fois qu'elle détecte qu'un bouton est enfoncé et décrémente le compteur lorsque il est relâché. Lorsque le cmpte atteint la valeur BTN_TRIGGER l'indicateur du bouton F_BTNx_ACT est mis à 1. La routine check_for_rotate (étape 3) vérifie les indicateurs booléens des boutons. Si F_BTN1_ACT est à 1 la variable servo_pos est diminuée de 8 micro-secondes. si l'indicateur F_BTN2_ACT et à 1 la variable servo_pos est augmentée de 8 micro-secondes. La routine servo_cycle_end (étape 4) attends simplement la fin du cycle, soit que le compteur servo_pwm atteigne la valeur 20 000 et on retourne au début (étape 5) pour commencer un nouveau cycle.

code source


Qu'est-ce qu'un servo-moteur

Un servo-moteur contrairement à un moteur électrique utilisé par exemple dans une perceuse ne tourne pas continuellement lorsqu'il est alimenté. Il tourne d'un certain angle défini par la consigne et s'arrête. Si la consigne est modifiée, il tourne pour atteindre la position de la nouvelle consigne. Les servo-moteurs sont utilisés couramment en radio-contrôle et en robotique lorsqu'on veut contrôler la position d'un élément mécanique. Par exemple pour faire pivoter les roues avant d'une voiture téléguidée. Lorsqu'on ouvre le boitier d'un servo-moteur on retrouve les éléments suivants:
  • un moteur électrique
  • un engrenage réducteur
  • un potentiomètre relié à l'axe qui sort du boitier
  • un circuit électronique
Cet ensemble d'éléments s'appelle un asservissement. Le potentiomètre fixé à l'axe qui sort du boitier sert à mesurer l'erreur entre la position actuel de l'axe et la consigne. Le moteur arrête de tourner lorsque cette erreur devient nulle. Il y a 3 fils qui sortent du boitier, rouge, noir et jaune (ou blanc). Les 2 premiers sont pour l'alimentation électrique comme pour n'importe quel autre moteur. Le jaune sert à envoyer au servo-moteur la consigne qui contrôle sa position. Cette consigne se présente sous la forme d'impulsions électriques d'une durée qui varie autour de 1500 micro-secondes et qui se répètent 50 fois par seconde. La position de l'axe de sortie du servo-moteur dépend de la largeur des impulsions. Par exemple pour le Hitec HS-422, la rotation totale est de 180 degrés. Le point milieu est obtenu avec des impulsions de 1500 micro-secondes. Si on diminue la largeur des impulsions le servo tourne dans le sens anti-horaire. Si on augmente la largeur des impulsions il tourne dans le sens horaire. L'image suivante qui est une capture d'oscilloscope montre les impulsions envoyées sur le fil jaune du servo-moteur.
Lorsqu'on utilise un servo-moteur il est important de ne pas dépasser les limites pour les consignes car si l'axe atteint une butée avant que l'erreur ne soit rendu à zéro le moteur va continuer à être alimenté mais comme il ne peut tourné il tire un courant maximun. Si le servo-moteur est alimenté par une pile, ca va la vider rapidement et ça peut aussi brisé le servo-moteur. C'est pour ça que dans mon code j'ai défini 2 constantes SERVO_MIN et SERVO_MAX. Même si un des boutons est gardé enfoncé la variable servo_pos ne sortira pas de ces limites. Pour en savoir plus sur les servo-moteur consultez l'article de wikipedia

Aucun commentaire:

Enregistrer un commentaire