Capacimetro batterie ricaricabili

Buongiorno a tutti, sono qui, al mio primo (piccolo) progettino e con già i primi problemi. Premetto che ho una conoscenza abbastanza scarsa dell'elettronica... Comunque, la mia idea sarebbe quella di calcolare la capacità di una batteria (NiMH, litio, alcalina etc...) leggendo il voltaggio con Arduino mentre la batterie si scarica con resistenza nota. Ho messo in piedi un piccolo circuito e un breve sketch che mi scrive i dati sulla seriale (curiosando qui e là su internet eh, non è tutta farina del mio sacco), fatto sta che il voltaggio letto con arduino è inferiore rispetto a quello reale (ora leggo 1,14V contro 1,31V reali). Il codice dello sketch è questo:

int ContaSecondi = 0;        // Contatore delle letture
int ledPin = 13;             // spia (LED) di inizio test
int Pila1Pin = 3;            // definisco il pin dove e' collegata la pila 1
int Pila1 = 0;               // Variabile dove metto la lettura del pin di pila 1
long VoltPila1 = 0;          // Variabile per valore convertito in Volt di pila 1

void setup()                 // inizializzo il programma
{
  pinMode(ledPin, OUTPUT);   // setto il pin dove e' collega la pila come output
  Serial.begin(9600);        // setto la seriale a 9600

  // scrivo sulla seriale l'intestazione per il foglio di excel
  Serial.println("Test Pile");
  Serial.println("Misura in volt ogni secondo la pila in test");
  Serial.println("Secondi;Pila 1");
}

void loop()                       // loop principale programma
{
  digitalWrite(ledPin, HIGH);        // accendo la spia
  Pila1 = analogRead(Pila1Pin);      // Leggo i volt della pila 1

  VoltPila1 = Pila1*4.88*2;           // converto il valore in millivolt

  Serial.print(ContaSecondi, DEC);   // Prima colonna: secondi
  Serial.print(";");                 // Separatore CSV
  Serial.println(VoltPila1, DEC);      // Seconda colonna: Volt della pila 1 e vado a capo ln

  delay(1000);                       // Mi fermo per un secondo
  ContaSecondi = ++ContaSecondi;     // Incremento di uno i secondi
}

Mentre questo è lo schema di collegamento: |500x480

Le due resistenze sono da 10 Ohm (se no impiego una settimana a scaricare la pila), ho provato anche a collegare direttamente il polo positivo della batteria ad A3 ma leggo sempre il valore sopra indicato.

Qualcuno ha voglia di darmi una dritta sul perchè leggo la tensione più bassa di quella reale? Grazie :)

francium: Comunque, la mia idea sarebbe quella di calcolare la capacità di una batteria (NiMH, litio, alcalina etc...)

La capacità, residua, di una batteria la determini facendo l'integrale della corrente di scarica fino a che non raggiunge la tensione minima di funzionamento previsto dalla chimica della batteria, e non dalla sola tensione.

astrobeed: La capacità, residua, di una batteria la determini facendo l'integrale della corrente di scarica fino a che non raggiunge la tensione minima di funzionamento previsto dalla chimica della batteria, e non dalla sola tensione.

Si, non ho scritto che poi dai dati ricavati calcolo l'intensità di corrente (vista la resistenza nota e la tensione misurata) in funzione del tempo e integro la curva di scarica per calcolare la capacità della batteria. Il problema è che se misuro in maniera errata la tensione tutti i calcoli saranno ovviamente errati!

1) usa il riferimento interno di 1.1V per misurare la tensione della batteria. 2) La capacitá di una batteria dipende dalla corrente di scarica. Piú piccola é la corrente di carico meggiore é la capacitá della batteria. I valori dati sono normalmente misurati con una corrente di 1/20 della capacitá.

Ciao Uwe

Ma quella che devi misurare e' la capacita' residua di ricarica ? (efficenza ?)

Ci sarebbe un modo un po piu veloce ... controllando la curva di scarica della cella, mentre viene scaricata ad alta corrente (almeno 1A) per almeno una ventina di secondi ... in base alla pendenza della curva potresti stimare l'efficenza residua della batteria ...

Bisognerebbe prima connettere la cella senza carico, leggerne la tensione, poi collegare il carico tramite un rele' o un mosfet di potenza (che potrebbe essere pilotato dallo stesso arduino) e campionare la tensione in modo da rilevare la curva di abbassamento della stessa ... poi in base a quella, e sapendo da quanti mAh e' la cella, si calcola la "salute residua" ...

EDIT: "capacimetro" e' un titolo un po fuorviante, un capacimetro serve per misurare i condensatori ;)

Intanto grazie a tutti per le risposte :)

uwefed: 1) usa il riferimento interno di 1.1V per misurare la tensione della batteria.

Ho un po' paura ad usarlo :disappointed_relieved: Comunque ho misurato la tensione dei 5V dell'arduino ed è in effetti 5,00/5,01V e collegando l'arduino direttamente alla batteria la tensione misurata dall'ardu coincide con quella del multimetro. il problema si pone quando metto sotto carico la batteria ed è qui il mistero, se prima coincideva ora come può non coincidere più? Mi sono fatto l'idea che sia un problema dei collegamenti, i vari fili e contatti della breadboard potrebbero far si che "perdo" parte della tensione? avvicinandomi il più possibile e con meno contatti possibili alla batteria la tensione dell'arduino si avvicina a quella del multimetro...

Etemenanki: Ma quella che devi misurare e' la capacita' residua di ricarica ? (efficenza ?)

Ci sarebbe un modo un po piu veloce ... controllando la curva di scarica della cella, mentre viene scaricata ad alta corrente (almeno 1A) per almeno una ventina di secondi ... in base alla pendenza della curva potresti stimare l'efficenza residua della batteria ...

Bisognerebbe prima connettere la cella senza carico, leggerne la tensione, poi collegare il carico tramite un rele' o un mosfet di potenza (che potrebbe essere pilotato dallo stesso arduino) e campionare la tensione in modo da rilevare la curva di abbassamento della stessa ... poi in base a quella, e sapendo da quanti mAh e' la cella, si calcola la "salute residua" ...

A me interessa proprio misurare la capacità della batteria, proprio i suoi mAh.

Etemenanki: EDIT: "capacimetro" e' un titolo un po fuorviante, un capacimetro serve per misurare i condensatori ;)

Si, hai ragione, e infatti ricercando trovo molti schemi per misurare la capacità dei condensatori, ma in effetti ci sono molte analogie... Del resto a me interessa sapere quanta corrente sta all'interno della batteria, la misura è analoga a quella di quanta corrente sta all'interno di un condensatore. Se avete un nome più consono ben venga :) :)

Comunque, ho fatto una curva di scarica completa

ed in effetti integrandola ottengo 1925 mAh. Il valore a me noto per la batteria in test (sia dichiarato che misurato che apposito strumento) è compreso tra 2000 e 2100 mAh per cui direi che risolto il sistema della tensione sottomisurata il sistema può funzionare. (la mia idea finale sarebbe far eseguire i calcoli direttamente da arduino e visualizzarli su un display... ma prima devo risolvere la questione tensione)

Nello sketch usi la variabile intera

long VoltPila1 = 0;

ma poi esegui il calcolo come se fosse un float

VoltPila1 = Pila1*4.88*2; // converto il valore in millivolt

E' come moltiplicassi sempre per 5 anziché per 4.88 poiché Arduino usa di default gli interi.

A questo punto tanto vale usare un float

float VoltPila1 = 0.0;

cyberhs: Nello sketch usi la variabile intera

long VoltPila1 = 0;

ma poi esegui il calcolo come se fosse un float

VoltPila1 = Pila1*4.88*2; // converto il valore in millivolt

E' come moltiplicassi sempre per 5 anziché per 4.88 poiché Arduino usa di default gli interi.

A questo punto tanto vale usare un float

float VoltPila1 = 0.0;

Uhm, grazie per la dritta modificherò il codice, questo però peggiora ulteriormente il valore di tensione misurato, significa che fino ad ora leggo un valore moltiplicato x5 anzichè x4.88, quindi più grande...

cyberhs: E' come moltiplicassi sempre per 5 anziché per 4.88 poiché Arduino usa di default gli interi.

Non c'entra nulla Arduino, questo è C e la regola è che i calcoli vengono fatti col tipo maggiore presente nell'espressione, se fai 10 * 0.55 il risultato è 5 se la variabile che riceve il calcolo è intera, 5.5 se è di tipo float, ovvero viene fatto automaticamente il cast degli operatori.