Arduino - Pomiar pojemności akumulatora

Z racji tego, że ostatnio zamawialiśmy w firmie sporą pakę z akumulatorami i panowie z Hongkongu "zapomnieli" opisać jaką pojemność mają ogniwa trzeba było je pomierzyć. Zaraz ktoś się doczepi, że można było prościej, tak można było jednak przy tej mnogości wersji ( 60 różnych ) tak jest wygodniej. Mogłem oczywiście mniej więcej określić ich pojemność  znając pobór prądu oraz  czas działania akumulatora jednak jest to metoda mniej więcej dokładna. Najprościej było by zakup gotowego miernika pojemności, jednak potrzeba szybkiego ogarnięcia sprawy wymusiła produkcję miernika samemu. Cały miernik został wykonany z elementów które miałem pod ręką.

Jak działa układ ?

Cała zasada opiera się o badanie spadku napięcia na pierwszym rezystorze 1Ω. Jeżeli znamy jego rezystancję jesteśmy w stanie określić prąd w oczku. Na wyświetlaczu podczas pomiaru możemy obserwować bieżące napięcie akumulatora i prąd płynący w obwodzie oraz bieżącą pojemność.  Jeżeli napięcie spadnie poniżej 2.8V układ kończy pomiar, MOSFET  rozłącza obwód pomiarowy oraz na wyświetlaczu pojawia się wartość końcowa pojemności. Średni błąd pomiarowy układu wacha się między 80-120mA, dla mnie jest to wystarczające, gdyż pod „młotek” trafiały akumulatory od 4000mAh w górę.

Do wykonania będą nam potrzebne następujące elementy:

- Arduino np. Arduino nano,
- Tranzystor MOSFET IRFZ44N lub zamiennik
- Rezystor 1Ω / 5W (zalecany radiator)
- Rezystor 3,9-4,2Ω/ 5W (zalecany radiator)
- Wyświetlacz 16x2 wraz z modułem I2C
- Wentylatorek na 5V jako opcja (ja musiałem założyć gdyż układ pracuje prawie bez przestoju)

Schemat ideowy połączeń z Arduino:

Arduino tester pojemności akumulatorów

Kod programu:

// Copyright © by swistak
// www.tranzystor.pl
// I2C piny
//VCC - > 5V
//GND - GND
//SCL -> A5
//SDA -> A4

#define mosfet 13
#define highPin A1
#define lowPin A0
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27

boolean koniec = false;
int interwal = 5000;  //Interval (ms) between measurements

float mAh = 0.0;
float rezystancja = 1.0; 
float napRef = 4.58; // wartość napięcia zasilającego sprawdz pin 5V
float prad = 0.0;
float battVolt = 0.0;
float shuntVolt = 0.0;
float battLow = 2.8;

unsigned long previousMillis = 0;
unsigned long millisPassed = 0;

void setup() {

  pinMode(mosfet, OUTPUT);
  digitalWrite(mosfet, LOW);
  lcd.begin(16,2);
  lcd.home();
  lcd.print("Test ogniwa");
  lcd.setCursor(0,1);
  lcd.print("Tranzystor.pl");
  delay(2000);
  lcd.clear();
}

void loop() {

  battVolt = analogRead(highPin) * napRef / 1024.0;
  shuntVolt = analogRead(lowPin) * napRef / 1024.0;
  
  if(battVolt >= battLow && koniec == false)
  {
      digitalWrite(mosfet, HIGH);
      millisPassed = millis() - previousMillis;
      prad = (battVolt - shuntVolt) / rezystancja;
      mAh = mAh + (prad * 1000.0) * (millisPassed / 3600000.0);
      previousMillis = millis();
      lcd.clear();
      lcd.home();
      lcd.print("U:");
      lcd.print(battVolt);
      lcd.print("V");
      lcd.setCursor(9,0);
      lcd.print("I:");
      lcd.print(prad);
      lcd.print("A");
      lcd.setCursor(0,1);
      lcd.print(mAh);
      lcd.print("mAh");
      delay(interwal);
  }
  if(battVolt < battLow)
  {
      digitalWrite(mosfet, LOW);   
      koniec = true;
      lcd.clear();
      lcd.home();
      lcd.print("Koniec pomiaru");
      lcd.setCursor(0,1);
      lcd.print(mAh);
      lcd.print("mAh ");
      delay(interwal * 2);
  }

Wygląd zmontowanego układu:

miernik pojemności akumulatorów z wyświetlaczem LCD


Napisane przez swistak dnia lipiec 19 2017
0 komentarzy · 140 czytań · Drukuj

Ten artykuł został otagowany

Komentarze

Brak komentarzy. Może czas dodać swój?

Dodaj komentarz

Zaloguj się, aby móc dodać komentarz.

Oceny

Tylko zarejestrowani użytkownicy mogą oceniać zawartość strony
Zaloguj się lub zarejestruj, żeby móc zagłosować.

Brak ocen. Może czas dodać swoją?