Tester rezystancji wewnętrznej ogniw 18650

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ć ich napięcie, są wrażliwe na uszkodzenia mechaniczne. Za to zajmują znacznie mniej miejsca niż odpowiadające im pakiety NiMH, dają duże prądy a nominalne napięcie pojedynczego ogniwa to nawet 4.2v.

Wiele z moich ogniw 18650 pochodzi z odzysku. Pierwszy test ich jakości jest łatwy – wystarczy zmierzyć ich napięcie. Jeżeli jest zbyt niskie (poniżej 3v) – nawet nie biorę się za ich ładowanie. Najbardziej lubię takie ogniwa, które mają 3.5v i więcej – po naładowaniu dadzą najwięcej energii.

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

Opublikuj swój projekt i odbierz 50% rabatu do wykorzystania w sklepie Nettigo.pl

UWAGA: ogniwa 18650 mogą być niebezpieczne! Uszkodzone, rozładowane, zwarte – mogą zapalić się, a nawet eksplodować. Do ładowania takich ogniw używajcie jedynie profesjonalnych i do tego przeznaczonych ładowarek. Nigdy nie zostawiajcie ładujących się ogniw bez nadzoru. 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 mili-ohmach (tysięcznych części Ohma, mΩ). W sieci natrafiłem na zestawienie:

  • 75-150mΩ – jakość doskonała,
  • 150-250 mΩ – jakość dobra,
  • 250-350 mΩ – jakość dostateczna,
  • 350-500 mΩ – jakość kiepska,
  • Ponad 500 mΩ – do utylizacji.

Pomiar rezystancji wewnętrznej – metoda „techniczna”

Pomiar „techniczny” jest całkiem prosty. Wystarczy do niego multimetr i rezystor, np. 10Ω. Kolejno:

  • Mierzycie napięcie na ogniwie – notujecie jako U,
  • Wybieracie rezystor RL, np. 10Ω/5W.
  • Z miernikiem podłączonym 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 wewnętrzna baterii R to:

Ważne: nie możecie wziąć „dowolnego” rezystora. Spójrzcie, dla RL=10Ω i „najgorszego” przypadku świeżo naładowanego ogniwa, prąd IL płynący przez taki rezystor może mieć wartość nawet:
IL =U / R = 4.2 / 10 = 420 mA

A moc:
P =U IL = 4.2 0.42 = 1.764 W

Musicie więc użyć rezystor, który będzie w stanie rozproszyć taką moc. Standardowe rezystory (których pełno w Waszej szufladzie) rozpraszają do 0.25W. Wykorzystane do takiego pomiaru zamienią się w (małą) pochodnię. W sprzedaży są oczywiście rezystory 5W, 10W – i większe (cermetowe, drutowe z radiatorami). Problem polega na tym, że zajmują dużo miejsca. Możecie również połączyć kilka rezystorów równolegle – przykład poniżej.

Dodatkowy problem z takimi pomiarami polega na tym, że nie są zbyt dokładne. Miernik nie ustala się na jednym poziomie, skacze na dziesiątych częściach wolta – a to robi dużą różnicę.

Pomiar za pomocą Arduino

Mój pomysł polega na zautomatyzowaniu metody technicznej. 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 do tego typu pomiarów:

Jak to działa?

  • Arduino mierzy napięcie na baterii (na pinie A0),
  • Arduino steruje bazą tranzystora; wystawiając na podłączony do niego pin stan wysoki – otwiera tranzystor i zamyka obwód; tranzystor to zwykły 2n2222, rezystor bazy to 470Ω,
  • 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 rozwierają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 do masy (tu 4k7Ω) sprawi, że w razie braku ogniwa w mierniku – napięcie na pinie będzie równie 0v (tzw. pull-down).

Niestety taki sposób postępowania ma również swoje konsekwencje. Między mierzonym ogniwem, 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:

Trzeba to uwzględnić w algorytmie (stała DIVIDER_RATIO).

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 IL płynący przez taki rezystor może mieć wartość nawet 420 mA a moc – 1.764W. Jak ustaliliśmy wcześniej – standardowy rezystor 0.25W spłonie – a cermety są trochę duże. 

A może zamiast jednego 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). 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 Pro Mini, układ mierzący napięcie/obciążający ogniwo oraz wyjścia na wyświetlacz TM1637 i przycisk uruchamiający pomiar:

Przycisk podłączyłem do pinu D2. Dzięki temu fakt jego wciśnięcia będę mógł wykrywać za pomocą przerwania. Podłączenie wyświetlacza opisałem tutaj: Wyświetlacz LED z TM1637. Całość zasilana jest z baterii 9v.

Schemat:

Podłączenie CONN1 wyprowadza piny do 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. UWAGA: nie sugerujcie się numerami pinów arduino_mini (U1). Nie pokrywają się z pinami płytki Arduino Pro Mini – atrzcie tylko na ich opisy.

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, przycisk uruchamiający testowanie oraz włącznik:

Całość:

Kod

Dzięki podłączeniu przycisku do D2 (PIN_KEY), mogę reagować na jego wciśnięcie za pomocą przerwania:

Pozostaje nie blokować kodu zbyt długimi „delay()”, a wciśnięcie przycisku będzie wykrywane natychmiast.

Do analizy wyników użyłem kilku funkcji statystycznych z biblioteki Statistics (trzeba ją najpierw zainstalować). Kod zawiera wzory znaczków na wyświetlaczu. Dodałem sporą ilość opisów pojawiających się na konsoli – dzięki temu łatwo śledzić jego działanie. 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 (z braku napięcia odniesienia), 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 niż zadane 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. Biorąc pod uwagę „skaczące” wyniki na mulimetrze, pomiar techniczny wykonywałem oscyloskopem – stąd w tabelce znajdziecie wyniki „max” i „min”. Dla każdego ogniwa wykonałem też po 5 pomiarów 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

Gdzie: umin-umax – min/max napięcie bez obciążenia, ulmin-ulmax – min/max napięcie na ogniwie wskazane przez oscyloskop, rwmin i rwmax – rezystancja wewnętrzna obliczona z min/max napięć, Pomiar x – kolejne pomiary miernikiem.

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

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

W związku z powyższym:

  • Ogniwo D wyrzuciłem już na początku. Miernik prawidłowo rozpoznał je jako uszkodzone – poszło do utylizacji,
  • Miernik jest stosunkowo precyzyjny – kolejne pomiary nie różniły się specjalnie,
  • Miernik był trochę bardziej „optymistyczny” niż wyniki obliczone na podstawie pomiarów oscyloskopem. Co do zasady jednak – pomiary właściwie odzwierciedlały stan ogniw.

Kilka uwag…

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.

Uwagi:

  • 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, może warto użyć 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.
  • ProMini 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 dzielenie napięć – dokładny pomiar nie jest konieczny (i przed i po obciążeniu niedokładności są takie same – więc się znoszą).

Tekst oryginalnie opublikowałem na moim blogu Elektronika Bez Spięcia.  

Galeria

Źródła

Ocena: 5/5 (głosów: 12)
Nettigo - patron działu Elektronika

Podobne posty

4 komentarzy do “Tester rezystancji wewnętrznej ogniw 18650

  • Wow!
    Tyle powiem (:

    Świetny artykuł i równie dobry projekt.

    A co do tranzystora to użycia bipolarnego jest dość złym pomysłem bo posiada on pewną całkiem nie małą rezystancję więc będzie się grzał / zmieniał odczyt. MOSFETY mają znacznie mniejszą rezystancję więc byłyby tu lepszym wyborem. Jeśli natomiast już chciałbyś pójść na całość to można wykorzystać przełącznik elektromechaniczny.

    Odpowiedz
  • Witajcie,
    Projekt żyje i cały czas korzystam z miernika – stąd 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,
    Pozdrawiam,
    A

    Odpowiedz

Odpowiedz

anuluj

Nie przegap nowych projektów!

Zapisując się na nasz Newsletter będziesz miał pewność, że nie przegapisz żadnego nowego projektu opublikowanego w Majsterkowie!

Od teraz nie przegapisz żadnego projektu!

Masz uwagi?