• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ładowarka / tester 18650
#1
Bry Smile

Jako, że dostałem garść akumulatorków 18650 i nie widzę szans na ręczne ich testowanie,
to mam zamiar sklecić tester automagiczny...

Proces polegać będzie na ładowaniu wykorzystując ładowarkę TP4056 i późniejszym rozładowaniu
ze zbieraniem danych typu pojemność, pomiar rezystancji wewnętrznej.

Spisuje zarys algorytmu, jeśli coś głupiego napiszę proszę o uwagi Smile

- po załączeniu / włożeniu do koszyczka nowego akumulatorka próbujemy go ładować 
ładowarką TP4056. Proces ładowania obserwujemy mierząc prąd, napięcie i komunikaty ładowarki,
- po całkowitym naładowaniu odłączamy ładowarkę, kilka sekund przerwy i obciążamy ogniwo 
rezystorem <> 4Ohm, tak żeby prąd wyniósł nie więcej niż 1A, obliczamy rezystancję wewnętrzną,
- dalsze rozładowanie aż do 3V, logowanie pomiarów do pamięci nieulotnej,

- po zakończeniu rozładowywania, jeśli ogniwo wygląda nieźle czyli powiedzmy pojemność 
wyniosła conajmniej 1.6Ah, rezystancja była nie większa niż 300mOhm (przykład) uznajemy,
że ogniwo jest przyzwoite i kończymy zabawę,
- jeśli pojemność ogniwa jest podejrzanie niska / rezystancja wysoka ładujemy ogniwo ponownie,
- następnie rozładowanie prądem 0.2A (może 0.1A) i pomiary z logowaniem,
- koniec,

Pomiary zapisywane w pamięć nieulotną (jak wystarczy miejsca) - po uruchomieniu wyświetlane
ostatnie wyniki, po wybraniu z menu opcji wysłanie danych na RS w celu wyplotowania, czy cóś...

Jako kontrolera użyję Arduino Mega 2560 bo mam nadmiar Wink Informacje o stanie ładowarki
mam zamiar pobrać z diód statusowych, załączenie obciążenia przy rozładowywaniu przekaźnikiem
dla prądu 1A, oraz przekaźnikiem kontaktronowym dla prądu niskiego.
Załączanie ładowarki również przekaźnikiem kontaktronowym (bo mam i są małe Smile).
Zrobię jeszcze pomiar temperatury w obudowie i może dołożę malutki wentylatorek...

Tyle zarysu, powoli będę dłubał Smile

Jakub
 
Odpowiedź
#2
Łącze elementy do kupy. Na razie zrobiłem zaległy pomiar z ciekawości:
Atmega 328 @8MHz, tryb low power, normalny i świecenie LEDem.
W low power pobiera 45uA co się już nie mierzy Smile wiec trzeba na wiarę Wink

https://docs.google.com/spreadsheets/d/1...sp=sharing

Może w weekend ciąg dalszy zabawy.

Jakub
 
Odpowiedź
#3
Hehe napotkałem ciekawy problem - łapię "free energy" z kosmosu Smile

Zmieniłem trochę układ tak, żeby mierzył napięcie i prąd podłączonej zewnętrznej baterii
a nie jak dotychczas stabilizatora 5V i pojawiło się napięcie "z nikąd".
Nawet bez podłączonej baterii / zasilacza INA pokazuje do około 0.5V pływającego nap.
Chwilę zajęło mi stwierdzenie, że pin wejściowy łapie napięcie ...z powietrza -
wystarczy podłączyć kawałek przewodu w charakterze anteny i już mamy darmową energię Wink

Próbowałem jakoś inaczej kabelki poukładać, zasilać układ z USB, zasilacza -
jakoś nie widzę różnicy. Wpinam kawałek przewodu do pinu wejściowego
(pomiar napięcia) i cyk - jest pływające napięcie Smile

ech
 
Odpowiedź
#4
OK, zwarłem ten pin z masą kondensatorem 100nF i problem w zasadzie zniknął.
Zwiększyłem oversampling przy pomiarze napięcia do 1024 i jest dobrze - czasami
pojawi się jakieś lewe +-0.01 ale nie więcej Smile

Jakub
 
Odpowiedź
#5
Pierwsza funkcjonalność działa: pomiar małych prądów z obliczeniem czasu pracy na akumulatorku 2Ah.
Tutaj akurat odbiornikiem jest Atmega 328 na 8MHz usypiana na 55s, po czym 1s świecenia LEDem Smile
I tak w kółko. Wychodzi średni pobór prądu 0.000028A, akumulator 2Ah powinien wystarczyć na 3000 dni Smile

https://photos.app.goo.gl/k4z58jzy7xZiwCqQ6

Oczywiście taki układ służy niczemu - planuję zrobić kilka stacji pogodowych zasilanych z 18650 przesyłających
dane do logera po 433MHz. Przyda się informacja co jak wpływa na pobór prądu... Multimetrem tego nie zmierzę.

Jakub
 
Odpowiedź
#6
Mam problem z algorytmem zliczającym Ah i obliczającym z tego średni prąd.
Może Wy znajdziecie błąd Smile

Algorytm jest taki, że robię pomiary prądu ileś tam razy/s sumuję je obliczając średnią / s.
Potem mając pobrana Ah i czas wyliczam średni prąd.

Niestety gdzieś mam błąd i nie potrafię się zorientować gdzie - efekt jest taki,
że na początku pomiarów średni prąd obliczony jest mniejszy niż zmierzony
ale z upływem czasu różnica dąży do zera. Np tak (patrz "pomiarA (INA)":  i "Prąd obliczony"):


Kod:
12:50:04.351 -> V: 4.05; korektA (INA): 1.00300002; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004167931556; As: 0.01034064; Ah: 0.00000287
12:50:06.895 -> V: 4.05; korektA (INA): 1.00300002; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004190599441; As: 0.02111643; Ah: 0.00000587
12:50:09.444 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004197888374; As: 0.03189136; Ah: 0.00000886
12:50:12.026 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004201507091; As: 0.04266630; Ah: 0.00001185
12:50:14.574 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004203668117; As: 0.05344123; Ah: 0.00001484
12:50:17.121 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004205078125; As: 0.06421575; Ah: 0.00001784
12:50:19.698 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004206106185; As: 0.07499068; Ah: 0.00002083
12:50:22.244 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004206877708; As: 0.08576560; Ah: 0.00002382
.....
.....
.....
.....
13:31:59.750 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284609794; As: 10.78647422; Ah: 0.00299624
13:32:02.331 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284537315; As: 10.79725265; Ah: 0.00299924
13:32:04.875 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284465789; As: 10.80803108; Ah: 0.00300223
13:32:07.455 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284393310; As: 10.81880950; Ah: 0.00300522
13:32:10.003 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284321784; As: 10.82958793; Ah: 0.00300822
13:32:12.553 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284249305; As: 10.84036636; Ah: 0.00301121
13:32:15.099 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284177780; As: 10.85114574; Ah: 0.00301421
13:32:17.680 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284105777; As: 10.86192512; Ah: 0.00301720
13:32:20.226 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004284032821; As: 10.87270355; Ah: 0.00302020
13:32:22.810 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004283960342; As: 10.88348293; Ah: 0.00302319
13:32:25.355 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004283888339; As: 10.89426136; Ah: 0.00302618
13:32:27.901 -> V: 4.05; korektA (INA): 1.00199997; pomiarA (INA):  0.004299999713; Prąd obliczony: 0.004283815860; As: 10.9


Kod wygląda tak:

Kod:
    czasSTART=millis();
    gestoscPOMIARU=10; //ilosc pomiarow na 1s

} // setup()


void loop()
{

  if (millis() > msA + (1000/gestoscPOMIARU))
    {
      czasAKT=millis();
      pomiarA=ina.readShuntCurrent();
      czasPOMIARU=((czasAKT-czasSTART)/1000); //czas trwania okna pomiaru [s] - czasSTART to początek startu pomiarów

      korektA=1+(czasAKT-(czasOLD+(1000/gestoscPOMIARU)))/1000; // korekta na realny czas między pomiarami
      As=As+((pomiarA/gestoscPOMIARU)*korektA);
      Ah=As/3600;

      czasOLD=czasAKT;
      msA = millis();
    }

  if (millis() > msLCD + 2500)
    {
      czaspracy = (millis()-czasSTART)/1000; //czas pracy [s]
      prad=As/czaspracy;

      lcd.setCursor( 0, 0); lcd.print("V"); lcd.setCursor( 2, 0); lcd.print(ina.readBusVoltage(),1);
      lcd.setCursor( 6, 0); lcd.print("A"); lcd.setCursor( 8, 0); lcd.print(prad,6);
      lcd.setCursor( 0, 1); lcd.print("WD    "); lcd.setCursor( 3, 1); lcd.print(2/(prad*24),0);
      lcd.setCursor( 7 ,1); lcd.print("Ah      "); lcd.setCursor(10, 1); lcd.print(Ah,4);

      Serial.print("V: "); Serial.print(ina.readBusVoltage());
      Serial.print("; korektA (INA): "); Serial.print(korektA,8);
      Serial.print("; pomiarA (INA):  "); Serial.print(pomiarA,12);
      Serial.print("; Prąd obliczony: "); Serial.print(prad,12);
      Serial.print("; As: "); Serial.print(As,8);
      Serial.print("; Ah: "); Serial.println(Ah,8);
     
      msLCD = millis();
    }   
}

Z góry dzięki, za pomoc Smile

Jakub
 
Odpowiedź
#7
Ardunio nie obsługuje "duble" tylko float do 7 liczb wiec

0.004206 - jest prawda
877708 - jest fałszem

Moze dlatego ci się sypia liczenia??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#8
Takie buty... Nie wiedziałem.

Myślę jednak, że to inna sprawa, nie wiem jaka.

W samym algorytmie był błąd, w tej chwili wygląda tak i działa:


Kod:
if (millis() > msA + (1000/gestoscPOMIARU))
    {
      pomiarA=ina.readShuntCurrent();
      czasAKT=millis();
      czasPOMIARU=((czasAKT-czasOLD)/1000); //czas trwania okna pomiaru [s]

      As=As+(pomiarA*czasPOMIARU);

      czaspracy = (millis()-czasSTART)/1000; //czas pracy [s]
      prad=As/czaspracy;
     
      czasOLD=czasAKT;
      msA = millis();
    }

Nadal jest jakiś problem w efekcie którego pierwsze kilka(naście) pomiarów właściwych
i prądu obliczonego z mAs/s różnią się, ale dość szybko błąd zbliża się do zera z różnicami
na poziomie uA.

Sprawdzałem obciążając źródło rezystorami i wyniki są ok.

Poza rozładowywaniem LiPoli rezystorami ważniejsze nawet jest mierzenie poboru prądu
przez układy o poborze na poziomie kilkudziesięciu uA - bawię się w różne pierdoły zasilane
z używanych 18650...

W tej chwili testuję układ z Atmega 328@8MHz + BMP180 + nadajnik 433MHz - wygląda
na to, że powinien pracować na akumulatorku ze cztery lata albo i dłużej Smile

Jakub
 
Odpowiedź
#9
https://www.arduino.cc/reference/en/lang...es/double/
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#10
Cytat:"The float data type has only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0. You should instead check that the absolute value of the difference between the numbers is less than some small number."


To dobre jest. Może wynik będzie poprawny a może nie Wink 
Wygląda na to, że pomiarów na tym poziomie dokładności nie zrobię - mogę oczywiście 
zmienić rezystor bocznikowy i zmniejszyć zakres pomiarowy do zakresu uA, ale to mi
nie odpowiada bo chcę mieć zakres do około 1A.

Wpadłem teraz na pomysł, że przesunę sobie zakres pomiaru od drugiej strony - dołożę
równolegle do mierzonego układu rezystor który będzie pobierał powiedzmy 1mA
a reszta to już będzie prąd pobierany przez mierzony układ...

Hmm nie to chyba nic nie da niestety Sad

Jakub
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości