Tester rezystancji wewnętrznej ogniw 18650

Ogniwa Li-Ion 18650 są głównym źródłem zasilania moich „zabawek”. Owszem – wymagają odpowiedniej ładowarki, trzeba kontrolować stan ich napięcia, są większe niż „normalne” paluszki. Za to dają duże prądy a nominalne napięcie pojedynczego ogniwa to 3.7 v – naładowanego nawet 4.2v.

Wbrew pozorom, 18650 są łatwo osiągalne. Pozyskuję je z baterii od laptopów czy power banków. Tuż po wyłuskaniu ich z „opakowania” konieczna jest ocena ich jakości. Pierwszy sprawdzian jest łatwy – wystarczy zmierzyć ich napięcie. Jeżeli jest zbyt niskie – nawet nie biorę się za ich ładowanie. Absolutną granicą jest dla mnie 3v. Ładowanie ogniw, które dłużej leżały rozładowane najczęściej nie daje dobrych rezultatów – będzie to trwało wieki (cykle ładowania i rozładowania), wymaga czasami „kopa” napięciowego – a na koniec wepchniecie w nie jedynie kilkaset mAh. Najbardziej lubię takie ogniwa, które mają 3.5v i więcej – dają najwięcej energii.

Napięcie to jednak nie wszystko. Jeszcze bardziej liczy się rezystancja wewnętrzna baterii.

UWAGA: ogniwa 18650 mogą być niebezpieczne! Przeładowane, rozładowane, zwarte – mogą zapalić się, a nawet eksplodować. Samo wyłupywanie ich z baterii laptopowych może doprowadzić do ich uszkodzenia, spięcia i pożaru. Do ładowania takich ogniw używajcie jedynie profesjonalnych, tylko do tego przeznaczonych ładowarek. Nigdy nie zostawiajcie ładujących się ogniw bez nadzoru (np. na noc). To jest realne zagrożenie dla Waszego zdrowia i mienia. Pamiętajcie – wszystko robicie na własną odpowiedzialność.

Im mniejsza rezystancja wewnętrzna, tym więcej prądu można wyciągnąć z baterii – zwłaszcza chwilowo. W przypadku li-ion rezystancja wewnętrzna liczona jest w miliOhmach (tysięcznych części Ohma).

Gdzieś w sieci natrafiłem na tabelkę:

mOhm Przy napięciu
Jakość
75-150mOhm 3.6V Doskonała
150-250mOhm 3.6V Dobra
250-350mOhm 3.6V Dostateczna
350-500mOhm 3.6V Kiepska
Ponad 500mOhm 3.6V Do utylizacji

Pomiar rezystancji wewnętrznej – metoda „ręczna”

Pomiar „ręczny” jest całkiem prosty:

  • Mierzycie napięcie na ogniwie – notujecie jako U,
  • Wybieracie rezystor RL, np. 10Ω/5W.
  • Z miernikiem podłączonym do ogniwa jak poprzednio, łączycie styki ogniwa za pomocą rezystora.
  • Po kilku sekundach napięcie wskazywane przez miernik powinno się ustalić. Notujecie wartość napięcia jako UL,

Teraz, rezystancja baterii R to:
R = {({{U} \over {U_L}}-1) \cdot R_L}

Ważne: nie możecie wziąć „dowolnego” rezystora. Spójrzcie, dla RL=10Ω i ogniwa naładowanego do 4v, popłynie przez niego prąd IL:
{I_L}={U \over RL} = { {4v} \over {10\Omega}}=0.4A

A moc:
P = U \cdot {I_L} = 4v \cdot 0.4A = 1.6W

„Zwyczajne” rezystory wytrzymują moc 0.25W, więc podłączone do takiego ogniwa – zamienią się w (małą) pochodnię.

Problem z takimi pomiarami polega na tym, że są niezbyt dokładne. Mierniki nie ustalają się na jednym poziomie, skaczą na dziesiątych częściach wolta – a to robi dużą różnicę.

Pomiar za pomocą Arduino

Mój pomysł polega na zautomatyzowaniu metody ręcznej. Arduino będzie mierzyło napięcie na ogniwie, a potem je obciążało – i znowu mierzyło napięcie. W ten sposób będę mógł wyznaczyć rezystancję wewnętrzną ogniwa.

Schemat jest wręcz intuicyjny:

Jak to działa?

  • Arduino mierzy napięcie na baterii (na pinie A0),
  • Arduino steruje bazą tranzystora T1; wystawiając na podłączony do niego pin stan wysoki – otwiera tranzystor; tranzystor to zwykły 2n2222, rezystor bazy to 100Ω,
  • przez tranzystor płynie prąd ograniczany przez rezystor szeregowy RL,
  • Arduino mierzy napięcie na baterii,
  • Arduino przełącza w stan niski pin podłączony do tranzystora otwierając obwód – prąd obciążenia przestaje płynąć.

Zauważcie, że obwód pomiarowy podłączony jest do A0 przez rezystor R1 (tu: 4k7Ω). Jest to konieczne, gdyż inaczej… mierzone ogniwo zasiliłoby Arduino. Sprawdźcie sami – odpowiednie napięcie podane na piny analogowe… uruchomi Arduino:)

To samo wejście A0 podpięte jest do masy przez kolejny rezystor (R2). Jeżeli tego nie zrobicie, gdy ogniwo nie będzie podłączone – pin będzie „pływać”. Odczyty na pinie będą zmieniać się w dość nieprzewidywalny sposób. Podpięcie przez duży rezystor (tu 4k7Ω, tzw. pull-down) sprawi, że w razie braku ogniwa w mierniku – napięcie na pinie będzie równie 0v.

Widziałem projekty, w których pływające wejście analogowe wykorzystywano do inicjowania generatora liczb losowych.

Niestety taki sposób postępowania ma również swoje konsekwencje. Między baterią, pinem Arduino i masą tworzy się dzielnik napięcia:

Napięcie baterii dzielone jest przez 2. Dokładniej, moje rezystory miały wartość 4657 (R2) i 4578 (R1), więc:
{k}={{4657+4578} \over {4657}}=1.983

Trzeba to uwzględnić w algorytmie.

Obciążenie RL

Przyjąłem, że obciążenie RL będzie miało wartość 10Ω. Biorąc pod uwagę „najgorszy” przypadek świeżo naładowanego ogniwa, prąd I płynący przez taki rezystor może mieć wartość nawet:
{I}={U \over R} = {{4.2} \over {10}} = 420 mA

Taki prąd powininen wystarczyć do przetestowania ogniwa. A moc:
{P}={U \cdot I} = {{4.2} \cdot {0.42}} = 1.764 W

Powinienem więc użyć rezystor, który, przeniesie taką moc. W sprzedaży są rezystory 5W, 10W – i większe (drutowe, cermentowe, z radiatorami). Problem polega na tym, że zajmują dużo miejsca.

A może zamiast 1 rezystora 10Ω o dużej mocy… użyć 10 rezystorów po 100Ω połączonych równolegle? Zgodnie z prawami Kirchoffa, prąd podzieli się między nimi – czyli po 176mW na rezystor (zakładając, że wszystkie są identyczne – co nie jest do końca prawdą). Wtedy można już użyć „zwyczajnych” elementów, o maksymalnej rozpraszanej mocy 250 mW.

Płytka sterująca

Sterowanie zmontowałem na zwykłej płytce przewlekanej, 5x7cm. Na płytce znalazło się miejsce na Arduino MiniPro, układ mierzący napięcie/obciążający ogniwo oraz wyjścia na wyświetlacz TM1637 i przycisk:

Przycisk podłączyłem do pinu D2. Dzieki czemu fakt jego wciśnięcia mogłem wykrywać za pomocą przerwania, np:

Podłączenie wyświetlacza opisałem tutaj: Wyświetlacz LED z TM1637.

Całość zasilana jest z baterii 9v.

Schemat

Miernik połączyłem jak poniżej.

UWAGA: nie sugerujcie się numerami pinów arduino_mini (U1). Nie pokrywają się z pinami płytki Arduino ProMini. Patrzcie tylko na ich opisy.

Podłączenie CONN1 wyprowadza piny dl obsługi wyświetlacza. Podłączenie CONN2 wyprowadza pin D2 dla przycisku. CONN3 to miejsce, gdzie podłączacie baterię.

Schemat wykonałem za pomocą Kicad. Biblioteka arduino pochodzi z: http://kicadhowto.org/LibLib.htm.

Obudowa

Najbardziej martwiło mnie znalezienie odpowiedniego „mocowania” dla ogniwa. Do zwykłych koszyków ogniwa wchodzą ciężko. Mnie zależało na uchwycie pewnym, ale umożliwiającym (stosunkowo) łatwą  wymianę baterii. Wybór padł na… chińską ładowarkę do 18650:

Z wnętrza została obudowa i niewielki kawałek płytki – włożonej na swoje miejsce w obudowie. Dolutowałem do niej przewody – również od diody LED (której w końcu nie użyłem).

Dolną część ładowarki przykręciłem na śrubki do boku obudowy:

Do górnej pokrywki przyczepiłem wyświetlacz i przycisk uruchamiający testowanie:

Na niej umieściłem też włącznik:

Całość – jeszcze bez baterii:

Kod

Kod nie należy do najkrótszych. Zawiera wzory znaczków na wyświetlaczu. Do analizy wyników użyłem również kilka funkcji statystycznych z biblioteki Statistics (trzeba ją najpierw zainstalować). Kod kompilowałem z Arduino IDE 1.8.5.

Oto on:

Kilka uwag do kodu:

  • PIN_CLK i PIN_DIO – piny, do których podłączyłem wyświetlacz; używane do stworzenia obiektu wyświetlacza TM1637Display (zmienna „display”),
  • PIN_BATTERY_V – do niego podłączyłem pomiar baterii (tu: A0),
  • PIN_TRANSISTOR – u mnie D9, pin który steruje tranzystorem,
  • PIN_KEY – u mnie D2, podłączyłem do niego przycisk,
  • tablice uint8_t display* – znaki dla wyświetlacza,
  • fmap() – odpowiednik funkcji map, ale działa na liczbach float (a nie całkowitych, jak oryginalna map), pobrana z http://forum.arduino.cc/index.php?topic=45042.0
  • readVcc() – odczytuje poziom napięcia zasilania – używam do skalowania procedur obliczania napięcia na baterii, więcej na: https://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/
  • measureBattery(): mierzy napięcie baterii; pomiary wykonuje dopóki odchylenie pomiaru jest mniejsze od zadanego lub pewną maksymalną ilość powtórzeń; za każdym razem wykonuje SAMPLES_NO pomiarów co SAMPLES_DELAY_MS milisekund,
  • doAct()  – tu następuje pomiar,
  • onButtonPressed() – obsługa przerwania wywoływana, gdy zostanie naciśnięty przycisk; ustawia zmienną ACT; jeżeli w loop() ACT jest ustawione – wywoływane jest doAct().

Testy – pomiar techniczny vs automatyczny

Dla losowo wybranych ogniw wykonałem pomiar techniczny i moim nowym miernikiem:

Ogniwo umin umax ulmin ulmax rwmin [mO] – oscyloskop rwmax [mO] – oscyloskop Pomiar 1 – miernik Pomiar 2 – … Pomiar 3 Pomiar 4 Pomiar 5
A 3.9 3.94 3.83 3.87 182 180 168 168 184 157 165
B 3.68 3.72 3.49 3.53 541 535 459 465 459 451 449
C 4.07 4.11 3.68 3.71 1053 1071 783 748  705 720 698
D 0.482 toss toss toss toss toss
E 3.73 3.76 3.63 3.67 274 244 163 176 164 172 186
F 3.98 4.01 3.9 3.93 204 203 159 171 162 151 153

Biorąc pod uwagę „skaczące” wyniki na mulimetrze, tym razem pomiary wykonywałem oscyloskopem. Stąd w tabelce znajdziecie wyniki „max” i „min”. Dla każdego ogniwa wykonałem też po 5 pomiarów miernikiem.

Tak pod obciążeniem zachowywało się ogniwo F (całkiem rześkie):

…Czego już nie można powiedzić o B – zauważcie, to samo odniesienie czasu, a większa rezystancja stawia „opór” przy oddawaniu prądu:

Kilka wniosków:

  • Ogniwo D wyrzuciłem już na początku. Miernik prawidłowo rozpoznał je jako uszkodzone – poszło do utylizacji,
  • Miernik (mimo zastosowanej pewnej statytyki przy ocenie wyników) jest stosunkowo precyzyjny – kolejne pomiar nie różniły się specjalnie,
  • Miernik był trochę bardziej optymistyczny, jeżeli chodzi o ocenę rezystancji wewnętrznej niż pomiary wykonane oscyloskopem. Co do zasady – jego pomiary właściwie odzwierciedlały stan ogniw.

Myślę, że miernik zdał ten test.

Kilka wniosków…

Generalnie całość działa całkiem sprawnie – mimo bardzo prostej metody pomiarowej. W stosunkowo szybki sposób pozwala mi oszacować jakość pozyskanego ogniwa. Kolejne pomiary dawały precyzyjne rezultaty.

Kilka uwag:

  • Największym problemem było uzyskanie precyzyjnych pomiarów (tzn. znajdujących się dostatecznie blisko siebie). Stąd trochę statystyki w kodzie…
  • Obciążanie rezystorami jest proste – ale przy takiej metodzie prąd obciążenia mierzonej baterii zależy od jej napięcia – czyli będzie inny dla każdej baterii. W następnej wersji pomyślę raczej o obciążeniu źródłem prądowym (zob. Mocy ubywaj…),
  • Zasilanie bramki tranzystora npn z pinu Arduino nie jest najlepszym pomysłem. Następnym razem użyję MOSFETA.
  • Przed montażem, mierzcie wszystkie rezystory.  Ewentualne odchylenia od wartości nominalnej będziecie mogli uwzględnić w  kodzie – przez co Wasze urządzenie będzie dokładniejsze.
  • MiniPro nie było najlepszym wyborem – brakuje mu pinu AREF. Przez to nie można łatwo podłączyć zewnętrznego źródła odniesienia napięcia – które sprawiłoby, że pomiary napięcia byłyby dokładniejsze. Rozwiązaniem może być przeniesienie płytki na Arduino Nano. Z drugiej strony – ze względu na odejmowanie napięć – dokładny pomiar nie jest konieczny (i przed i po obciążeniu niedokładności są takie same – więc się znoszą).

Galeria

To w przyszłości…

Źródła

18 thoughts on “Tester rezystancji wewnętrznej ogniw 18650”

    1. Witam,
      myślę, że nie jest on zbyt skomplikowany i wykonanie go nie powinno nastręczyć trudności… Więcej kłopotów sprawia właśnie obudowa – zmieszczenie wszystkiego i spasowanie. Ale myślę nad płytką PCB, może wtedy uda się zrobić większą serię?
      Dziękuję i pozdrawiam,
      Arek

    1. STM’y są fajne, o jednym nawet pisałem… ale są dużo droższe od Arduino – a tu ich moc nie jest potrzebna. Ostatni render w tekście to płytka nad którą myślę, ale muszę się trochę poduczyć:)

      1. Rozumiem. Przydałby się taki miernik do kupienia. Gdyby dokladniejszy był schemat (uwzględniający zastosowanie kilku rezystorow) i kod pod arduino nano to samemu może bym zrobił.

        1. Kod dla Nano i miniPro powinien być taki sam. Obydwa mają te same kontrolery – AtMega328. Jak będę miał chwilę to dorysuję schemat:)

          1. Dzień dobry. Czy schemat szczegółowy (z opisem elementów) da Pan radę narysować? Czy mógłby Pan wysłać mi na maila kod ale z komentarzami po polsku. Głównie chodzi o funkcje obliczajaca pojemność i napięcie aref ? Czy mogę zmienić wyświetlacz na np. LCD ze sterownikiem HD44780??
            Pozdrawiam

          2. Witaj,
            dodałem schemat. Za to rozgrzebałem kod, nowy będzie niedługo dostępny:) Jeżeli chodzi o komentarze – trzymam się angielskich, ponieważ kilku kolegów z zagranicy też tu zagląda. Nowy kod ma być prostszy, dodam w nim też więcej wyjaśnień.
            Oczywiście, że możesz użyć inny wyświetlacz – na blogu znajdziesz taki HD44 z modułem do i2c.
            Pozdrawiam,
            Arek

    1. Witam, tak, schemat już jest:) Za to rozgrzebałem kod, nowy będzie niedługo dostępny. Ma być trochę prostszy…
      Pozdrawiam,
      Arek

  1. Dzieki wielkie. Zbiore elementy wszystkie potrzebne i biore się za robote (kilka rezystorów jeszcze brakuje). A myślał Pan może nad modułem do mierzenia również pojemności ? Na yt jest kilka projektów ale nie ma porównania z profesjonalna ładowarką do tego przeznaczoną ?

  2. Miernik fajny ale jako modelarz przydał by się taki do testowania ogniw li-pol 3-4S z wyjścia galanteria. Ciekawe czy dało by się taki zbudować na podstawie tego schematu i kodu?

  3. Uwaga – nowy kod (wersja 0.6).
    – kilka poprawek w loop
    – dodane delaySecondsBreakOnACT() – czekaj nSeconds albo do przyciśnięcia przycisku
    – wyświetlanie napięcia włożonego ogniwa

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *