Conception de commande vectorielle pour moteur PMSM
Étude sous Simulink d'une articulation de bras robotique entraînée par un moteur synchrone à aimants permanents : modèles non linéaire et linéarisés, commande vectorielle en cascade avec modulateur de couple et observateur, vérification des limites réelles des composants, capteurs et onduleur non idéaux, et contrôleur discrétisé programmé sous MATLAB.
Projet intégrateur académique d'Automatique et Machines électriques (UNCuyo, 2025), réalisé en binôme.
- MATLAB/Simulink
- Python
- Park/Clarke (qd0)
- Vector control
- PID
- State observer
- Tustin discretisation

Le problème et le plan
L'objectif est de commander la position de l'axe horizontal d'une articulation d'un bras robotique élémentaire. L'articulation se comporte comme un pendule rigide sous gravité, entraîné par un moteur synchrone triphasé à aimants permanents (PMSM) alimenté par un onduleur triphasé, à travers un réducteur planétaire 120:1. Elle a un codeur sur l'arbre moteur, trois capteurs de courant de phase et un capteur de température du stator, et la charge au bout du bras peut aller jusqu'à 1,5 kg. Tout est fait en simulation avec MATLAB/Simulink ; il n'y a pas de matériel.
Nous avons suivi cet ordre :
- Modéliser la physique : mécanique, électromagnétisme et chaleur.
- Linéariser le modèle et analyser stabilité, observabilité et commandabilité.
- Simuler la boucle ouverte et trouver les limites de fonctionnement du moteur.
- Concevoir le contrôleur : modulateur de couple, boucle de mouvement PID et observateur.
- Vérifier par rapport aux limites réelles des composants et corriger ce qui ne passe pas.
- Remplacer les capteurs et l'onduleur idéaux par des modèles réalistes.
- Discrétiser le contrôleur et le programmer sous forme de code.

Modèle physique
Nous avons construit la plante sous Simulink à partir de trois sous-systèmes couplés :
- Mécanique : le pendule avec son couple de gravité et une charge variable, le réducteur et le rotor, le tout ramené à l'arbre du rotor comme une inertie et un frottement équivalents.
- Électromagnétisme : un PMSM à pôles saillants (Ld différent de Lq) écrit en axes tournants qd0 grâce à la transformée de Park. Dans ces axes le couple dépend des courants q et d, et les trois grandeurs de phase deviennent deux.
- Chaleur : un modèle du stator du premier ordre avec pertes cuivre (effet Joule), où la résistance statorique augmente avec la température.
À ce stade, l'onduleur et les capteurs sont idéaux (gain unitaire). Les limites des composants viennent du guide du cours : sortie du réducteur de 17 Nm en continu et 45 Nm en pointe, courant statorique de 0,57 A en continu et 2,83 A en pointe, et un onduleur jusqu'à 48 V de tension de ligne (le moteur en accepte 30).

Linéarisation et analyse
La plante est non linéaire ; nous avons donc dérivé des versions linéaires pour concevoir :
- Linéarisation jacobienne autour d'un point de fonctionnement lentement variable, qui donne un modèle LPV (LTI si le point est fixe).
- Linéarisation par retour d'état non linéaire : forcer le courant de l'axe d à zéro et traiter la température comme lente fait que le moteur se comporte comme une machine à courant continu à excitation séparée. Nous l'appelons le modèle LTI augmenté.
En boucle ouverte, les deux modèles sont pratiquement identiques. Le système est stable et sous-amorti : plus de charge abaisse la fréquence naturelle et augmente l'amortissement, et une température plus élevée déplace les pôles plus à gauche. Les tests de Kalman disent qu'il est commandable et observable depuis la mesure de position, mais pas depuis la vitesse seule, ce qui explique pourquoi le contrôleur a besoin du capteur de position pour estimer la vitesse.


Simulations en boucle ouverte et limites du moteur
Nous avons excité le modèle non linéaire avec une impulsion de tension et une double impulsion de couple de charge, et vérifié les états internes : vitesse, courants, tensions et température. Une impulsion de tension sur l'axe d a montré les effets de renforcement et d'affaiblissement de champ : elle modifie les pics de couple et les tensions que l'onduleur doit fournir.
Avec les limites de courant et de tension, nous avons ensuite tracé l'enveloppe du moteur. Le couple maximal est d'environ 0,041 N·m jusqu'à une vitesse de base d'environ 4790 tr/min. Au-delà, le courant d doit devenir négatif (affaiblissement de champ) pour que la tension ne sature pas, et le couple chute jusqu'à la limite de vitesse d'environ 6370 tr/min, sous les 6600 tr/min nominaux. La puissance mécanique maximale est d'environ 20 W. Autre constat : pour des charges supérieures à 0,5 kg, le couple de gravité au moteur dépasse ce que permet la limite de courant continu, donc couvrir toute la plage de charges demanderait un rapport de réduction plus grand ou un moteur plus fort.

Conception du contrôleur
Une cascade avec une boucle interne rapide pour le courant et le couple et une boucle externe plus lente pour la position et la vitesse :
- Modulateur de couple (interne). Il annule d'abord les rétroactions naturelles du moteur, de sorte que chaque dérivée de courant dépende directement d'une tension virtuelle. Nous avons vérifié que cela ne marche que si la résistance statorique suit sa température : avec une résistance fixe, la proportionnalité se perd. Ensuite, une boucle de courant proportionnelle par axe, qui agit comme une résistance virtuelle, place les pôles à −5000 rad/s (environ 800 Hz). Enfin, la consigne de couple devient un courant q, en compensant par retour non linéaire le frottement visqueux et le couple de gravité. La consigne de courant d reste à zéro sauf si l'on veut un affaiblissement de champ.
- Boucle de mouvement (externe) : un PID qui transforme les erreurs de position et de vitesse en consigne de couple. Nous avons placé ses pôles avec un polynôme désiré (amortissement 0,75, fréquence naturelle 800 rad/s) avec l'inertie nominale, et vérifié leur déplacement avec la charge : un bras plus lourd est plus lent mais toujours stable. L'action intégrale donne une erreur nulle en régime permanent et rejette totalement une charge constante.
- Observateur : un observateur d'ordre réduit estime position et vitesse à partir du codeur, avec des pôles à −3200 rad/s. Sous un couple de charge constant, il laissait une erreur permanente ; nous avons donc ajouté un terme intégral qui estime aussi le couple de charge. Il suit exactement les charges constantes mais pas les charges sinusoïdales, qui demanderaient un modèle interne.
Quelques scripts Python reproduisent les cartes de pôles et calculent les gains du PID.

Vérification des limites : le profil de mouvement
Nous avons d'abord piloté l'articulation avec un profil de position trapézoïdal. Il suivait bien, mais les changements brusques de pente créent des échelons de vitesse, et la vérification des limites des composants a échoué nettement : les pics d'accélération atteignaient environ 2,5×10⁵ rad/s², le courant statorique culminait à environ 66 A pour 2,83 A admis, la tension de phase à environ 2300 V pour 24 V, le couple du réducteur à environ 170 N·m pour 45 N·m, et le stator chauffait à chaque pic.
Au lieu de détuner le contrôleur, nous avons changé la référence. Un profil polynomial de degré cinq (de repos à repos, 5 s par mouvement, un tour complet et retour) arrondit les coins en position et en vitesse. Les pics d'accélération tombent à environ 250 rad/s², les courants restent sous 0,5 A, les tensions autour de 14 V, le couple du réducteur est dans ses limites et le stator chauffe à peine.



Vérification thermique
Nous avons répété le cycle de mouvement en continu (20 s par cycle, avec un échelon de couple de charge de 5 N·m entre 8 s et 12 s) sans charge et avec la charge maximale, et observé la température du stator. À 20 °C ambiants, les deux restent sous la limite thermique, mais avec 1,5 kg la température s'en approche beaucoup : une température ambiante plus élevée la dépasserait. La charge maximale transportable en cycle sans dépasser la limite est de 1,5 kg à 20 °C, 1,45 kg à 25 °C, 1,4 kg à 30 °C, 1,3 kg à 35 °C et 1,2 kg à 40 °C. Dans une installation réelle, cela demanderait un refroidissement ou une ventilation.

Capteurs et onduleur non idéaux
Jusqu'ici, capteurs et onduleur étaient parfaits. Nous les avons modélisés comme des filtres passe-bas (second ordre pour les capteurs de position et de courant et pour le modulateur de tension, premier ordre pour le capteur de température), et ajouté une saturation au modulateur à ses limites de tension.
Avec des composants lents, le système cassait. Avec les premiers paramètres de capteurs, la simulation divergeait après 0,03 s, et avec un modulateur de tension lent le système ne suivait plus les consignes : le modulateur tournait saturé et le contrôleur demandait des tensions impossibles. Passer la bande passante du modulateur à 7000 rad/s a réglé le problème. Quand tous les éléments non idéaux étaient actifs ensemble, il a fallu monter encore : capteur de position 12000 rad/s, capteur de courant 20000 rad/s et modulateur de tension 24000 rad/s, avec un capteur de température de 1 s. La leçon est qu'une boucle interne à 5000 rad/s demande des capteurs et un onduleur bien plus rapides, et le rapport en tire des spécifications minimales pour les composants réels.


Discrétisation et contrôleur programmé
Pour nous rapprocher d'une vraie implémentation, nous avons discrétisé le contrôleur avec la méthode de Tustin, qui transforme chaque intégrateur en somme trapézoïdale. La période d'échantillonnage vient de la boucle la plus rapide, la boucle de courant à 5000 rad/s (environ 800 Hz) : la règle de 10 à 20 fois donne un minimum d'environ 84 µs, et nous avons utilisé 10 µs. Des bloqueurs d'ordre zéro ont été ajoutés aux signaux des capteurs et aux sorties du contrôleur. Le suivi, les limites et la température restent aussi bons qu'avant, et un zoom sur la position mesurée montre les marches dues à l'échantillonnage.
Ensuite, nous avons remplacé tous les diagrammes de blocs du contrôleur par un seul bloc fonction MATLAB qui contient tout le contrôleur : observateur, PID avec anti-windup, modulateur de couple, boucles de courant, découplage et transformée de Park inverse, avec l'état conservé entre les appels. Les courbes sont les mêmes qu'avec le diagramme de blocs.
Résultats
Le système final, avec capteurs et onduleur non idéaux, un contrôleur discrétisé et le profil de degré cinq, suit les consignes de position et de vitesse et reste dans les limites de tension, de courant et de couple des composants. Dans l'essai de perturbation, un échelon de couple de charge de 5 N·m est appliqué entre 8 s et 12 s, sans charge et avec 1,5 kg : l'écart de position est presque imperceptible et la vitesse montre de courtes oscillations. Avec des capteurs idéaux, les plus grandes erreurs d'estimation de l'observateur sont d'environ 1,2×10⁻⁴ rad en position et 0,75 rad/s en vitesse.


Limites et suite
- Tout est simulation : il n'y a pas de matériel, l'onduleur est un modèle moyenné et les capteurs sont des filtres ; le comportement réel pourrait donc différer.
- L'entraînement ne peut pas couvrir toute la plage de charges de 0 à 1,5 kg en service continu sans dépasser la limite de courant, et à température ambiante élevée la charge doit être réduite.
- L'estimation du couple de charge est exacte pour des charges constantes mais pas pour des charges sinusoïdales.
- Suite : inclure dès la première étape de modélisation la dynamique réelle des capteurs et actionneurs choisis, et tester le contrôleur programmé sur un microcontrôleur en hardware-in-the-loop.