Ce que vous allez faire
Nous avons jusqu'à maintenant beaucoup travaillé sur des dispositifs
d'interface homme-machine et le moment est venu de s'intéresser aux
actionneurs. Vous connaissez déjà le servo et vous allez maintenant
piloter un moteur à courant continu à l'aide d'un signal PWM. A part
l'électronique de commande du moteur, vous maîtrisez donc déjà les
notions nécessaires.
Les consignes sont les suivantes :
A la mise sous tension, le moteur est arrêté.
Si vous tournez l'encodeur rotatif vers la droite, vous augmentez le rapport cyclique du signal PWM par pas de 5%.
Si vous tournez l'encodeur rotatif vers la gauche, vous diminuez le rapport cyclique du signal PWM par pas de 5%.
Un rapport cyclique de 0 correspond au moteur arrêté.
Un rapport cyclique positif correspond à une rotation du moteur dans le sens horaire.
Un rapport cyclique négatif correspond à une rotation du moteur dans le sens anti-horaire. Bien évidemment, vous utilisez la valeur absolue du rapport cyclique pour configurer le canal PWM.
Le module L9110S
Un moteur consomme au minimum des centaines de fois plus qu'un micro-contrôleur, il est donc hors de question de relier le moteur directement aux sorties du micro-contrôleur, il nous faut un circuit d'interface capable de fournir suffisamment de courant au moteur. C'est le rôle du module L9110S qui figure dans les pré-requis.
Le L9110 est un circuit intégré destiné au pilotage de petits moteurs à courant continu (2.5~12V, 800mA max.). Sa data sheet est ici. Ce circuit utilise un pont en H (H-bridge) qui permet de contrôler le sens de rotation du moteur. Le principe général en est le suivant :
Quand IA est au niveau logique haut et IB au niveau logique bas, Q2 et Q3 conduisent et le moteur tourne dans le sens anti-horaire. Quand IA est au niveau logique bas et IB au niveau logique haut, Q1 et Q4 conduisent et le moteur tourne dans le sens horaire.
Attention, ce principe est très simplifié, le L9110 intègre des dispositifs de protection en plus des 4 transistors MOSFET, mais l'important est de comprendre le principe, c'est tout.
La data sheet du L9110 contient une table de vérité sur la page 2, sous le titre "Logical relationship" et des chronogrammes pour en détailler le fonctionnement.
Le module L9110S se présente comme suit :
et son schéma est le suivant :
On voit qu'il y a deux L9110S indépendants, ce qui permet de commander deux moteurs à courant continu ou un moteur pas-à-pas, dont nous parlerons dans le cours suivant.
Détails pratiques
Nous avons déjà dit qu'un moteur consomme beaucoup de courant, il est donc hors de question de l'alimenter à partir de votre WCH-LinkE ! Nous allons donc utiliser l'alimentation MB102 incluse dans le kit breadboard des pré-requis, ainsi que son adaptateur secteur :


Faites en sorte que le cavalier de gauche sur la photo relie OUT1 avec 3.3V et que le cavalier de droite relie OUT2 avec 5V. Vous disposez ainsi d'une alimentation fournissant les 2 tensions, ce qui est pratique. Il ne vous reste qu'à l'insérer à cheval sur votre breadboard, à une extrémité.
L'alimentation étant prête, vous pouvez passer au câblage du moteur, du module L9110S, de l'alimentation, de l'encodeur rotatif et de la carte de développement selon le schéma suivant :
Le moteur est fourni sans fils de connexion.
Si vous n'avez pas de fil de câblage à souder sur les cosses du
moteur, vous pouvez utiliser les cordons DuPont-grip fil des
pré-requis, en mettant le grip fil sur la cosse du moteur et
l'autre extrémité dans le bornier du module L9110S.
J'ai fait en sorte que vous puissiez reprendre directement le code de gestion de l'encodeur rotatif déjà écrit ici.
TIM2 étant utilisé pour l'encodeur, vous utiliserez TIM1 pour contrôler le moteur :
PC3 = T1CH3 = L9110S IA
PC4 = T1CH4 = L9110S IB
Le principe de fonctionnement est simple : pour faire tourner le moteur dans le sens horaire, vous devez envoyer un signal PWM sur PC3 / T1CH3 et forcer PC4 à l'état bas. Pour le faire tourner dans le sens anti-horaire, c'est l'inverse : signal PWM sur PC4 / T1CH4 et forcer PC3 à l'état bas.
Pour éviter de reconfigurer le GPIO à chaque changement de direction (pour forcer une des 2 sorties à 0), vous pouvez utiliser la valeur 0x40 pour le membre TIM_OCMode de la structure TIM_OCInitTypeDef à la place de TIM_OCMode_PWM1 ou TIM_OCMode_PWM2. Ça a pour effet de forcer la sortie correspondante à 0. Voyez les valeurs 100 et 101 de OC2M[2:0] dans la section "10.4.7 Compare/Capture Control Register 1 (TIM1_CHCTLR1)" page 104 du manuel de référence du CH32V003. De même, la valeur 0x50 a pour effet de forcer la sortie à 1.
Enfin, vous choisirez une fréquence assez basse pour le signal PWM, par exemple 20 Hz, afin que le couple du moteur ne soit pas trop diminué par l'utilisation du PWM.
En effet, le principe de contrôle de la vitesse du moteur est le même que celui que nous avons utilisé pour contrôler l'intensité lumineuse d'une LED dans le cours sur le PWM, sauf que pour la LED, c'est la persistance rétinienne de votre œil qui établissait une moyenne d'intensité alors que pour le moteur, ce sont ses bobinages qui établissent une moyenne de courant. La différence est que votre œil est capable de suivre des variations plus rapides que le moteur. C'est pourquoi la fréquence du signal PWM de la LED devait être plus élevée que pour le moteur.
Une fois que tout fonctionnera, testez différents rapports cycliques et différentes fréquences du signal PWM pour voir l'influence sur la vitesse et le couple.