3.15. Commande de moteur à courant continu

Un moteur à courant continu à balais est une bobine de fil enroulée sur un arbre, placée dans un champ magnétique. Faites passer un courant dans la bobine et le champ exerce une force sur elle ; cette force devient un couple sur l’arbre. Des balais à l’intérieur du moteur inversent le sens du courant dans la bobine à mesure que l’arbre tourne, de sorte que le couple pousse toujours l’arbre dans le même sens. Appliquez une tension continue aux deux fils du moteur et l’arbre se met à tourner ; inversez la polarité et il tourne dans l’autre sens.

Les moteurs réclament généralement de quelques centaines de milliampères à plusieurs ampères, sous des tensions d’alimentation supérieures au rail logique 3,3 V de la caméra. Une broche GPIO peut fournir de l’ordre de 25 mA et ne peut pas inverser la polarité – elle ne peut piloter que ses deux rails. L’étage de puissance entre la caméra et le moteur doit acheminer le courant du moteur, router une alimentation moteur distincte à plus haute tension, et permettre à la caméra d’inverser la polarité sur commande. Le pont en H à quatre transistors est la réponse classique.

3.15.1. Le pont en H

Un pont en H est constitué de quatre interrupteurs disposés en H autour du moteur :

Un schéma de pont en H. Vmotor en haut se connecte à travers l'interrupteur S1 vers un nœud A à gauche, et à travers l'interrupteur S2 vers un nœud B à droite. Le moteur M est placé horizontalement entre A et B. Depuis A un autre interrupteur S3 descend vers la masse ; depuis B un autre interrupteur S4 descend vers la masse.

Le pont en H : quatre interrupteurs (S1S4) connectent le moteur M entre Vmotor et la masse.

Fermer différentes paires d’interrupteurs détermine ce que voit le moteur à ses bornes :

  • S1 + S4 fermés, S2 + S3 ouverts. Le courant circule de Vmotor à travers S1, dans A, traverse le moteur vers B, puis passe par S4 jusqu’à la masse. Le moteur tourne dans un sens.

  • S2 + S3 fermés, S1 + S4 ouverts. Le courant circule dans l’autre sens à travers le moteur. Le moteur tourne dans l’autre sens.

  • Les quatre ouverts. Les deux bornes du moteur sont flottantes ; le moteur tourne en roue libre.

  • S3 + S4 fermés (ou S1 + S2 fermés). Les deux bornes du moteur sont reliées au même rail ; l’énergie cinétique propre du moteur génère un courant que la paire fermée court-circuite en chaleur. Le moteur freine.

La combinaison interdite consiste à fermer les deux interrupteurs d’une même colonne – S1 + S3 ou S2 + S4 – ce qui crée un court-circuit direct de Vmotor à la masse. C’est le phénomène de shoot-through, et le code de la caméra ne doit jamais l’autoriser.

En pratique, les quatre interrupteurs sont des MOSFET (présentés sur la page Adaptation de niveau) intégrés dans un circuit de commande (driver IC). La puce expose deux ou trois broches d’entrée de niveau logique qui sont mappées en interne sur les quatre interrupteurs, et inclut une logique de verrouillage qui empêche le shoot-through, si bien que le code de la caméra n’a pas à le gérer directement.

3.15.2. La PWM et l’inductance du moteur

Régler la vitesse du moteur nécessite davantage que le tout-ou-rien. L’astuce est la même que celle employée pour les LED dans Gradation de LED par PWM : pulser la commande à haute fréquence et laisser la charge en faire la moyenne. Pour une LED, le moyenneur était l’œil ; pour un moteur, c’est la bobine elle-même.

Une bobine de moteur présente une inductance importante. Le courant traversant une inductance ne peut pas varier instantanément ; il varie à un taux proportionnel à la tension à ses bornes. Pulser le pont à 20 kHz fait monter le courant de la bobine durant chaque phase active, et durant la phase inactive le courant doit continuer à circuler – la bobine inverse la tension à ses bornes pour l’entretenir.

Sans nulle part où s’écouler, ce courant ferait grimper brutalement la tension aux bornes de l’interrupteur qui vient de s’ouvrir et pourrait endommager le transistor. Des diodes de roue libre placées en travers de chaque interrupteur – souvent simplement les diodes de structure (body diodes) propres aux MOSFET à l’intérieur de la puce de commande – offrent au courant le chemin dont il a besoin. Il circule à travers une diode et revient par l’un des interrupteurs encore fermés, bouclant une boucle de roue libre dans laquelle le courant décroît progressivement à travers les faibles résistances du pont et du moteur lui-même. La diode borne aussi la tension aux bornes de l’interrupteur ouvert à une chute de diode près du rail vers lequel la boucle revient, bien à l’intérieur de l’aire de sécurité de fonctionnement du MOSFET.

La moyenne du courant sur chaque période PWM est ce qui produit le couple, et cette moyenne suit linéairement le rapport cyclique – doubler le rapport cyclique double approximativement le couple, et à charge constante double approximativement la vitesse. Contrairement à la gradation des LED, où la réponse non linéaire de l’œil exige une courbe, un balayage linéaire de duty_u16 correspond déjà à un balayage linéaire de l’effort moteur.

La fréquence PWM doit seulement franchir deux seuils :

  • Au-dessus d’environ 20 kHz, la porteuse se situe hors de la bande audible par l’oreille humaine. En dessous, la force magnétique sur la bobine monte et descend à chaque impulsion PWM et les enroulements ainsi que les tôles vibrent physiquement à la fréquence de la porteuse – le moteur devient en pratique un petit haut-parleur émettant une tonalité à la hauteur de la PWM.

  • Bien au-dessus d’environ 50 kHz, les MOSFET et leurs drivers de grille commencent à perdre en efficacité à cause des pertes par commutation. Durant chaque transition marche-arrêt, le MOSFET supporte brièvement à la fois une tension significative et un courant significatif, dissipant une petite bouffée de puissance sous forme de chaleur ; la capacité de grille des MOSFET doit aussi être chargée et déchargée à chaque cycle, ce que la puce de commande paie. Ces deux coûts augmentent avec la fréquence PWM, de sorte qu’à haute cadence la chaleur due à la commutation peut rivaliser avec celle due à la conduction du courant moteur.

20 kHz est la valeur par défaut confortable pour les moteurs de taille hobby.

3.15.3. Piloter un pont en H

Une puce de commande de pont en H à deux entrées mappe IN1 et IN2 sur les quatre interrupteurs à peu près ainsi :

  • IN1 = 0, IN2 = 0 – roue libre (les quatre interrupteurs ouverts).

  • IN1 = 1, IN2 = 0 – piloter dans un sens.

  • IN1 = 0, IN2 = 1 – piloter dans l’autre sens.

  • IN1 = 1, IN2 = 1 – freiner.

Piloter les deux entrées en tant que sorties PWM permet à la caméra de fixer le sens en choisissant laquelle des deux broches porte le rapport cyclique, et la vitesse par la valeur du rapport cyclique elle-même :

import time
from machine import PWM, Pin

in1 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
in2 = PWM(Pin("P8"), freq=20_000, duty_u16=0)

def drive_a(speed):       # speed: 0..65535
    in1.duty_u16(speed)
    in2.duty_u16(0)

def drive_b(speed):
    in1.duty_u16(0)
    in2.duty_u16(speed)

def coast():
    in1.duty_u16(0)
    in2.duty_u16(0)

def brake():
    in1.duty_u16(65535)
    in2.duty_u16(65535)

drive_a(32768)    # half speed in direction A
time.sleep(2)
drive_b(16384)    # quarter speed in direction B
time.sleep(2)
coast()

Une rampe de l’arrêt jusqu’au maximum puis retour donne un démarrage et un arrêt en douceur :

for d in range(0, 65535, 256):
    in1.duty_u16(d)
    time.sleep_ms(10)
for d in range(65535, 0, -256):
    in1.duty_u16(d)
    time.sleep_ms(10)

3.15.4. Drivers à sens et vitesse

Une seconde famille de puces de pont en H expose une interface plus pratique : une entrée numérique de sens (souvent étiquetée DIR ou PH pour « phase ») plus une entrée de vitesse (souvent PWM ou EN pour « enable »). La broche de sens choisit dans quelle direction le pont pilote ; le rapport cyclique sur la broche de vitesse fixe le courant moyen.

Cela est plus facile à piloter depuis le logiciel que le schéma à deux entrées PWM. Les deux signaux correspondent à la façon dont le problème est habituellement formulé – « tourne par là, à cette vitesse » – de sorte que le code peut dire set_direction(forward); set_speed(50) au lieu de brancher entre in1 et in2. Un seul canal PWM est nécessaire, ce qui libère l’autre canal du même minuteur pour une tâche indépendante. Et la broche de sens peut rester en place entre les changements sans redéclencher le pont, de sorte que changer la vitesse à sens fixe ne touche qu’un seul registre.

import time
from machine import PWM, Pin

dir_pin = Pin("P8", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)

def drive(direction, speed_u16):
    dir_pin.value(direction)         # 0 or 1
    speed.duty_u16(speed_u16)        # 0..65535

drive(0, 32768)     # direction A at half speed
time.sleep(2)
drive(1, 16384)     # direction B at quarter speed
time.sleep(2)
speed.duty_u16(0)   # stop

Ce que « stop » fait réellement sur ce genre de driver – roue libre ou freinage – dépend de la puce. Avec un driver à deux entrées, le code de la caméra choisit (les deux entrées basses pour la roue libre, les deux hautes pour le freinage) ; avec un driver à sens et vitesse, c’est la puce qui décide, donc la fiche technique mérite un coup d’œil avant de se fier à l’un ou l’autre comportement.