PMPedro Masi Burgos
← Projets

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
Diagramme de blocs de la plante électromécanique complète pour l'articulation robotique PMSM

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.
Bras robotique élémentaire à un degré de liberté considéré pour l'application
Le bras robotique dont nous commandons l'articulation.

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).

Diagramme de blocs du sous-système électromagnétique PMSM
Diagramme de blocs du sous-système électromagnétique avec transformée de Park.

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.

Carte des pôles en boucle ouverte du système linéarisé
Analyse de stabilité à partir de la carte des pôles en boucle ouverte.
Position et vitesse du rotor en boucle ouverte, modèle non linéaire contre modèle LTI augmenté
Réponse en boucle ouverte à une impulsion de tension et à deux impulsions de couple de charge : les modèles non linéaire et linéaire se superposent.

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.

Couple maximal, courants optimaux, utilisation du courant et puissance mécanique en fonction de la vitesse
Enveloppe du moteur : couple constant jusqu'à la vitesse de base, puis affaiblissement de champ.

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.

Architecture de commande de mouvement en cascade
Boucle de mouvement externe, modulateur de couple et commande de courant interne.

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.

Accélération angulaire avec le profil trapézoïdal et avec le profil lissé
Accélération angulaire : profil trapézoïdal (à gauche) contre le profil lissé (à droite). Notez les échelles verticales : 10⁵ contre environ 250 rad/s².
Courants triphasés avec le profil trapézoïdal, avec des pics de dizaines d'ampères
Courants de phase avec le profil trapézoïdal : pics de dizaines d'ampères.
Courants triphasés avec le profil de degré cinq, sous 0,5 A
Courants de phase avec le profil de degré cinq : sous 0,5 A.

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.

Température du stator sur des cycles répétés sans charge et avec 1,5 kg, et la limite thermique
Température du stator sur des cycles répétés à 20 °C ambiants ; la ligne pointillée est la limite thermique.

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.

Suivi avec un modulateur de tension lent : la réponse oscille et ne suit pas la consigne
Modulateur de tension lent : le système ne suit pas la consigne.
Suivi avec le modulateur de tension à 7000 rad/s : la réponse suit la consigne
Modulateur à 7000 rad/s : les consignes sont suivies.

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.

Suivi de la position et de la vitesse angulaires en boucle fermée
Suivi de consigne du système final en boucle fermée.
Réponse en vitesse sous perturbation de charge
Réponse en vitesse sous la perturbation de couple de charge.

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.