jeudi 2 juillet 2020

INA138 et MAX4372 : Current Monitoring



INA138 et MAX4372

Current Monitoring


Nous allons aujourd'hui mettre en œuvre L'INA138 et le MAX4372, deux amplificateurs de courant.

Ces composants permettent d'amplifier la tension présente aux bornes d'un shunt de mesure afin d'envoyer une tension mesurable sur l'entrée analogique d'un microcontrôleur.

La sortie de l'INA138 est un générateur de courant. Le gain est donc réglable à l'aide d'une simple résistance.

La sortie du MAX4372 est un générateur de tension. Le gain est fixe et dépend du modèle :

  • MAX4372T : 20
  • MAX4372F : 50
  • MAX4372H : 100

La première question que l'on peut se poser : pourquoi utiliser un amplificateur analogique alors que des modèles numériques existent ? :

  • INA219 (12 bits)
  • INA226 (16 bits)

Ces composants nous apporteraient une précision supérieure, mais ils ont un inconvénient majeur : leur temps de conversion est élevé, 140µS au minimum. Si l'on désire s'affranchir du bruit il est même recommandé d'adopter un temps de conversion supérieur : 1.1ms ou 8.244ms.

Deuxièmement le dialogue se fait en I2C, ce qui n'améliore pas les choses.

Bref le handicap est important si l'on a des variations de courant rapides à observer.

Petit avantage supplémentaire pour l'INA 138 : il consomme 25µA, contre 330µA pour l'INA226. Le MAX4372 est à peine plus gourmand : 30µA.

D'autre part, lorsque l'on mesure un courant, la précision n'est pas le critère principal. Il s'agit souvent de mesurer la consommation d'un montage ou d'un composant et de tracer sa variation dans le temps. Une précision de 0.1% ou 0.5% est totalement inutile.

Le montage suivant pourra être utilisé pour mesurer un courant avec une rapidité qui dépendra uniquement de celle de l'ADC du microcontrôleur.

On peut facilement obtenir plus de 38000 échantillons par seconde avec un ATMEGA328 :

https://riton-duino.blogspot.com/2018/11/arduino-les-performances-de-ladc.html

Certains gros STM32 peuvent offrir plus d'un million d'échantillons par seconde !

https://riton-duino.blogspot.com/2019/04/stm32-ladc.html

La deuxième question que l'on peut se poser : un simple AOP monté en amplificateur ne pourrait-il pas faire le même travail ?

La réponse est non, car l'INA138 et le MAX4372 peuvent accepter sur leurs entrée des tensions largements supérieures à leur tension d'alimentation, ce que ne pourra pas tolérer un AOP.

1. L'INA138

Ce composant est capable de mesurer un courant côté "high side" (rail positif) uniquement. Il peut être alimenté entre 2.7 V à 36 V.
Un autre modèle, l'INA168, peut être alimenté entre 2.7 V à 60 V.


La résistance shunt RS produit une chute de tension proportionnelle au courant traversant la charge. Il convient donc de choisir sa valeur judicieusement, afin de ne pas perturber la charge.
Pour une mesure précise, il est recommandé également de ne pas dépasser 0.5V entre les entrées de l'INA138.

La résistance RL permet de fixer le gain de l'amplificateur (voir figure 9 de la datasheet) :
  • RL=50KΩ pour un gain de 10
  • RL=100KΩ pour un gain de 20
  • RL=250KΩ pour un gain de 50
  • etc.
Imaginons que l'on désire mesurer un courant maximal d'un ampère.
Si l'on admet 100mV de chute de tension dans le shunt, celui-ci aura une valeur de :

RS = 0.1V / 1A = 0.1Ω

Si l'on fixe le gain à 20, la résistance RL doit avoir une valeur de 100KΩ.

La tension maximale en sortie de l'INA138 vaudra :

Vo = Is * RS * RL / 5KΩ = 1A * 0.1Ω * 100KΩ / 5kΩ = 2V

L'entrée analogique du microcontrôleur mesurera donc 2V à pleine échelle.

On peut utiliser différentes références de tension (VREF) pour l'ADC :
  • référence par défaut : 5V ou 3.3V suivant la tension d'alimentation
  • référence interne 1.1V
  • référence interne 2.56V (ARDUINO MEGA)
Si l'on utilise la référence par défaut, la précision s'en ressentira légèrement.
Avec une référence 3.3V, la perte de précision sera faible.
Avec une référence 5V on perdra un bit sur les 10 de l'ADC. On peut augmenter le gain à 50 avec une résistance RL de 200KΩ. La tension maximale à mesurer sera de 5V. C'est limite.

Si l'on utilise la référence interne 1.1V l'ADC sera saturé. Il conviendra de diminuer la valeur du gain. On le fixera à 10 avec une résistance de 50KΩ. La tension maximale à mesurer sera de 1V.
Enfin, avec la référence interne 1.1V, si l'on conserve le gain de 20, le courant maximal que l'on pourra mesurer sera de 0.55A.

Sur une MEGA, la référence 2.56V sera le meilleur choix.

Il faut également tenir compte de la puissance dissipée par le shunt. La modèle que j'ai utilisé est une résistance 100mΩ CMS 2010 pouvant dissiper 1W.
Le courant maximal qu'elle pourra supporter est de :

I = √(P / R) = 3.16A

Comme c'est une limite absolue à ne pas dépasser, si l'on veut éviter un échauffement excessif, il serait bon d'appliquer une marge de sécurité.
Dans le cas où l'on dépasse le courant maximal admissible, il faudra adopter une résistance de puissance plus importante, mais cela se fera au détriment de la chute de tension dans RS :

U = R * I = 0.1 * 3.16 = 0.316V

On est loin des 100mV que l'on s'était fixé au départ. Il serait plus judicieux d'adopter un shunt de plus faible valeur, et d'augmenter le gain.

On peut résumer avec un petit tableau :

VREF
RS RL Gain Courant maxi Résolution
(ADC 10 bits)
5V 0.1Ω 200KΩ 50 1A 0.97mA
5V 0.1Ω 100KΩ 20 2.5A 2.44mA
5V
0.1Ω (*) 50KΩ 10 5A 4.88mA
5V
0.02Ω 200KΩ 50 6.25A 6.1mA
3.3V 0.1Ω 200KΩ 50 0.66A 0.64mA
3.3V 0.1Ω 100KΩ 20 1.65A 1.61mA
3.3V
0.1Ω (*) 50KΩ 10 3.3A 3.22mA
3.3V
0.02Ω 200KΩ 50 4.125A 4mA
1.1V 0.1Ω 200KΩ 50 0.22A 0.21mA
1.1V 0.1Ω 100KΩ 20 0.55A 0.53mA
1.1V 0.1Ω 50KΩ 10 1.1A 1.07mA
2.56V 0.1Ω 100KΩ 20 1.28A 1.07mA

(*) Ces deux configurations nécessiteront l'adoption d'un shunt d'au moins 3W, ou de diminuer sa valeur et d'augmenter le gain (voir ligne suivante dans le tableau).

Bien entendu avec d'autres microcontrôleurs possédant par exemple un ADC 12 bits ou des références internes de valeurs différentes ces paramètres seront différents.

On peut utiliser une référence de tension externe si l'on désire une plus grande précision ou une stabilité en température supérieure.


2. Le MAX4372

Le MAX4372 est plus simple. Il n'y a aucune résistance de réglage, mais les calculs restent les mêmes, et le tableau précédent reste valable.


3. Les schémas

3.1. L'INA138

Voici le schéma que j'utilise :
La sortie de l'INA138 est redirigée vers l'entrée d'un AOP OPA363 monté en suiveur (gain = 1), ceci afin de diminuer fortement l'impédance de sortie.
Cet étage est nécessaire si l'on désire faire des mesures de courant subissant des variations rapides ou utiliser plusieurs canaux ADC simultanément. Voir cet article :

Un condensateur de 100nF permet de découpler l'alimentation.

3.2. Le MAX4372

Voici le schéma que j'utilise :
Le MAX4372 a une impédance de sortie très faible, il n'a nul besoin d'un AOP suiveur pour abaisser celle-ci.

Ici aussi un condensateur de 100nF permet de découpler l'alimentation.

Que dire de plus ? Il est temps de passer aux essais.

3.3. Les branchements

Le connecteur IN-OUT des deux modules a le brochage suivant :
  • 1 : sortie
  • 2 : alimentation 5V ou 3.3V (l'OPA363 supporte au maxi 5.5V)
  • 3 : GND
  • 4 et 5 : V-
  • 6 et 7 : V+
La tension d'alimentation pour la charge doit être appliquée sur les broches 6-7. La charge est câblée entre les broches 4-5 et GND.

Les broches 4-5 et 6-7 sont doublées afin d'augmenter le courant admissible.

Sur ce schéma la charge est une résistance de 47Ω, elle consommera donc environ 100mA sous 5V.

On pourrait imaginer remplacer cette charge par un microcontrôleur quelconque pour en mesurer la consommation. Il est facilement imaginable également que le microcontrôleur reçoive lui-même l'information à mesurer sur une de ses propres entrées analogiques. Il pourra donc mesurer sa propre consommation en temps réel.

Un module de ce type peut être mis en place pendant la phase de test d'un projet et retiré ensuite, une fois que la consommation est connue.
On peut par exemple prévoir un connecteur femelle à 7 points sur la carte pour enficher le module, et le remplacer ensuite par un cavalier entre les pins 5 et 6.

4. Le sketch

4.2. L'INA138

Voici un petit sketch pour un ARDUINO :

#define VREF          1.073
#define SHUNT         0.100
#define INA138_GAIN   19

void setup()
{
  Serial.begin(115200);
  analogReference(INTERNAL);
}

void loop()
{
  unsigned int adc = analogRead(A0);
  Serial.print(F("ADC: ")); Serial.println(adc);
  float voltage = adc * VREF / 1023;
  Serial.print(F("voltage: ")); Serial.print(voltage, 3);  Serial.println(" V");
  float current = voltage / SHUNT / INA138_GAIN;
  Serial.print(F("current: ")); Serial.print(current, 3); Serial.println(" A");
  delay(2000);
}


On voit que la tension de référence vaut 1.073V. Cette tension est mesurée sur la sortie AREF de l'ARDUINO.

Sur une PRO MINI cette broche n'existe pas, mais on pourra la fixer à 1.1V sans problème. On ajustera la valeur du gain dans le code afin de compenser.

Dans ce sketch la valeur du gain est de 19. Pourquoi cette valeur alors que sa valeur théorique est de 20 ?
Ce n'est qu'une histoire de précision de composants. Le shunt de 0.1Ω a été acheté chez un fournisseur sérieux. Il a une précision de 1%. La résistance RL que j'ai utilisé fait partie d'un jeu de résistances CMS dont j'ignore la précision (AliExpress).

J'ai donc ajusté la valeur du gain dans le code afin que le résultat affiché soit identique à la valeur du courant mesuré par mon multimètre.
Si l'on utilise une résistance RL à 1% la correction à réaliser sera plus faible.

L'ARDUINO, après avoir ajusté ces constantes affiche ceci :

ADC: 168
voltage: 0.176 V
current: 0.099 A
ADC: 167
voltage: 0.175 V
current: 0.098 A
ADC: 167
voltage: 0.175 V
current: 0.098 A
ADC: 166
voltage: 0.174 V
current: 0.098 A

Le voltage affiché est celui lu sur l'entrée A0. Comme le gain de l'INA138 est fixé à 20, la tension aux bornes du shunt est donc 20 fois inférieure.

La mesure est très stable.

4.2. Le MAX4372

Le sketch est légèrement différent (j'ai utilisé un MAX4372F avec donc un gain de 50) :

#define VREF          1.073
#define SHUNT         0.100
#define MAX4372_GAIN  50

void setup()
{
  Serial.begin(115200);
  analogReference(INTERNAL);
}

void loop()
{
  unsigned int adc = analogRead(A0);
  Serial.print(F("ADC: ")); Serial.println(adc);
  float voltage = adc * VREF / 1023;
  Serial.print(F("voltage: ")); Serial.print(voltage, 3);  Serial.println(" V");
  float current = voltage / SHUNT / MAX4372_GAIN;
  Serial.print(F("current: ")); Serial.print(current, 3); Serial.println(" A");
  delay(2000);
}

Ici il n'y a aucun besoin d'ajuster quoi que ce soit, mis à part la tension VREF.
Voici le résultat :

voltage: 0.514 V
current: 0.103 A
ADC: 487
voltage: 0.511 V
current: 0.102 A
ADC: 505
voltage: 0.530 V
current: 0.106 A
ADC: 490
voltage: 0.514 V
current: 0.103 A


La mesure est un peu moins stable, ceci étant dû probablement au gain plus élevé. Le modèle MAX4372T avec un gain de 20 serait probablement moins bruité.
Mais cela reste tout à fait exploitable.

5. Photos

Voici une photo des 2 modules :

INA138

MAX4372

Les 2 cartes font respectivement 23mm x 20mm et 20mm x 15mm.

On peut donc les utiliser comme des module ARDUINO classique, y compris sur une breadboard si le courant à mesurer est faible.

Si le courant à mesurer est supérieur à 1 ou 2 ampères il serait plus convenable d'opter pour un connecteur plus approprié.

6. Téléchargements

Ces deux projets sont téléchargeables ici :


7. Liens utiles

Les amplificateurs de courants.
Chez TEXAS :
Chez MAXIM :

8. Conclusion

La mesure de courant est largement facilitée par ces petits composants, avec un peit avantage pour le MAX4372, plus simple à mettre en oeuvre.
Il ne reste plus qu'à les exploiter sur une vraie application.

Une dernière chose : le MAX4372, l'INA138 et l'OPA363 se trouvent facilement sur AliExpress.
Le module INA138 a coûté 1.60€, le MAX4372 1.10€.


Cordialement
Henri

9. Mises à jour

03/07/2020 : le MAX4372

6 commentaires:

  1. bonjour Riton. Dommage que ces composants permettent uniquement de mesurer le courant dans un sens . J'aimerai en utiliser pour un chargeur /dechargeur de batterie...

    RépondreSupprimer
    Réponses
    1. Dans ce cas, l'INA226, bidirectionnel, est un bon choix.

      Supprimer
  2. Article intéressant, il m'avait échappé.
    De la lecture en perspective...
    En attendant j'ai vu que l'INA138 était en SOT-23-5, et l'OPA363 en SOIC-8. Je n'ai pas trouvé l'OPA363 en vente, aurais-tu une URL par hasard ?
    Sinon les schémas sont beaucoup plus simples que le banc de mesures.

    RépondreSupprimer
    Réponses
    1. Mes OPA363 proviennent de chez TME :
      https://www.tme.eu/fr/details/opa363id/amplificateurs-operationels-smd/texas-instruments/
      Le problème chez TME est que les frais de port sont élevés.
      Sinon, le MAX4372 se trouve facilement sur AliExpress :
      https://fr.aliexpress.com/item/32867697896.html?spm=a2g0o.order_detail.order_detail_item.5.399d7d56OsSCLJ&gatewayAdapt=glo2fra

      Supprimer
  3. Bonjour Henri. J'aurais besoin d'un coup de main. J'ai dessiné un nouveau pcb car l'OPA363 n'est plus commercialisé. Il est remplacé par le TLV9061. C'est un boitier SOT-23.
    Pour une charge constituée d'une résistance de 33 ohms, qui consomme 90 mA environ (mesuré à l'ampèremètre) sous une tension de 3,3V, j'ai en out une tension de 850mV environ.
    D'après la formule, j'aurais dû avoir 360mV. Comme j'avais commandé plusieurs pcb, j'en ai fait un sans l'ampli op ni la résistance de 4.7k. Là j'ai 900 mV environ. Soit la même chose. Comment expliquer ça ?
    Rs vaut 0,2 ohms (mesuré pour un composant donné à 0,1ohm)
    RL vaut 99.57k mesuré, soit 100k.
    Je devrais donc avoir en sortie de l'INA138 environ 360mV au lieu de 850 ou 900mV.
    Is vaut donc 90mA.
    Tu aurais une idée ?

    RépondreSupprimer
  4. Salut. Pour ma part, si tu possèdes un bon multimètre, je mesurerais la tension aux bornes du shunt Rs.
    Si elle est 20 fois inférieure aux 900mV mesurés en sortie c'est que le gain est correct. Il faudra mettre en doute la valeur de Rs.
    Il est assez difficile de mesurer la résistance d'un shunt de valeur aussi faible, étant donné que les fils d'un multimètre ont souvent une résistance bien plus élevée.

    RépondreSupprimer