maanantai 24. kesäkuuta 2019

AKUN KAPASITEETTIMITTAUS I

Otsikossa on ykkönen sen vuoksi, että tähän akun kapasiteetin mittaukseen akku pitää ladata ulkoisella laturilla esim. verkkovirrasta. Seuraavan (II) sovelluksen on tarkoitus sopia olosuhteisiin, missä verkkovirtaa ei ole käytettävissä, vaan sähkövarastona käytettäviä akkuja ladataan aurinkopaneeleilla tai tuuligeneraattoreilla. Testattavana oleva akku ladataan siis toisten akkujen avulla.

Akkukin kuluu käytössä, joten on hyvä tietää paljonko akussa on kapasiteettia jäljellä. Tässä mittarissa purkauksen kuormituksena on lamppuja ( 1 .. 3, 21 W lamppua, 1,75 .. 5,25 ampeeria) ja virran mittaukseen käytetään Hall-anturia (alue 0 .. 50 A). Anturin mittausalue on huomattavasti laajempi kuin purkausvirrat, joten kovin hyvään tarkkuuteen (muutama %) ei päästä, mutta se ei ole tarpeenkaan, sillä tarkoituksena on saada selville, onko akku vielä käyttökelpoinen vai syytä jo vaihtaa uuteen. Tuo 5 ampeerin virta on samaa luokkaa, mitä 12 V:n Peltier-elementillä toimiva jääkaappi kuluttaa, joten tämä on hyvä tutkimus juuri mökkikäyttöön.

Tämän päivän trendi on tallettaa energiaa, sillä enemmän ja enemmän ollaan siirtymässä sähköllä toimiviin laitteisiin. Energiaa saamme auringosta. Vaahtoamme uusiutuvasta energiasta. Tuuligeneraattorit, aurinkopaneelit, aurinkokeräimet jne. Ihan hyvä ja tällä hetkellä erittäin tärkeä argumentti, mutta tuo tuonne alkuun lykkäämäni sana ”vaahtoamme” johtuu siitä, että ihmisille halutaan antaa ”mielikuva” siitä, että auringon energia olisi uusiutuvaa. Ei ole! Aurinko muuttaa vedyn fuusioreaktiossa syntyvän energian fotovirraksi, mistä me saamme osamme (maapallon puolisko on vain pieni pläntti avaruudessa). Auringon vety ei uusiudu, sitä ei tule mistään lisää, mutta sen loppumista meistä kukaan tällä hetkellä täällä ihmettelevä ei tule näkemään. Käytetään siis sitä hyvällä omallatunnolla, sillä sen käyttö ei lisää kasvihuoneilmiötä, eikä se meidän elinaikanamme juurikaan vähene, eikä tulevien tuhansienkaan sukupolvien aikana sitä tee.

Nyt olen hiukan heikoilla jäillä. Etsin kyllä netistä ja tietosanakirjoista ja muista teknisistä lähteistä, mutta en oikein löytänyt tukea opiskeluaikani käsitykselle, että akun kapasiteetti standardin mukaan ilmoitetaan 10% purkausajalla. Toisin sanoen, jos akun kapasiteetiksi ilmoitetaan 100 Ah, niin 10 A:in virralla se pystyy syöttämään virtaa 10 tunnin ajan (lopussa 12 V:n akun jännite on noin 10,5 V). Tälle en löytänyt tukea, mutta kuten myöhemmin tässä käy ilmi, niin erisuuruisilla purkausvirroilla akun kapasiteetiksi saadaan erilaisia arvoja. Jos tuo standardi pitää paikkansa, niin kaupallisesti on tarjolla akkuja, joiden ampeerituntimäärä (Ah) on merkitty 20 tunnin aikana (5% purkausvirta kapasiteetista). Täten halutaan ostajalle antaa standardia positiivisempi mielikuva. Myös latausvirran olisi hyvä olla 10% kapasiteetista. Akutkin kehittyvät ja niitä voidaan myös pika ladata. Se tosin jossain määrin lyhentää akun käyttöikää.

Näissä testeissä olen käyttänyt vanhoja, käytöstä poistettuja akkuja. Ne ovat sopivia juuri tähän tarkoitukseen, sillä niiden kapasiteetit ovat hyvin vähissä, mistä johtuen purkautumista ei tarvitse odotella pitkään.
Esimerkki: purkausvirran vaikutuksesta akun kapasiteettiin: Testissä oli vanha 75 Ah akku, jossa oli jäljellä muutama ampeeritunti. Yhden lampun purkauksella (noin 1,7 A) kapasiteetiksi tuli 8,4 Ah ja kolmen lampun purkauksella noin 7 Ah. Kapasiteetti pieneni siis noin 17,5 %.

Tällä kerralla en ole piirtänyt kytkentäkaaviota. Tuo kuvassa näkyvä ”rakkine” ei ole varsinaisesti mikään laite, vaan alusta, mille on helppo kytkeä erilaisia yksikköjä vaihdellen aina tarpeen ja meneillään olevan ”projektin” mukaan. Sen pohja on sähköisen eriste (akryyliä), joten ei tarvitse huolehtia painettujen piirien oikosuluista.

Kun johdot on kytketty akkuun, tulee LCD-näyttöön kehotus käynnistyksestä. Koska ihminen on hätäinen (varsinkin tekniikasta kiinnostunut), alkaa laite mittaamaan ampeerisekunteja (Asek). Koko mittauksen ajan virta luetaan ja summataan sekunnin välein. Kun ensimmäinen minuutti on ohi, näyttöön päivittyy ampeeriminuutit (Amin). Saatu summa jaetaan nyt luvulla 60. Kun tunti tulee täyteen, päivittyvät ampeeritunnit (Atun Oikeastihan ne ovat As, Amin ja Ah) ja summa jaetaan luvulla 3600.

Kytkimillä voidaan valita 1, 2 tai 3 kpl 21 W:in lamppua kuormaksi. Kun akun jännite on laskenut 10,5 V:iin, päästää rele ja näyttöön ilmestyy kokonaisampeerimäärä sekä akun jännite, mikä hiukan nousee kuormituksen loputtua. Jos jännite laskee alle tuon rajan jo sekuntien tai minuuttien aikana, vapautuu kuorma ja näyttöön jää sen hetkinen kapasiteetti ja jännitearvo 10,5 V. Näyttöä ei enää päivitetä.



Ohjelmasta
Aluksi määritellään vakiot ja muuttujat. Asetuksissa (suoritetaan ainoastaan kerran) päivitetään ensimmäinen näyttö. Sen jälkeen on 1 s tauko, jotta tilanne stabiloituu. Sitten talletetaan Hall-generaattorin pohjalukema, mikä on noin puolet käyttöjännitteestä (5 V). Hall-generaattori mittaa magneettikentän voimakkuutta, joten ympäristökin vaikuttaa tähän pohjalukemaan. Siksi se pitää kerran tallettaa. Virran suunta joko kasvattaa tätä generaattorin lähtöarvoa tai pienentää sitä. Tämän arvon ja pohjalukeman erotuksesta muodostetaan mitattu virta-arvo. Lopuksi asetuksissa määritellään painike tuloksi ja rele lähdöksi.

Itse toimiva ohjelma muodostuu muutamasta sekvenssiaskeleesta ja parista aliohjelmasta. Toisessa aliohjelmassa päivitetään näytön tekstejä ja toisessa mitattuja numeroarvoja.

Ohjelma57
/***************************************
* AkunKapa
* 22.06.2019
* Akunkapasiteettimittaus.
**************************************/

// MÄÄRITTELYT:
// LCD-näyttö
   #include <LiquidCrystal.h>
   LiquidCrystal lcd(3, 2, 7,6,5,4);
   const byte api = B11100001; // ä

// Mittaukset
   const int Con_Akku = 0; // Akun jännitteen mittaus
   int Int_AkkuRaaka = 0;
   const int Con_Virta = 1; // Purkausvirran mittaus
   int Int_VirtaRaaka = 0;
   int Int_VirtaPohja = 0;
   float Flo_Akku = 0.0; // Akun jännitemittaus
   float Flo_Virta = 0.0; // Kuormitusvirran mittaus
   float Flo_Kapa = 0.00; // Laskettu kapasiteetti
   const float Con_Pohja = 0.25; // Laitteen omakäyttö

// Ohjaukset
   const int Con_START = 8;
   boolean Bol_START = false;
   const int Con_Rele = 9;
   boolean Kep_Rele = false;
   int Seq_Purku = 0; // Purkaussekvenssi

// Kellon määrittely (sisäinen kello)
   unsigned long Ulo_MilliSek = 0;
   unsigned long Ulo_UusiMilliSek = 0;
   const long CoL_EroSekunti = 999;
   long Lng_Sekunti = 0;
   boolean Bol_Tulosta = false;

// ALIOHJELMAT
// Tekstien päivitys
   void Fun_Tekstit(int kohta, int rivi,String teksti){
   lcd.setCursor(kohta, rivi);
   lcd.print(teksti);
   }// Teksti_ali loppu

//Numeroiden päivitys
   void Fun_Lukemat(int kohta, int rivi, float lukema){
   lcd.setCursor(kohta, rivi);
   lcd.print(lukema);
   }// Mittaus_ali loppu

// ASETUKSET:
   void setup(){
   Serial.begin(9600);
   lcd.begin(20,2);
   lcd.clear();
   lcd.setCursor(5, 0);
   lcd.print("K");
   lcd.write(api);
   lcd.print("ynnist");
   lcd.write(api);
   lcd.print(",");
   lcd.setCursor(4, 1);
   lcd.print("paina START");
   delay(1000);
// Hall-generaattin pohjatason talletus
   Int_VirtaPohja = analogRead(Con_Virta);
   pinMode(Con_START, INPUT_PULLUP);
   pinMode(Kep_Rele, OUTPUT);
   }// Asetuksen loppu

// PÄÄLOOPPI
   void loop(){
   // Sisäisen kellon käyttö
      Ulo_MilliSek = millis();
     if(Ulo_MilliSek - Ulo_UusiMilliSek > CoL_EroSekunti){
        Ulo_UusiMilliSek = Ulo_MilliSek;
         Lng_Sekunti++;
      if(Seq_Purku > 0 && Seq_Purku < 5){
         Flo_Kapa = Flo_Kapa + Flo_Virta;
      }
   // Akun jännitteenmittaus
      Int_AkkuRaaka = analogRead(Con_Akku);
      Flo_Akku = Int_AkkuRaaka / 68.2;
   // Purkuvirran mittaus
      Int_VirtaRaaka = analogRead(Con_Virta);
      Flo_Virta = (Int_VirtaRaaka - Int_VirtaPohja) / 8.7;
   }

   // Luetaan tulo
      Bol_START = !digitalRead(Con_START);
   // Käynnistetään purkusekvenssi
      if(Seq_Purku == 0 && Bol_START == true){
        Lng_Sekunti = 0;
        Seq_Purku = 1;
      }

   // Purkaussekvenssi
      switch (Seq_Purku) {
         case 1: // Päivitetään näyttö
            lcd.clear();
            Fun_Tekstit(0, 0, "Akun purku: V");
            Fun_Tekstit(13, 1, "A");
            Fun_Lukemat(16, 1, Flo_Virta);
            Kep_Rele = true;
            Seq_Purku = 2;
         break;
         case 2: // Ampeerisekunnit
            Fun_Lukemat(15, 0, Flo_Akku);
            Fun_Tekstit(0, 1, "Asek: ");
            Fun_Lukemat(6, 1, Flo_Kapa + Con_Pohja);
            Fun_Lukemat(16, 1, Flo_Virta);
            if(Flo_Akku < 10.5){ Seq_Purku = 0;Kep_Rele = false;}
            if(Lng_Sekunti >= 60){
               Fun_Tekstit(6, 1, " ");
         Seq_Purku = 3;
       }
      break;
      case 3: // Ampeeriminuutit
         Fun_Tekstit(0, 1, "Amin: ");
         Fun_Lukemat(6, 1, (Flo_Kapa + Con_Pohja)/60);
         Fun_Lukemat(15, 0, Flo_Akku);
         Fun_Lukemat(16, 1, Flo_Virta);
         if(Flo_Akku < 10.5){ Seq_Purku = 0;Kep_Rele = false;}
         if(Lng_Sekunti >= 3600){
            Fun_Tekstit(6, 1, " ");
         Seq_Purku = 4;
      }
      break;
      case 4: // Ampeeritunnit
         Fun_Tekstit(0, 1, "Atun: ");
         Fun_Lukemat(6, 1, (Flo_Kapa + Con_Pohja)/3600);
         Fun_Lukemat(15, 0, Flo_Akku);
         Fun_Lukemat(16, 1, Flo_Virta);
         if(Flo_Akku < 10.5){
            lcd.clear();
            Kep_Rele = false;
            Seq_Purku = 5;}
      break;
      case 5:
         Fun_Tekstit(0, 0, "VALMIS! V");
         Fun_Lukemat(15, 0, Flo_Akku);
         Fun_Tekstit(0, 1, "Akun kapas. Ah");
         Fun_Lukemat(15, 1, (Flo_Kapa + Con_Pohja)/3600);
      break;
      }// Purkaussekvenssin loppu

// Releen ohjaus
      digitalWrite(Con_Rele, Kep_Rele);
      delay(1);
} // Pääohjelma LOPPU







Ei kommentteja:

Lähetä kommentti