Mesure de courant moteur instantané :
La méthode la plus courante consiste à mesurer la tension aux bornes d’une résistance de shunt placée en série avec le (driver) moteur.
On utilise une résistance de faible valeur pour limiter la chute de tension et sa propre dissipation thermique.
Comme la tension mesurée est faible, on utilise un amplificateur opérationnel. Et puisqu’on cherche à récupérer la mesure dans le logiciel, on passe ensuite dans un convertisseur analogique-numérique.
Une telle résistance est déjà en place pour le fonctionnement du limiteur de courant intégré au driver moteur DRV8872.
On va donc la réutiliser pour l’asservissement en courant. Sa valeur est fixée par la limite de courant du driver, on devra faire avec 0.33 Ohms !
Voici le schéma électrique simplifié pour la mesure de courant moteur :
Procédons au calcul de la tension U, en fonction du courant passant par le moteur, noté I.
R1 est traversée par le courant I venant du moteur.
Le réseau de résistances R2, R10, R11, raccordé au 3v3 et à la masse pourrait perturber la mesure.
• Le courant généré par le 3v3, passant par R10, R2 puis R1, est en fait négligeable par rapport à I, compte tenu des valeurs élevées des résistances R10 et R2.
• Le courant traversant le moteur, puis passant par R2 et R11 jusqu’à la masse est également négligeable par rapport à I, compte tenu des valeurs élevées de R2 et R11 par rapport à celle de R1.
Donc, on retiendra que la tension aux bornes de R1 ne dépend que de I. On obtient le schéma équivalent suivant :
J’ai utilisé une première fois le théorème de Thévenin pour simplifier une première partie du circuit.
J’ai utilisé une seconde fois le théorème de Thévenin pour simplifier le reste du circuit.
Seule la tension Ue’ nous intéresse dans cette dernière étape, puisque l’entrée de l’amplificateur opérationnel a une impédance très élevée.
La résistance équivalente Re’ n’engendre aucune chute de tension.
Inutile de développer tous les calculs. Traçons plutôt le graphe I (A) donne U (V) :
On constate que la tension à l’entrée de l’amplificateur opérationnel du STM32G4 est proportionnelle au courant moteur, dans une plage de 0.05 à 0.35V.
L’AOP intégré au STM32G4 peut etre configuré avec un gain de 8 (montage non inverseur). La niveau de tension ainsi augmenté, permettra une conversion analogique-numérique sur une plage de tension assez large avec une bonne résolution.
Avec un ADC sur 12 bits (0 à 3.3V), le courant I (A) donne la valeur ADC (0-4096) suivante :
On en déduit l’application afine suivante, en fonction du courant moteur I (A) :
AN : un courant moteur de I = 100mA devrait donner une valeur ADC de 1463.
Le calcul de la valeur de ‘a’ permet une première approximation. En pratique, elle pourra être ajustée par calibration manuelle de la carte électronique (mesure ampèremétrique).
Quant à la valeur de ‘b’, elle ne dépend pas du courant moteur. Le logiciel pourra la calibrer automatiquement en faisant une série de mesures, moteur à l’arrêt.
A ce stade, nous pouvons estimer le courant moteur à partir de la valeur retournée par l’ADC, dans une plage de courant assez large comprise entre -500mA et +1A.
Le courant moteur subit de fortes variations en fonctionnement, à cause notamment du pilotage du pont en H en PWM. Pour rendre inaudible le courant moteur, la fréquence du PWM est supérieure à 20kHz.
Le courant est :
- positif (1) lorsque le moteur est entrainé, dans un sens ou dans l’autre,
- nul (2) lorsque le frein est activé (brake)
- négatif (3) lorsque le moteur est en roue libre (coast).
La mesure de courant doit donc se faire lorsque le moteur est entrainé (courant positif).
A la cadence de 20kHz, il n'est pas souhaitable de déclencher la mesure ADC en logiciel.
Le STM32G4 dispose d’un mécanisme de TRIGGER matériel permettant notamment de déclencher l’acquisition d’un ADC par le TIMER en charge de la génération des signaux PWM, sans intervention du logiciel. Pour déclencher l’acquisition de l’ADC au meilleur moment, le TIMER doit être configuré en mode PWM ‘center-aligned’. Ce mode de fonctionnement permet d’ailleurs d’obtenir une période parfaitement constante des signaux PWM. Le TRIGGER s'active lorsque le compteur du TIMER atteint sa limite haute (overflow) et sa limite basse (underflow).
La conversion analogique-numérique est ansi déclenchée alternativement en milieu d’impulsion PWM, lorsque le courant moteur est positif, et entre deux impulsions lorsque le courant est nul ou négatif. Il est facile de filtrer les mesures nulles ou négatives, pour ne retenir que les mesures positives, permettant d’obtenir une estimation du courant dans le moteur lorsqu’il est entrainé.
Pour estimer le courant moyen dans le moteur sur une période, il faut tenir compte de la largeur d’impulsion Une approximation (trop) simple consiste à multiplier le courant instantané mesuré par le rapport cyclique PWM.
Passons à la réalité !
Lorsque le moteur est à l'arrêt, je mesure 'b' = 1205. C'est la valeur ADC lorsque le courant moteur est nul.
La petite déviation par rapport au calcul théorique doit être due à la valeur des résistances (tolérance 1%).
Pour mesurer 'a', je teste différentes valeurs de PWM, et pour chaque valeur je mesure le courant débité par mon alimentation de labo et la valeur ADC.
Je mesure 'a' ~ 2433.
C'est une très grosse déviation par rapport à mon calcul théorique. Je pense que ma méthode d'approximation du courant moyen à partir du courant instantané est trop imprécise.
Enfin, voici une comparaison entre le courant moyen estimé par ma carte électronique et mon algorithme, en phase DRIVE (jaune) et en phase COAST (bleu), par rapport au courant débité par mon alimentation de labo (auquel j'ai soustrait la consommation statique de ma carte ~30mA).
La marge d'erreur est de 10% en moyenne, avec une erreur maximale de 20% autours de 300mA.
C'est beaucoup, mais probablement pas rédhibitoire pour un asservissement.
A suivre...
Patrick.