Misura Corrente con ARDUINO e ACS712

Salve, sto tentando di realizzare un sistema per la misura della corrente, costituito da ARDUINO + ACS712 (breakout +/- 5A). Il sistema deve essere in grado di misurare valore compresi tra -400 mA e 400 mA come valori di picco.

Per le prove ho collegato una batteria (due stilo semi scariche da 1.5 v in serie) oppure un alimentare cellulare da 6 volt, colegato ad una resistenza da 2.1 khom o 100 hom, con il sensore in serie.

Durante il test inverto la polarità della batteria, in modo da misurare la corrente in entrambi i versi.

Naturalmente ho fatto il test utilizzando un multimetro digitale. I valori che ottengono non sono perfettamente opposti. comunque hanno segno opposto.

Però:

  1. a circuito aperto batteria scollegata il valore in uscita dal sensore non è di 2500 ma si aggira intorno a 2520 mv +/-10.
  2. quando collego la batteria invertendo i poli non ottengo valori opposti di corrente ma sempre dello stesso segno, e con valore diverso.
  3. i valori non si avvicinano ai valori reali attesi (I = V/ R).

allego andamento della corrente e codice utilizzato.

Nella figura (corrente) la linea verde rappresenta la corrente, mentre la linea blue rappresenta il valore letto dall’arduino trasformato in mVolt-2500. La misura è costituita da tre fasi: batteria scollegata, batteria collegata e polarità invertita. La linea grigia più marcata rappresenta lo 0.

Nel complesso il sistema sembra rispondere.

Ho modificato il software calcolando il valore medio a batteria scollegata da sommare o sottrarre al valore ottenuto da arduino (figura corrente 2). A prescindere dalla correttezza del valore la forzatura ha senso ?

int over    = 255;
float decim = 63.0;
float range = 5000; // || 3300;
float res   = 4096.0;
float gain  = 1; // || 1;
float kkk   = 0.006598; // 5000/(4096*0.185) -> 12 bit
float avg   = 0;

int samples = 15;
int cyclic  = 2;


int R1=3;  int R2=4; int R3=5; // Relè

long mn1=0; long mn2=0; long mn3=0;

void setup ()
{
 pinMode (R1, OUTPUT );
 digitalWrite(R1, LOW);
 pinMode (R2, OUTPUT );
 digitalWrite(R2, LOW);
 pinMode (R3, OUTPUT );
 digitalWrite(R3, LOW);
 
 Serial.begin(115200);
 
}

void cyclicMeasures()
{
for (int j=0; j<cyclic; j++)
{
    calibrate();
    acquisition();
    
    digitalWrite(R1, HIGH); delay(400);
    avg=-avg; acquisition();
    digitalWrite(R1, LOW); delay(800);
    
    digitalWrite(R2, HIGH); digitalWrite(R3, HIGH); delay(800);
    digitalWrite(R1, HIGH); delay(400);
    avg=-avg; acquisition();
    
    digitalWrite(R1, LOW); delay(800);
    digitalWrite(R2, LOW); digitalWrite(R3, LOW); delay(800);
}
}

void calibrate ()
{
long count=0;
for (int k=0; k<over; k++)
{
  count = count + analogRead(0);
  delay(2);
}
avg=count/(decim+1)-2048;
//  Serial.print(avg); 
//  Serial.print(",");
//  Serial.print((avg-2048));
//  Serial.println("\n");
}

void acquisition()
{
 for (int i=0; i<=samples; i++){
   long count=0;
   for (int k=0; k<over; k++)
   {
     count = count + analogRead(0);
     delay(2);
   }
   float raw=count/(decim+1)-avg;
   float vV=(range/res)*raw/gain;
   float iA=kkk*(raw-(res/2))*1000/gain; //12 bit  
   //float iA=kkk*(raw-avg)*1000/gain; //12 bit
   
//     Serial.print(raw);
//     Serial.print(",");
   Serial.print((vV-(range/2)));
   Serial.print(",");
   Serial.println(iA);
   //delay(4);
 }
 Serial.println();
}

L’inversione della polarità della batteria è stata ottenuta mediante l’utilizzo di tre relè. Uno apre e chiude il circuito e gli altri due servono per invertire la polarità.

Eseguo circa 255 misure è faccio la media con un oversampling di 2 bit, dividendo per 16.

Non riesco ad ottenere i valori attesi e tra l’altro le corrente non sono opposte come mi aspetto.

Devo stabilizzare la tensione di alimentazione del sensore ?
Oppure c’è qualcosa che non va nel codice ?

grazie.

corrente.jpg

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.