Page Personnelle de Vincent Kerhoas
Vincent Kerhoas
Enseignant du Supérieur
Professeur Agrégé
Page Personnelle de Vincent Kerhoas

Asservissement en vitesse d’un Moteur à Courant Continu

Back                  << Index >>

PROJET SOURCE



WORKSPACE_F411_MCC

REMARQUE : cf tuto STM32CUBEIDE


Multitache dans le microcontrôleur STM32F411

Le RTOS FreeRTOS est utilisé pour gérer la synchronisation les tâches :


Vérification de la période d’Echantillonnage

Tout ce qui est vérifiable doit être vérifié.
Une manière simple de tester la période d’échantillonnage est de piloter une sortie GPIO :

main.c

On observe alors à l’oscilloscope la broche PC0 :

PC0 se met bien à 1 toutes les ms

Ce test simple permet également de vérifier si on a suffisamment de temps pour effectuer les calculs à chaque période d’échantillonnage.


Identification du système en boucle ouverte

main.c

à l’issue de la mise en rotation du moteur, je mets le programme en pause, et j’observe le tableau tab_speed :

Je copie-colle alors ces données dans un tableur, afin de tracer la courbe vitesse=f(t) :

On note une vitesse en régime permanent d’environ 3000 tr/min, correspondant à une variation de rapport cyclique de 50 ( pour rappel, 100 étant l’état de repos, si j’applique 150, j’ai bien une variation de 50 par rapport à l’état de repos ).

Le gain de notre système est donc \( G=\frac{3000}{50}=60 \)

63% du régime permanent correspond à la vitesse 0.63*3000=1890.

Sachant que j’ai un point à chaque ms ( période d’échantillonnage ou d’acquisition ); j’atteins les 63% du régime permanent à t=53ms. Cela correspond à la constante de temps \( \tau \) du système en boucle ouverte.

REMARQUE : Pour qu’un asservissement soit fonctionnel, il faut un minimum de 10 points dans le régime transitoire. Le choix de la période d’échantillonnage doit donc tenir compte de la constante de temps du système à asservir.

\( FTBO(s)=\frac{G}{1+\tau .s} \)
avec G=60, \(\tau=53ms \)

REMARQUE : Le système est en réalité un système du 2ème ordre ; nous avons donc ici négligé la constante de temps la plus rapide (constante de temps électrique).
Cela n’est pas gênant et simplifie les calculs de correcteur.


Réglage d’un Correcteur PI

Dimensionnement du correcteur

cf Réglage d’un Correcteur PI

Etant donné la constante de temps, nous fixons Ti

\( \tau=53ms \rightarrow T_i = 0.1*\tau \)

Pour un correcteur numérique (discrétisation) :
Période d’échantillonage : \( T_e=1ms –> K_i=\frac{T_e}{T_i} \)

Pour \( Kp=0.01 \)

La marge de phase semble satisfaisante (au moins 40°) :

En théorie, la réponse en boucle fermée corrigée devrait ressembler à cela :

Test sur cible

La variation du rapport cyclique résulte désormais d’un calcul.
Je propose dans ce qui suit une consigne de 1000 tr/min.
Afin d’éviter les problèmes de saturation ( variation de commande au delà de l’intervalle [-100 100] ), il est important de mesurer au passage la commande.

main.c

Je relève à nouveau tab_speed et tab_cmd, afin de faire un tracé grâce au tableur :

REMARQUE : On pourra noter au passage une bonne prédiction de la simulation.


Utilisation de l’outil de tracé

Je considère désormais que la consigne est un signal carré ( pulse ) mis à jour dans la callback d’interruption du timer 5.

l’amplitude de pulse correspond à la valeur mesurée au niveau du potentiomètre ( on utilise la voie 0 de l’ADC ).

main.c

La tache print_task permet d’envoyer les données mesurées sur la liaison RS232 :

main.c

Lançons le programme python RTScope.py disponible dans l’archive : RTScope.zip :


Back                  << Index >>