2016. február 20., szombat

Akkumulátor kapacitás mérés Arduinoval - Avagy merítsük le az akksikat


Üdvözlök mindenkit. Aki olvasta a tervemet, hogy a Keweisi kapacitás mérővel mérem majd meg a 18650-es akksik kapacitását, az tudja, hogy inkább egy Arduino-s megoldást választottam, mert pontosabb eredményt ad. Nem két napomba került, mire megtaláltam mi kell nekem, hasonló projekteket nézegetve az interneten. A kóddal is meggyűlt a bajom, de már működik minden ahogy kell. Ezzel a megoldással lehet 1,2 V-os NI-MH, NI-CD és 3,7V-os LI-ION vagy Polimer akksik kapacitását is mérni. Igazából aminek kisebb a feszültsége mint 5V, arra jó a kód és az alkatrészek.

A hozzávalók:

-Egy mikrokontroller, jelen esetben egy Arduino Duemilanove, ami nekem van. Természetesen nem egy eredeti Olasz gyártmány, hanem egy kínai utánzat. Már nem gyártják szerintem, csak az Uno-t és utánzatait, de nem változott rajta kb semmi. Ha valakinek más mikrokontrollere van akkor a bekötés is biztos más lesz.

-egy ellenállás. Na legalább 5W-os legyen, hogy bírja a terhelést. Én egy 3,9 OHM-os és egy 5,9 OHM-os ellenállást vettem. Minél kisebb értékűt építünk be, annál nagyobb árammal meríti az akksit. Miért kell legalább 5W-os? Mert ha a feszültség mondjuk 4 Volt és 1A-ral akarom meríteni az akksit, akkor az 4W teljesítmény ami hővé alakul az ellenálláson. Az OMH törvény alapján 4V-nál és 3,9 OHM-os ellenállásnál kb 1A-rel meríti az akksit majd. Persze ahogy csökken az akksi feszültsége az áramerősség is csökken. Ha viszont az 5,9 OHM-os ellenállást rakom be, akkor 4V-nál 677mA-rel fogja meríteni az akksit. A 4V-ot a teljesen feltöltött Li-ion cellák miatt használom. Ez csak egy példa. De mondjuk egy AAA 1,2V NI-MH akksinál így alakulnak a számok: a 3,9 OHM-os ellenállással 307mA-rel fogja meríteni, amit elvileg el is bírnak. Túl nagy árammal nem szabad a NI-MH-kat meríteni azért, mintha ezt olvastam volna valahol. Úgy tűnik nyugodtan lehet őket 1A-rel is meríteni. Mindenki ki tudja számolni ő mekkora áramerősséggel merítene és mit.

-egy MOSFET. Amit én használok az egy három lábú, IRLU8256-os. Ezen keresztül lehet az áramkört nyitni és zárni az Arduinoval. Mintha egy kapcsoló lenne, csak a kód alapján nyit vagy zár. Li-ion esetében pl. 3V-nál bontja az áramkört, nehogy túlmerítse a cellákat.
A fontosabb tulajdonságok: Vds=25V, ez legyen több mint 5V, így bírja a feszültésget. Rds=kb. 5mOHM, itt a minél kisebb érték a jobb, hogy minél kisebb legyen a FET ellenállása. Vgs. Ennek az értéknek elég alacsonynak kell lennie, hogy az Arduino 5V feszültségével aktiválni tudja a FET-et.

-egy merítendő akkumulátor. Lehet venni foglalatot neki amibe teszi az ember, de az pénzbe kerül meg venni kell. Ráadásul nagyon nem is kaptam alkatrészboltban 18650-es foglalatot. Tehát én mágnesekkel rögzítem az akkuhoz a kábeleket.

Ennyi. Még olvastam máshol, hogy a MOSFET-en is mérik a feszültséget és ha van rajta veszteség, akkor azt is felhasználják a kalkulációhoz. Nekem itt mindig 0-t mért az arduino, úgyhogy kihagytam.

A két másik típus ahonnan az ihletet merítettem: Egyik, másik.

Figyelem! Az ellenállás, merítés közben annyira felmelegszik, hogy éget. Persze nem ég el, de forró lesz. Arra figyeljünk, ha megszakítjuk a kódot vagy kihúzzuk az Arduinot, lehet, hogy a MOSFET nyitva marad egy ideig és meríti tovább az akkumulátort. Soha ne hagyjuk őrizetlenül. Természetesen semmilyen felelősséget nem vállalok a károkért ami a megépítés közben vagy után okozódik.

Ha nem csatlakoztatunk akkumulátort az áramkörhöz és elindítjuk a kódot, teljesen fals feszültségértékeket fog mérni.
A képen látható hogyan kell bekötni az alkatrészeket. Itt két sorba kötött akkumulátor van a képen, de csak mert nem volt más fotó a programban. Én egyszerre egyet szoktam meríteni.

Az Arduino kód:

#define MIN_VOLTAGE      950   // mV ez alá ne essen a feszültség LI-ionnál: 3000, NI-MH-nál:950

int FETPin = 13;      // kiválasztjuk a használni kívánt digitális kimenetet a LED-nek és a FET-nek
int BatVoltage = 0;
int STOPI = 0;
float loadCurrent, TotalCurrent, TotalCurrent2, onescurrent;
int sec = 1;

void setup() {
  unsigned long PrevTime;
  Serial.begin(9600);// serial port megnyitása és az adatok küldése a PC-nek
  pinMode(FETPin, OUTPUT);
  digitalWrite(FETPin, LOW); 
  Serial.println("6"); //visszaszámlálás a merítés kezdetéig, én itt szoktam csatlakoztatni az akkumulátort
  delay(1000); 
  Serial.println("5");
  delay(1000); 
  Serial.println("4");
  delay(1000); 
  Serial.println("3");
  delay(1000); 
  Serial.println("2");
  delay(1000); 
  Serial.println("1");
  delay(1000); 
  
  Serial.println("START!");
  int val1 = analogRead(0); //a kiinduló feszültség megmérése
  BatVoltage = map(val1, 0,1023,0,5000);;
  Serial.print("Starting voltage in mV=");
  Serial.println(BatVoltage + 40); //itt 40-et hozzáadtam a mért értékhez mert az Arduino ennyivel kevesebbet mért
}

void loop() {
  
  
  if(STOPI != 1){
    
    digitalWrite(FETPin, HIGH);  //aktiválódik a meríto áramkör
    int val1 = analogRead(0); 
    BatVoltage = map(val1, 0,1023,0,5000);;
    
    loadCurrent = (BatVoltage + 40) / 3.9;              //a végén az osztásnál az ellenállást amit beraktunk kell pontosan beírni OHM-ban

    onescurrent =  loadCurrent / 3.6;			//itt az egy másodpercre eso áramerosséget számoljuk ki
    TotalCurrent = onescurrent + TotalCurrent;
        
    Serial.print(BatVoltage + 40);
    Serial.print(" mV   I=");
    Serial.print(loadCurrent);  		//a pillanatnyi áramerosség
    Serial.print(" mA   Time=");
    Serial.print(sec);
    Serial.print(" s   Totalcurrent=");
    Serial.print(TotalCurrent / 1000);		// a teljes mért kapacitás az ido függvényében
    Serial.println(" mAh");
    sec = sec + 1;
    if(BatVoltage + 40 <= MIN_VOLTAGE){
      STOPI = 1;
      Serial.println("Voltage is lower then the set min Voltage STOP!");
    }
  }
  else{
    digitalWrite(FETPin, LOW);  
  }
  delay(1000);  // egy másodpercenként új mintát veszünk
}

A mért kapacitás érték persze csak tájékoztató értékű, mivel pl. minél nagyobb áramerősséggel merítünk egy akkumulátort, annál kevesebb kapacitást tud leadni. 


Nincsenek megjegyzések:

Megjegyzés küldése