lundi 16 juillet 2018

Contrôle d'un servomoteur avec MPLAB Xpress Evaluation Board


Je continue ma série de tutoriels concernant la programmation de la carte MPLAB Xpress Evaluation Board de Microchip, tout en vous rappelant que ces tutos sont facilement utilisables avec d'autres microcontrôleurs PIC.  Au programme aujourd'hui: le contrôle d'un servomoteur.



Servomoteur et PWM

Pour contrôler la position angulaire d'un servomoteur, vous devez le soumettre à un signal modulé en largeur d'impulsion (PWM) dont la fréquence est typiquement de 50 Hz (période de 20 ms). Le servomoteur occupe la position centrale pour une impulsion d'une durée d'environ 1,5 ms, alors que les deux positions extrêmes sont atteintes pour une impulsion de 1 ms (dans une direction) ou 2 ms (dans l'autre direction).

Ceci étant dit, il semble bien établi qu'il n'est pas obligatoire que la fréquence du signal soit de 50 Hz: la plupart des servomoteurs fonctionnent très bien pour une plage de fréquences assez large. De plus, les valeurs de 1 ms et 2 ms ne sont qu'approximatives et varient d'un servomoteur à l'autre.

Pour ce tuto, je vais malgré tout respecter la fréquence de 50 Hz (période de 20 ms),  cette valeur étant confirmée dans la fiche technique du servomoteur que j'ai utilisé, soit le modèle Tower Pro SG90.

Circuit

Le circuit est donc constitué de la carte MPLAB XPress Evaluation Board et d'un petit servomoteur branché à sa propre alimentation continue de 5 V.  Ce servomoteur sera contrôlé par la sortie RA0 (vous pouvez évidemment choisir une autre sortie de la carte et en tenir compte dans les réglages décrits plus loin dans ce billet).



Remarquez qu'un servomoteur de faible puissance peut très bien être alimenté par la sortie 5 V de votre carte; l'alimentation externe devient nécessaire si vous avez plusieurs servomoteurs sur la même carte, ou si vous utilisez un servomoteur plus gourmand en puissance.

Réglages dans MPLAB Xpress Code Configurator

Après avoir créé un nouveau projet vierge dans MPLAB Xpress, nous ouvrons MPLAB Xpress Code Configurator (si vous n'êtes pas familier avec ces outils, ce serait une bonne idée de consulter d'abord ce billet).

Je crois n'avoir rien changé concernant l'oscillateur, dans la fenêtre "System Module", mais je partage quand même son contenu, au cas où il ne s'agirait pas des valeurs par défaut.


Lorsqu'on veut utiliser un module PWM, il faut obligatoirement l'associer à un timer (2, 4 ou 6). Dans la fenêtre "Device Resources", nous cliquons deux fois sur TMR4.


Nous avons quelques modification à apporter dans les paramètres du timer numéro 4:

  • Assurez-vous que "Enable Timer" est bien coché (il devrait déjà l'être par défaut).
  • "Clock Source" doit être réglé à FOSC/4.  
  • "Prescaler" doit être réglé à 1:32 (afin qu'une période de 20 ms soit possible)
  • Vous remplacez la valeur qui se trouve dans "Timer Period" par 20 ms.

Assurez-vous ensuite que "Actual Period" affiche environ 20 ms (19.928 ms pour être précis).

Ajoutons maintenant un module PWM, en cliquant deux fois sur PWM6 dans la fenêtre "Device Resources":

On associe PWM6 au Timer4 ("Select a Timer") et on s'assure que l'option "Enable PWM" est cochée.  La valeur du "Duty Cycle" peut être réglée à une valeur située entre 5% et 10%  (entre 1 ms et 2 ms, donc)


Remarquez les informations situées au bas de la fenêtre: la période PWM est bien de 20 ms, la fréquence PWM est de 50 Hz, et la résolution PWM est de 9 bits.

Il ne reste plus qu'à indiquer à quelle sortie de la carte ce signal PWM sera acheminé. J'ai choisi le port A0, puisque le servomoteur est branché à la sortie RA0.


Pour terminer avec MPLAB XPress Code Configurator, on clique sur le bouton "Generate" dans la zone "Project Resources", afin que les fichiers appropriés soit ajoutés dans notre projet MPLAB Xpress récemment créé.


Script

Voici un script qui place le servomoteur à sa position minimale, attend une seconde, le place à sa position médiane, attend une seconde, le place à la position maximale, attend une seconde...

Attention: les valeurs utilisées comme argument pour PWM6_LoadDutyValue() sont celles qui correspondent le mieux au servomoteur que j'ai utilisé pour mes tests, et il sera probablement approprié de les modifier pour utilisation avec un autre servomoteur.

Si j'ai bien compris, la valeur maximale de l'argument de PWM6_LoadDutyValue() dépend de la résolution de notre signal PWM. À la fréquence de 50 Hz, cette résolution est de 9 bits, donc la valeur maximale est de 29 = 512.

La valeur médiane devrait être atteinte pour un temps de 1,5 ms correspondant à un rapport cyclique de 7,5%, donc 38; toutefois, mon servomoteur était mieux centré avec une valeur de 50.


Vidéo

Pour terminer: un courte vidéo du résultat.



Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire