Merač kapacity akumulátorov
..jeho výstupom nie je údaj o kapacite akumátora...[PIC16F886]
jaromir, 17.01.2010-00:00



















Princíp merania

Princíp merania je veľmi prostý, je vlastne implikáciou toho, čo treba merať.
Nabitý článok sa vybíja známym prúdom. Nech je tento prúd popísaný ako funkcia času i(t) a vybíjanie trvá známy čas T. Potom je celkový náboj, ktorý vytiekol článkom, triviálne nazývaný jeho kapacitou, daný integrálom funkcie i(t) za čas T, teda



Riešenie tohto integrálu nemusí byť jednoduchou záležitosťou. Dá sa k nemu pristupovať v zásade piatimi metódami:
  1. Matematicky – toto je viacmenej teoretická možnosť. Vyžaduje to znalosť vybíjacej krivky akumulátoru ako časovej funkcie prúdu. Práve táto znalosť posúva túto metódu medzi teoretické metódy, inak by to bola veľmi elegantná a presná metóda. Po integrácii vybíjacej funkcie cez celú časovú oblasť vybíjania získame údaj o prenesenom náboji, resp. po prevode na vhodnejšie jednotky (Ah, resp. mAh) na kapacitu akumulátora.
  2. Fyzikálne - toto zahŕňa rôzne metódy, pri ktorých sa účinky pretekajúceho prúdu kumulujú do inej veličiny. Napríklad sa pretekjúcim prúdom stimuluje elektrolýza. Po jej ukončení sa zmeria zmena hmotnosti jednej elektród, na ktorých sa vylučuje prvok podľa použitého elektrolytu. Týmto sa vykonáva integrácia „sama od seba“, pretože vyplýva z princípu merania a hmotnosť vylúčeného prvku (zmeny hmotnosti elektródy) je úmerná náboju, ktorý pretiekol cez elektrolyt. Konštanta úmernosti závisí predovšetkým od typu elektrolytu. Táto metóda je síce priama, ale na praktické využitie existujú aj elegantnejšie metódy.
  3. Elektronicky, priamou integráciou – toto je elektronická obdoba predošlej metódy. Ako kumulačný prvok na uskutočnenie integrácie sa dá použiť povedzme kondenzátor, ktorý sa nabíja prúdovým zdrojom riadeným prúdom pretekajúcim cez akumulátor. Na kondenzátore sa týmto hromadí náboj, čo sa pri jeho nemennej kapacite prejaví zvyšovaním napätia. Po ukončení merania je na kondenzátore napätie priamo úmerné náboju, ktorý dodal článok, resp. jeho kapacite. Je to dosť „éterická“ metóda, pretože vyžaduje kondenzátory (a nielen kondenzátory) s malým zvodom a je prakticky ťažšie realizovateľná ako nasledujúce metódy.
  4. Neintegrovaním – pri tejto metóde sa postupuje tak, že vybíjacia funkcia má dopredu definovaný tvar a jej integrál je teda známy. Premennou je v tomto prípade len čas. Dá sa to najjednoduchšie dosiahnuť tak, že sa akumulátor vybíja konštantným prúdom – v tom prípade sa integrál vo všeobecnom tvare redukuje na súčin času a vybíjcieho prúdu. Takýto merač je už pomerne použiteľný. Skladá sa zo zdroja konštantného prúdu, tzv. current sink, čo sa dá preložiť popisne ako „obvod, ktorý odoberá konštantný prúd“ alebo „prúdový vcuc“. Ďalej je treba komparátor, ktorý ukončí meranie (a odpojí záťaž) v okamihu, keď sa napätie na akumulátore zmenší pod danú hranicu a nejaké časomerné zariadenie, napríklad čítač a časová základňa, alebo pokojne aj lacné ručičkové hodinky od aziatského predajcu za pol druha eura.
  5. Aproximáciou integrálu. V tejto metóde sa využívjú numerické spôsoby riešenia integrálov. Integrál sa rozdelí na konečné množstvo podintegrálov nenulovej veľkosti, ktoré viac alebo menej presne aproximujú vybíjaciu krivku. Integračné funkcie týchto podintegrálov sa volia tak, aby boli jednoducho riešiteľné, najčastejsie sú to lineárne alebo konštantné funkcie. Suma týchto podintegrálov sa potom blíži výsledku integrácie celého integrálu, presnosť je daná presnosťou aproximácie integrovanej funkcie, tá zas zavisí predovšetkým od počtu podintegrálov. Skutočnosť, že sa týmto postupom integrál transformuje na konečnú sumu nenulových prvkov je výhodná, pretože sa dá relatívne ľahko realizovať. Možnosťou je periodické meranie prúdu vytekujúceho z akumulátora A/D prevodníkom a jeho akumulácia v digitálnej podobe, napríklad v čítači poskladanom z TTL resp. MOS obvodov, alebo v registroch mikrokontroléra. Potom je nahromadený výsledok úmerný zmeranému náboju, čo je digitálnym ekvivalentom metódy 3.
    Dá sa modifikovať aj tak, že sa do pamäte zaznamenáva časový priebeh vybíjacej funkcie a plocha pod touto krivkou, vyjadrujúca pretečený náboj, sa numericky počíta po ukončení merania. Je to zrejme najviac univerzálna metóda, preto som jej dal prednosť pri realizácii môjho zariadenia.


Realizácia

Na uskutočnenie tohto cieľa som zvolil pomerne jednoduché riešenie – mikrokontrolér, sériovú EEPROM a trochu „bižutérie“. Mikrokontrolér je typ PIC16F886. Aby to nebola taká nuda, programoval som v jazyku symbolických adries, nesprávne nazývanom assembler. Aby to bola ešte väčšia zábava, zvolil som si typ EEPROM, ktorý som dovtedy ani raz nepoužil – Microwire EEPROM typ 93xx. Okrem toho je v zariadení minimalistické užívateľské rozhranie, tvorené dvomi LED a dvomi mechanickými spínačmi, relé a jemu zodpovedajúci spínaci tranzistor, zdroj referenčného napätia, odporový delič a minimalistický prevodník na RS232 rozhranie - hoci nezodpoveda RS232 požiadavkam, funguje. Nikdy by som ho nepoužil na „serióznu“ aplikáciu, ale na takéto domáce hranie postačuje.
Čo sa týka HW (obr. 1.), nie je príliš čo komentovať. Zapojené je to zhruba tak, ako je to logické, EEPROM využíva MSSP rozhranie prepnuté do SPI módu. Napätie z meraného akumulátora sa privádza, cez odporový delič (dva 2k2 rezistory, teda prenos 0,5) na pin RA0 (2). Ten slúži ako vstup AD prevodníka, ale je sem pripojený aj jeden vstup jedného z komparátorov. Druhý vstup komparátora je privedený na pin RA2 (4), kde sa privádza napätie z trimra zapojeného ako odporový delič. Nastavením tohto trimra sa mení rozhodovacia úroveň, pri ktorej sa článok považuje za vybitý a meranie sa končí. Referenčný zdroj s obvodom TL431 je druhým trimrom nastavený na hodnotu 4,096V (aby sa zjednodušilo prepočítavanie na volty) poskytuje napätie pre pin RA3 (5), ktorý slúži ako referencia pre AD prevodník v MCU. Pin RA4 (6) je digitálnym výstupom, ktorý spína tranzistor BC107, tento má v kolektore vinutie relé, ktoré odpája meraný článok od záťaže po ukončení merania. Pin RC6 (17) je Tx vývodom USART-u, naň je pripojený jednoduchý TTL-RS232 konvertor.
Zariadenie je napájané z jedného zdroja 5V, spotreba je daná predovšetkým použitým relé a spotrebou LED. Všetko je časované z interného oscilátora MCU.



Obr.1. Schéma – hnusná, ale ručná práca

Firmware

Tu som pôvodne plánoval rozsiahlejšie komentáre jednotlivých rutín, ale nakoniec ma prešla chuť. Verím, že ak by sa niekto zahĺbil do zdrojových kódov a niečomu by nerozumel, tak sa spýta v diskusii.
Celý firmware je jednoduchý stavový stroj s tromi stavmi – nečinný (0), meranie/zápis (1) a čítanie/odosielanie dát (2). Medzi nimi sa prepína pomocou tlačidiel B1 a B2.
Po zapnutí je prístroj v stave 0, svieti červená LED. Tlačidlom B1 sa uvedie do stavu 1, rozsvieti sa zelená LED, červená zhasne, zopne sa relé a začne sa meranie. Počas zápisu krátko blikne červená LED. V tomto stave zotrvá dovtedy, kým sa nestane jedna z nasledujúcich udalostí:
A, užívateľ stlačí tlačidlo B1,
B, napätie na meranom vstupe klesne pod úroveň nastavenú trimrom na pine RA2,
C, zapíše sa posledná lokácia v EEPROM.
Po výskyte jednej z týchto udalostí zostane v stave 0.
Zo stavu 0 sa stlačením tlačidla B2 uvedie do stavu 2, rozsvietia sa obe LED a zariadenie vysiela cez RS232 hodnoty z EEPROM, každá pozostáva presne zo štyroch cifier (napr. 1023, 0364, 0026 alebo 0002) reprezentujúcich hodnotu AD prevodu v danom čase merania a je odriadkovaná znakmi CR, LF (0x0D, 0x0A). Po odvysielaní všetkých hodnôt zariadenie prejde do stavu 0. Koniec nameraných hodnôt sa spozná podľa toho, že v hornom nibble vyššieho bajtu údajov je iné číslo ako 0. Pretože výstup z AD prevodníka je 10-bitový, pri normálnych dátach toto nenastane, ale len vtedy, ak je daná bunka EEPROM zmazaná, alebo ak sa narazí na hodnotu 0xAAAA, čo je údaj zapísaný pri opustení stavu 1.
Perióda merania sa dá nastaviť do štyroch hodnôt: 15s, 30s, 1m, 2m. Táto zmena sa uskutočňuje pomocou jumperov S1 a S2 (otvorený jumper = H).

Posprocessing

Pretože HW a FW boli volené veľmi jednoducho, zvyšok vyhodnocovania nameraných dát bolo treba prispôsobiť tejto skutočnosti. Tak ako tak to nie je nič zložité a stačí na to tabuľkový procesor ako Excel alebo jeho ekvivalent z OpenOffice. Na „odchyt“ nameraných dát sa dá použiť ľubovoľný terminálový program, ja používam Bray Terminal. Tieto dáta vyzerajú napríklad takto

  1. 0463
  2. 0463
  3. 0464
  4. 0464
  5. 0464
  6. 0462
  7. 0465
  8. 0464
  9. 0463
  10. 0463
  11. 0463


Sú to „surové“ dáta z AD prevodníka, ktoré treba ďalej spracovať. Je treba konverovať ich na hodnoty vo voltoch, čo je pomerne jednoduché.


Obr.2.

Na ich „vyhladenie“ je možné použiť plávajúci priemer, ja používam plávajúci priemer posledných troch hodnôt.


Obr.3.

Ako záťaž používam rezistor 60Ohm, takže sa dá jednoducho spočítať zaťažovací prúd.


Obr.4.

Teraz príde na rad numerický výpočet integrálu daného pod funkciou vybíjacieho prúdu. Celá vybíjacie funkcia sa rozdelí na rovnako veľké úseky, ktorých hranicou sú dve namerané hodnoty v dvoch rôznych časoch, teda u(tn) a u(tn+1) v časoch tn a tn+1. Z týchto bodov sa počítajú integrály, ktorých sumou je kapacita článku. Výpočet týchto integrálov je pomerne jednoduchý – je to plocha lichobežníka medzi bodmi u(tn) a u(tn+1) a časovou osou, vynásobená časovou diferenciou medzi meraniami (tn+1 - tn).


Obr.5.

Tieto hodnoty vyjadrujú čiastkové náboje ktoré odtiekli z článku počas daného časového obdobia. Súčtom týchto čiastok je celková kapacita článku, v mojom prípade je to 743mAh, článok je 750mAh kúpený v GM pred dvomi rokmi.
Kapacita článku je ten podstatný fakt, ale z vybíjacej charakteristiky sa dajú určiť aj iné veci. Napríklad sa dá zistiť, po akú hranicu sa „oplatí“ vybíjat článok. U Li-Ion článkov sa ako spodná hranica vybíjacieho napätia udáva hodnota 2,7 až 3V. Ak je takýto článok použitý na napájanie zariadenia s 3 alebo 3,3V LDO stabilizátorom, táto hranica je príliš nízka. Ak sa bude článok vybíjať napríklad na 3,4V, čo je hodnota dostatočná na činnosť 3,3V LDO, jeho využiteľná kapacita bude samozrejme menšia ako pri vybíjaní na 3V.


Obr.6.

Na obrázku 6 je vynesené napätie článku ako funkcia času, ako aj stupeň využitia kapacity (pomer odovzdaného náboja k celkovému, v percentách) ako závislosť času. Je zrejmé, že pri napätí 3,5V článok odovzdal už 95% celkovej kapacity, takže pokiaľ by nevadilo zmenšenie výdrže zariadenia o 5%, je možné stanovať vypínacie napätie na 3,5V, čo dáva dostatočnú rezervu pre LDO regulátor a navyše akumulátor sa odvďačí pomalšou degradáciou.
Z vybíjacej charakteristiky sa dá určiť aj napäťové hranice, pri ktorých zariadenie bude hlásiť stavy „nabitý“ – „hladný“ – „vybitý“ – „vypínam sa“.

Čo som s tým nameral

Dokopy nič. Zatiať len tri články, ale zariadenie vyzerá byť funkčné.
Pretože to beží z interného oscilátora, bol som zvedavý na presnosť tohto oscilátora. Microchip vo svojom datasheete uvádza presnosť max. +-2% pre rozsah Vdd 2,5 až 5,5V a zároveň teplotný rozsah 0 až 85 stupňov pána Celzia, čo je s rezervou dostatočné na UART. Meraním časového intervalu medzi poblikávaním červenej LED (pri zápise dát) som zmeral chybu asi 1s za 8minút, resp. 480s, čo je asi 0,2%, pri napájaní 5,05V a izbovej teplote 23 stupňov. Ďalšie merania (pri premenlivej teplote alebo napájacom napätí) som nerobil, pretože je veľmi pravdepodobné, že tých zopár meraní, ktoré budem robiť, bude prebiehať za tých istých podmienok.

FAQ

  1. Q: Prečo si to urobil ako si to urobil? PIC16 programovaný v „assembleri“, MicroWire EEPROM... je to ťažko portovateľné.
    A: No pretože takto to bola sranda. Profesionálne projekty píšem v C a často používam lepšie MCU, tak som chcel zmenu a aj to programovanie si vychutnať. A navyše s EEPROM typu 93xx som ešte prakticky nepracoval, tak som sa s nimi chcel pohrať, kým tieto nie príliš perspektívne typy pamätí upadnú do zabudnutia.

  2. Q: Prečo si na meranie kapacity článku nepoužil metódu 4? Vyzerá byť jednoduchšia...
    A: Lebo som to urobil takto, chcel som to zložitejšie než jednoduché. A navyše, grafy sú krajšie než jedno suché číslo.

  3. Q: Prečo si tam nedal displej a nepočítaš ten integrál priamo v MCU, okrem toho, že sa logujú dáta?
    A: Zas až tak som to komplikovať nechcel. Čím viac funkcií, tým treba vac testovania – ten prístroj budem používať len veľmi zriedkavo. Napísanie tohto firmware mi trvalo jeden večer – beriem to tak, že radšej mať fungujúce zariadenie s obmedzenou funkcionalitou, ako komzickú loď na papieroch.

  4. Q: Prečo je tá schéma tak hnusne nakreslná na papieri?
    A: Počas vývoja som nijakú nemal, tak som pre potreby tohto článku jednu zhlobil, aspoň na papier. Nejeden konštruktér by ju aj tak na realizáciu svojej kópie zariadenia aj tak nepotreboval...

Errata

  1. Jeden „bug“, ktorý som neodstránil, lebo sa mi ukázal ako celkom použiteľný – tak sa z neho stala „feature“.
    Ide o to, že pointer, ukazujúci adresu v EEPROM, kam sa budú zapisovať nasledujúce zmerané údaje sa nuluje len po resete, nie na začiatku merania. To znamená, že po resete sa dáta správne zapisujú od nuly. Pri skončení merania sa zapíše ukončovací znak 0xAAAA. Ak sa spustí ďalšie meranie, pointer sa nevynuluje a zapisuje sa ďalej, po ukončení merania sa opať zapíše 0xAAAA. Ak sa však spustí prenos dát, pointer čítania sa vynuluje, číta sa od začiatku až po prvé 0xAAAA. Ak sa spustí prenos ešte raz, tak sa opäť číta od začiatku, čiže druhé meranie je „nevyčítateľné“, ale zas na druhú stranu, prvé meranie zostane nedotknuté.
    Workaround je taký, že sa pred štartom každého merania musí urobiť reset. Takže ak sa po meraní človeku podarí stlačiť druhé tlačidlo, drahocenné dáta sa nepoškodia.

  2. Namerané hodnoty sú „roztrasené“ viac ako sa mi páči. Zrejme zlé nastavenie A/D prevodníka alebo mizerný layout bastl dosky (skôr to druhé), zaznamenaný údaj je len jedno meranie, žiadne opakované merania, žiadne priemerovanie. Možno vo verzii 1.1.


V prílohe nájdete zdrojový kód (ASM) a projekt pre MPLAB (36_mplab_projekt.zip).


tento článok je z mikroZONE
( https://www.mikrozone.sk/pluginy/content/content.php?content.36 )