Senseur de courant Alternatif ACS712 - capteur invasif

Bonjour a tous,
15/05/2023: Cet article contient une monumentale erreur que je corrige actuellement!

ACS712 sur Arduino 

Basé sur l'ACS712 d'Allegro, ce senseur se branche en série avec la charge sur un circuit alternatif et permet de mesurer le courant qui traverse le senseur.

Senseur ACSENS-ACS712 disponible chez MC Hobby


Le capteur utiliser le champ magnétique généré par le courant (et donc l'effet hall) pour mesurer le courant qui le traverse. Le capteur produit en sortie une tension continue proportionnelle au courant à raison de 0.100V/A (100 mV par ampère). 

 

ACS712 Courant vs Tension de sortie

Les éléments vert et rouge du graphique présente les "zones d'erreur" due à la température... en effet, un ACSxxx est semble t'il assez sensible aux variations de températures.

A noter aussi que ce capteur utilise l'effet Hall et qu'il est donc sensible au perturbation magnétique externes.

Comme le courant est alternatif (une sinusoïde), la tension de sortie est elle aussi alternative mais centrée autour de la tension de 2.5V.

Du point de vue électronique, la tension Vout ne devient JAMAIS négative!

La sortie sur Vout est donc alternative. Dans le cas d'un courant de 5A, la sortie produit 5A * 100mV/A = 500mv (soit 0.5V) qui est centrée autour de 2.5V sur la sortie de l'ACS712.

Comment l'ACS évite les tensions négatives ?

C'est assez simple; en utilisant un offset positif de 2.5V, la sortie Vout rester dans la zone de confort 0 - 5V de notre Arduino.

Grâce à cette tension de 2.5V ajoutée sur la tension de sortie du capteur... nous avons l'équivalent d'une translation sur l'axe de la tension.

Translation de Vout en zone positive.

En ajoutant cette tension de 2.5V, la courbe de mesure (100mV/DIV) est déplacée vers le haut. La tension VOut reste dans une Zone de tension strictement positive.
La bonne nouvelle, c'est que cela est fait au sein même du composant.

Cela signifie aussi que nous sommes limités à une sortie VOut du capteur de 2.5V max (un peu moins avec de la sécurité). Au delà, par exemple VOut=2.7V, cela donne 2.5 + VOut = 5.2 et passe donc au dessus de 5V et en tension négative (2.5 - 2.7) = -0.2V.

Avec VOut = 2.5V max, à raison de 0.100V/A, il est possible d'échantillonner un courant de 2.5 / 0.1 = 25A maximum pour une valeur de pointe, ce qui correspond à une valeur efficace de 25/sqrt(2) = 17.6 A (tel que nos appareils affichent cette valeur). 

Comme l'ACS712 est limité à 20A (efficace), Il faudra donc se limiter un peu sur le courant à mesurer.

Utilisation d'appareils de mesure

A noter que lorsque des mesures sont relevées avec des appareils de mesure électrique, ces appareil expriment une valeur efficace. Les valeurs maximales (ou de pointe) sont légèrement supérieur Ipeak = Ieff * Sqrt(2)

Montage
Voici comment insérer un senseur ACS712 dans un circuit électrique.

Brancher un ACS712 sur un Arduino - Wiki.mchobby.be

Réseau électrique - Mise en garde
Le montage sur Breadboard ou plaque de prototypage expose la partie haute tension de votre montage à un contact accidentel. Faire des raccordements sur le réseau électrique n'est pas sans risque et certain accidents peuvent conduire à de graves brûlures, voire à la mort dans les cas les plus graves!
Il convient donc d'être prudent.
Si vous ne disposez pas de compétence en haute tension où si vous hésitez, n'hésitez pas à faire appel à quelqu'un disposant des compétences nécessaires.
Un fois votre montage/raccordement terminé, il est préférable de le placer dans un environnement permettant d'éviter tout contact accidentel (ex: une boite hermétique prévu à cet effet). Toujours fixer un senseur/composant/montage pouvant exposer un risque de contact avec sa partie haute tension. 

Le code

Comment effectuer la mesure ?
Pour effectuer la mesure, il faut capturer la valeur de pointe (Vpeak) en effectuant une série de lecture répétitive. Le but est de couvrir plusieurs cycles 50 Hertz, donc plusieurs fois 20 millisecondes (Le croquis peut être améliorer sur ce point).
 
Ensuite, on converti la valeur ADC (0-1024) en volts puis on soustrait 2.5V.
Nous avons ainsi le nombre de volts au dessus de 2.5V. Une fois converti en millivolts, il est facile de déduire le courant correspondant.

N'oubliez pas qu'il s'agit d'une valeur de pointe (Vpeak), il faudra le diviser par Sqrt(2) pour obtenir la valeur efficace correspondante (celle que retourne les appareils de mesure).
 
A propos du croquis
J'ai récemment modifié ce script présent ci-dessous. Je ne l'ai pas recompilé... une erreur pourrait s'y glisser. Si c'est le cas, j'espère que vous pourrez la corriger.
float zero_senseur; 
int PIN_ACS712 = A0;

// Obtient la valeur du senseur de courant ACS712
//
// Effectue plusieurs lecture et trouve la valeur MAX
// puis soustrait l'équivalent de 2.5V (=512).
float valeurACS712( int pin ){
  int valeur;
  int le_max = 0;
float mv int nbr_lectures = 50; for( int i = 0; i < nbr_lectures; i++ ){ valeur = analogRead( pin );
if( valeur > le_max )
le_max = valeur } mv = 4.88 * float(le_max-512); // 4.88 = 5000 / 1024 return mv; } void setup(){ // calibration du senseur (SANS COURANT) zero_senseur = valeurACS712( PIN_ACS712 ); Serial.begin( 9600 ); } float courant; float courant_efficace; float tension_efficace = 230; // tension efficace du réseau electrique float puissance_efficace; float ACS712_RAPPORT = 100; // nbr de millivolts par ampère void loop(){ float valeur_senseur = valeurACS712( PIN_ACS712 ); // L'amplitude en courant est ici retournée en mA // plus confortable pour les calculs courant = (float)(valeur_senseur-zero_senseur)/1024*5/ACS712_RAPPORT*100000; // Courant efficace en mA courant_efficace = courant / 1.414; // divisé par racine de 2 // Calcul de la puissance. // On divise par 1000 pour transformer les mA en Ampère puissance_efficace = (courant_efficace * tension_efficace/1000); Serial.println( "zero_senseur - lecture - courant efficace (mA) - Puissance (W)" ); Serial.print( zero_senseur ); Serial.print( " - " ); Serial.print( valeur_senseur ); Serial.print( " - " ); Serial.print( courant_efficace ); Serial.print( "mA - " ); Serial.print( puissance_efficace ); Serial.println( " W" ); delay( 1000 ); // attendre une seconde }

Où acheter


4 commentaires:

  1. Bonjour
    C'est vraiment curieux si ce programme fonctionne car si l'ACS712 sert à mesurer un courant alternatif, l'arduino lit sur sa broche analogique une tension alternative qui en moyenne est VCC/2 soit 2.5V. Donc la fonction valeurACS712 effectue une moyenne de valeurs lues sur une sinusoïde. Il suffit d'ailleurs de faire afficher ces valeurs pour se rendre compte qu'elles ne sont pas stables du tout.

    RépondreSupprimer
  2. Bonjour Michel, j'ai complété l'article pour répondre à vos interrogations

    RépondreSupprimer
  3. Bonjour et merci pour cette révision. Je viens de réessayer avec votre code mais je propose d'augmenter significativement le nombre de mesures réalisées dans la fonction valeurACS712. En effet 50 mesures, même pour une carte arduino uno poussive, c'est peu et donc rien ne dit que les mesures détecteront les pics d'intensité. Dans l'idéal, il faudrait faire des mesures pendant au moins 1/50ième de seconde, j'ai observé une plus grande stabilité des mesures avec 200.
    Un autre problème subsiste, tout cela me semble correct avec une intensité réellement sinusoïdale, or j'ai l'impression (car je n'ai pas d'oscilloscope) que l'intensité ne fluctue pas de cette manière. Par exemple, en mesurant le courant qui alimente un vieux lampadaire halogène de 500W avec rhéostat, je me rends compte qu'avec le rhéostat à 50% l'intensité mesurée est toujours inférieure à celle mesurée avec le rhéostat à 100%.
    Dis autrement, j'ai de plus en plus l'impression que l'ACS712 permet de mesurer que du courant passe, mais il ne faut pas trop compter dessus pour mesurer une intensité.
    Mais bon je ne suis pas spécialiste, je ne demande qu'à faire la preuve du contraire.
    Bonne soirée

    RépondreSupprimer
  4. ... bien sûr je voulais dire "avec le rhéostat à 50% j'ai toujours une intensité SUPERIEURE CURIEUSEMENT à celle mesurée avec le rhéostat à 100%" ...

    RépondreSupprimer