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:
- Envoyer un impulsion de contrôle au servo-moteur
- Faire une lecture des boutons
- Vérifier si un bouton est enfoncé et le cas échéant modifier la variable servo_pos
- Attendre la fin du cycle de 20 milli-secondes
- 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 sourceQu'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:
|
Aucun commentaire:
Publier un commentaire
Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.