Pages: 1 2 [3] 4 5 ... 7   Go Down
Author Topic: Resistenza interna batteria polimeri di litio (lipo)  (Read 2720 times)
0 Members and 1 Guest are viewing this topic.
Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1415
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Io posso tagliare la testa al toro e alimentarlo a 5V sempre e comunque?

Ogni cella fa riferimento alla massa, quindi la cosa potrebbe andar bene per la prima cella, ma non per le successive: ogni ingresso non può accettare tensioni superiori a quella di alimentazione.
Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora quasi quasi inizierò a fare una prova con un partitore resistivo dedicato per ogni cella tranne la prima.
Ad ogni partitore assegno delle resistenze che mi dividano per 2, 3,4 ecc ecc la tensione della corrispondente cella.
Quindi anche per la 7°, per esempio, preparo un partitore R1=7*R2 (e così via) di modo da avere sempre una tesnione finale che al massimo potrà arrivare a 4,2V.
E' decisamente molto più povero come discorso ma dovrebbe fare il suo...almeno come sperimentazione...
Che ne dici? Può funzionare lo stesso?
In fin dei conti mi serve non tanto per la precisione della lettura della tensione, quanto per il calcolo della Ri quindi io leggo quella tensione a vuoto con i partitori, poi la rileggo con un carico attaccato ai cavi di potenza e poi con il sw mi faccio il calcoletto della Ri...

MI piacerebbe sapere i carica batterie che IC usano per fare queste rilevazioni quando caricano le lipo...
Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dunque, sto procedendo per piccoli passi per via del tempo a disposizione ma credo che sto percorrendo la strada giusta.
Come dicevo nel post precedente, anzichè mettere degli op-amp ho fatto una serie di partitori resistivi tutti realizzati con resistenze da 1K con il seguente schema :
Massa
1° cella lettura diretta senza partitore
2° cella partitore R1/R2 (1K/1K)
3° cella partitore R1/R2 (1K/2K)
4° cella partitore R1/R2 (1K/3K)
5° cella partitore R1/R2 (1K/4K)
6° cella partitore R1/R2 (1K/5K)
7° cella partitore R1/R2 (1K/6K)
8° cella partitore R1/R2 (1K/7K)

Per ora tutto realizzato su basetta millefori e per trovare i valori giusti per avere sempre lo stesso rapporto nel partitore, ho usato tutte resistenze da 1K messe in serie.
Verificato tutto con il tester, la cosa funziona : su ogni partitore mi ritrovo la tensione della singola cella che sto misurando.

Ora sto iniziando qualche esperimento sul SW ma non ho ancora trovato uno sketch che mi legga più ingressi analogici e me li scriva sul display lcd tft.
Il principio dello sketch dovrebbe essere abbastanza semplice :
leggo tutte e 8 le tensioni, le visualizzo incolonnate e le memorizzo (Vriposo);
applico il carico comandandolo con un mosfet tramite un out della scheda;
rileggo tutte le tensioni e le memorizzo (Vcarico);
faccio la formuletta sapenso la R per ogni partitore (e quindi anche la I) e mi trovo sta benedetta Ri;
Visualizzo tutte le Ri a fianco della Vriposo incolonnate anche loro con il totale finale.

Qualcuno riesce ad aiutarmi sullo sketch?

Grazie :-)
Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5895
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione

Ovvero?

Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi; sono arrivato ad un punto "semi morto".
Mi spiego meglio : la parte hw è praticamente fatta con i partitori resistivi cui accennavo qualche post fa.
Il diagramma di flusso "macro" è semplice :
leggo la tensione su ogni cella,
applico un carico alla lipo (tramite il mosfet),
leggo la tensione sotto carico, sconnetto il carico,
faccio 2 calcoli,
visualizzo il tutto sul display

Il problema ora ce l'ho con il codice per scrivere sul display. Se scrivo su seriale per leggere su pc, è tutto a posto, ma solo li.
Non riesco a traguardare la scrittura sul display.

Vi posto il codice che sto provando se potete darmi un aiuto :

Code:
// include the necessary libraries
#include <SPI.h>
#include <SD.h>
#include <TFT.h>  // Arduino LCD library

 

// pin definition for the Leonardo
#define sd_cs  8
#define lcd_cs 7
#define dc     0
#define rst    1 

TFT TFTscreen = TFT(lcd_cs, dc, rst);

// this variable represents the image to be drawn on screen
//**PImage logo;


void setup() {
  // initialize the GLCD and show a message
  // asking the user to open the serial line
  TFTscreen.begin();
  TFTscreen.background(255, 255, 255);

  TFTscreen.stroke(255,0,0);
  TFTscreen.println();
  TFTscreen.println("Arduino prove lettura A0 A1");
  TFTscreen.stroke(255,0l, 0);
  TFTscreen.println("Open serial monitor");
  TFTscreen.println("to run the sketch");

  // initialize the serial port: it will be used to
  // print some diagnostic info 
  //**Serial.begin(9600);
  // while (!Serial) {};
  delay (3000);

  // clear the GLCD screen before starting
  TFTscreen.background(255, 255, 255);
 
  // try to access the SD card. If that fails (e.g.
  // no card present), the setup process will stop.
  //**Serial.print("Initializing SD card...");
  //**if (!SD.begin(sd_cs)) {
    //**Serial.println("failed!");
    //**return;
  //**}
  //**Serial.println("OK!");
 
  // initialize and clear the GLCD screen
  TFTscreen.begin();
  TFTscreen.background(255, 255, 255);

  // now that the SD card can be access, try to load the
  // image file.
  //**logo = TFTscreen.loadImage("lipo24.bmp");
  //**if (!logo.isValid()) {
    //**Serial.println("error while loading arduino.bmp");
  //**}
}

//**void loop() {
  // don't do anything if the image wasn't loaded correctly.
  //**if (logo.isValid() == false) {
    //**return;
  //**}
 
  //**Serial.println("drawing image");

  // get a random location where to draw the image.
  // To avoid the image to be draw outside the screen,
  // take into account the image size.
  //int x = random(TFTscreen.width() - logo.width());
  //int y = random(TFTscreen.height() - logo.height());
 
  //**int x = random(1,128);
  //**int y = random(1,160);

  // draw the image to the screen
  //**TFTscreen.image(logo, x, y);

  // wait a little bit before drawing again
  //**delay(1500);
  //**TFTscreen.background(255, 255, 255);
//**}



/*
  ReadAnalogVoltage
  Reads an analog input on pin 0, converts it to voltage, and prints the result to the serial monitor.
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
 
 This example code is in the public domain.
 */

// the setup routine runs once when you press reset:
//**void setup() {
  // initialize serial communication at 9600 bits per second:
  //**Serial.begin(9600);
//**}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int Cella1 = analogRead(A0);
  int Cella2 = analogRead(A1);
  int Cella3 = analogRead(A2);
  int Cella4 = analogRead(A3);
  int Cella5 = analogRead(A4);
  int Cella6 = analogRead(A5);
  int Cella7 = analogRead(A6);
  int Cella8 = analogRead(A7);
   
 
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage1 = Cella1 * (5.0 / 1023.0);
  float voltage2 = Cella2 * (5.0 / 1023.0);
  float voltage3 = Cella3 * (5.0 / 1023.0);
  float voltage4 = Cella4 * (5.0 / 1023.0);
  float voltage5 = Cella5 * (5.0 / 1023.0);
  float voltage6 = Cella6 * (5.0 / 1023.0);
  float voltage7 = Cella7 * (5.0 / 1023.0);
  float voltage8 = Cella8 * (5.0 / 1023.0);
   
 
  // print out the value you read:
  //**Serial.println("          ");
 
 int x = random(1,128);
 int y = random(1,160);

  // draw the image to the screen
  //**TFTscreen.image(logo, x, y);
 
 

 
  TFTscreen.println("Prove lettura",x,y);
  TFTscreen.println(voltage1);
 
  //**Serial.println(voltage1,2);
  //Serial.println(voltage2,2);
  //Serial.println(voltage3,2);
  //Serial.println(voltage4,3);
  //Serial.println(voltage5,3);
  //Serial.println(voltage6,3);
  //Serial.println(voltage7,2);
  //Serial.println(voltage8,2);
  TFTscreen.println("           ");
  //**Serial.println("          ");
  delay (3000);
}

All'interno del codice, ci sono delle righe precdeute da //**
Con quelle riesco a scrivere sul pc ma io voglio visualizzare il tutto su display. L'idea è di visualizzare delle immagini .bmp (che ho e che funzionano) rappresentanti la classica batteria con 3 colori diversi (verde rosso e giallo a seconda della carica) e sopra a ciascuna vorrei scrivere la tensione e la Ri.

Potete aiutarmi?

Grazie
Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi sono dimenticato di dirvi che in quetso poco di codice scritto (scopiazzato di qua e dila ovviamente) al momento facio la sola lettura della tensione a riposo.
Manca poi la parte di attivazione del mosfet e dei calcoli ma ritenevo inutile proseguire se tanto non riesco a scrivere sul display...
Quando ci riuscirò, andrò avanti con il resto del codice


Logged

Italy (Venice)
Offline Offline
Edison Member
*
Karma: 25
Posts: 1323
Quello che non c'è non si può rompere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Volevo dirti che con la tua soluzione con i partitori resistivi perdi in dinamica sull'ADC , alla settima cella hai gia perso 3 bit così invece di 10 ti ritrovi con 7 bit,  cioè una variazione sulla cella di 80mV ti ritrovi dopo il partitore una variazione di soli 10mV cioè 2 unità invece di 16 unità
Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Volevo dirti che con la tua soluzione con i partitori resistivi perdi in dinamica sull'ADC , alla settima cella hai gia perso 3 bit così invece di 10 ti ritrovi con 7 bit,  cioè una variazione sulla cella di 80mV ti ritrovi dopo il partitore una variazione di soli 10mV cioè 2 unità invece di 16 unità

Perchè questo comportamento? Non capisco...
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1415
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La tua soluzione dei partitori non può funzionare.
Avevo un dubbio, ma, dopo aver provato al simulatore ne ho avuto conferma.
Se tutte le celle hanno la stessa tensione hai perfettamente ragione, ma nel momento che anche una sola di queste abbia una tensione diversa, i valori sulle successive celle sono diversi.
Ad esempio, immaginiamo di avere una serie di 4 celle tutte a 4.0V ad eccezione della V2 = 4.1V
Vtot = V1 + V2 + V3 + V4 = 16.1 V
Sui tuoi partitori troveresti:
V1 = 4.0V
V2 = 4.05V
V3 = 4.033V
V4 = 4.025V
Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Stavo silenzioso perche' volevo vedere a che punto arrivavi, ma visto che ti hanno gia' ragguagliato ti dico qualcosa pure io

 Innanzi tutto cosa vuoi fare uno strumento di misura o un gadget ?
perche' come detto all'inizio, la scelta di Arduino con un ADC a 10 bit non e' il massimo, la cosa migliore sarebbe quella di usare un ADC esterno.
Comunque andiamo avanti
Prima di tutto, per avere il minore errore possibile vanno messe resistenze di precisione e non le normali al 5% di tolleranza
E sopratutto serve una Vref stabile su Arduino. Non puoi usare la tensione fornita dall'USB o dal regolatore della scheda.
Poi, come gia' detto da @icio , un partitore porta a una riduzione di risoluzione della misura.
Se hai un partitore che divide per 4 ( 4° cella ) non avrai piu' 5/1023 = circa 5mV, ma 5/1023*4 = circa 20mV.
Cioe' se la tensione della batteria varia di 20mV ( es. 4,01 - 4.03 ) tu non te ne accorgi
Se poi ci aggiungiamo il fatto che l'ADC ha un'accuratezza di +/- 2 LSB, questo errore aumenta e non di poco
Fai tu il conto dell'errore che viene all'8° cella

Poi c'e' quello che dice @cyberhs, ovvero che i calcoli fatti con il partitore sono teoricamente corretti se tutte le celle sono nelle stesse condizioni.
Mi ero preparato una tabella, dove ti volevo far notare cosa misuravi se c'era una cella difettosa ( in questo caso la terza ).
Se guardi la colonna G, vedi la tensione che misuri sulle varie celle. Dalla difettosa in poi sono tutte sballate.
Pero' a questo errore si puo' rimediare, Se tu il valore letto lo moltiplichi per il valore di divisione del partitore ( sempre che siano reistenze di precisione ) e da questo sottrai il valore totale delle celle precedenti, riesci comunque ad avere il valore corretto ( vedi altra figura )

Per spiegartelo meglio ti faccio un esempio del codice

Code:
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage1 = Cella1 * (5.0 / 1023.0);
  float volt_tot = voltage1 ;
  float voltage2 = ( Cella2 * (5.0 / 1023.0)) * 2 - volt_tot ;
  volt_tot = volt_tot + voltage2 ;
  float voltage3 = ( Cella3 * (5.0 / 1023.0)) * 3 - volt_tot ;
  volt_tot = volt_tot + voltage3 ;
  float voltage4 = ( Cella4 * (5.0 / 1023.0)) * 4 - volt_tot ;
  volt_tot = volt_tot + voltage4 ;
all'uscita del ciclo volt_tot sara' gia' la tensione totale del pacco batteria, non e' che devi risommare niente






* adc_batt-1.png (58.87 KB, 591x528 - viewed 15 times.)

* adc_batt-2.png (49.05 KB, 354x684 - viewed 15 times.)
Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vi ringrazio molto dell'aiuto che mi state dando ma soprattutto dell'avermi messo sotto gli occhi l'errore indotto dal partitore resistivo.
Innanzitutto non vorrei farne un gadget ma uno strumento, conscio della sua imprecisione ma il discorso è che se io uso sempre lo steso strumento per controllare tutte le mie lipo, ho una misura che in valore assoluto non sarà il massimo ma sarà sempre presa dallo stesso strumento e quindi mi terrà aggiornato sull'andamento vitale delle varie lipo.
Ad oggi infatti, un caricabatterie ti dice un risultato e un altro te ne dice un altro ancora (parlo di marche molto bone nel settore : Robbe, Hyperion e iCharger) per non parlare dei vari "gadget" esterni.

Seconda cosa : le resistenze che ho usato fino ad ora sono del 5% ma non mi interessava ora come ora la precisione, ma il progetto in quanto tale. Ho ordinato (sono in viaggio) delle resitenze con lo 0,5% di tolleranza che già inducono errori ma "accettabili".
Questa mattina ho letto il post di cyberhs e stavo proprio pensando ad una soluzione sw come quella che hai scritto tu smiley

Vorrei continuare sulla strada dei partitori per il semplice fatto che se no dovrei trovare un'alimentazione  di 4,2*8=33,6V per alimentare gli operazionali.
Potrei anche ridurre il progetto a 6 celle scendendo a 25,2V ma rimane sempre il problema di trovare quella alimentazione.
Io contavo di metterci un 7805 per poter usare una fonte quasi qualunque (tipicamente una lipo 3 celle che è il minimo che uso) ed avere quindi una tensione di riferimento che ritengo precisa. Oltremodo, ridurre a 6 celle in quetso momento non sarebbe un problema, ma mi castrerebbe in un futuro dovessi passare anche solo all'uso delle lipo da 7 celle che stanno facendo capolino sempre più insistentemente nel mondo elicotteristico.

Per quanto riguarda lo scrivere il codice per scrivere sul display invece, non riesco a tirar fuori nulla di buono smiley-sad

Logged

Offline Offline
Jr. Member
**
Karma: 4
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ragazzi, devo ringraziarvi infinitamente perchè il progetto sta prendendo sempre più forma.
FINALMENTE sono riuscito a scrivere sul display i valori delle varie celle.Ora devo vedere se per caso riesco a far stare in linea 8 celle anzichè solo 6. Curioserò se esiste la possibilità di ridimensionare i caratteri al ribasso solo che già così è proprio piccola la scritta.
Non ci ho pensato subito....semmai cercherò un altro display più grande.

Però sto notando delle cose che, avendo già letto qua e la, mi aspettavo. Se in un dato ingresso analogico non c'è tensione (caso classico quando uso lipo 3 celle e quindi rimanogno senza tensione le altre 3) , in realtà la scheda legge dei valori "a babbo".
Escludendo l'ipotesi di andare sugli op-amp (che penso mi darebbero uno 0 esatto e quindi non avrei il problema), c'è possibilità secondo voi di poter ovviare al problema in qualche modo?
Al momento mi è venuta una sola pensata ovvero quella di aggiungere qualche riga di codice per ogni cella tale per cui se leggo un valore inferiore ai 2,5V (fino a tale tensione è arrivata la lettura in assenza di celle collegate), considero 0 quella cella.
Però la soluzione non mi garba molto perchè nel caso in cui una cella sia difettosa ( per esempio in caso di crash dell'elicottero capita non raramente che si sbelinino le lipo), rischio di non accorgermi del problema.

Altra soluzione potrebbe essere quella di dichiarare all'inizio dello sketch il numero di celle della lipo e quindi non leggere quelle eccedenti, ma volevo fare una cosa il più automatica possibile : accendo, collego, misuro, leggo e spengo.

Un'altra cosa che non so se può influenzare è quella di impostare una V di riferimento con l'apposita funzione, per la quale ho visto che spesso ci si basa sul diodo LM4040

Risolto questo problema, mi ingenio per collegare il mosfet alla scheda per attaccare le resistenze di carico, fare la 2° misurazione e tirar giù finalmente questa benedetta Resistenza Interna

Grazie
« Last Edit: June 14, 2014, 05:36:24 am by mgaproduction » Logged

0
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5895
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

potresti mettere una pulldown di alto valore su ogni ADC

per il ref ci sarebbe da implementare un algoritmo che lo gestisce per correggere le letture, e comunque quello da te scelto non vale la pena visto che ha una tolleranza troppo alta per questo progetto

Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vorrei ricordare che c'e' un partitore in ingresso, quindi c'e' gia' una resistenza.
Quando fai le letture da ADC devi scartare sempre la prima lettura


* partit.png (0.57 KB, 121x73 - viewed 24 times.)
Logged

Pages: 1 2 [3] 4 5 ... 7   Go Up
Jump to: