Всем привет.

Постольку поскольку у меня есть некоторое количество никелькадмиевых аккумуляторов найденных на помойке стояла задача их отбраковки.

Готовых измерителей емкости в 50АЧ и напряжением 1.2 В я не нашел. Пришлось копать интернет. Увидел вот такой проект для маломощных пальчиковых аккумуляторов. Отталкиваясь от него переписал программу под свои потребности. Пока самое простейшее, но тем не меннее позволяющее успешно тестировать аккумуляторы на остаточную емкость.

IMG 20141214 002857

 

Что было проделано:

1. Аккумуляторы разряжаются нестабилизированным током в 5-4А.

2. Добавлено усреденение показаний(1000 выборок на замер)

3. Избавился от Delay. Потому что функционал будет расширяться и в конце концов хочу сделать автоматизированный зарядно разрядный стенд. С контролем тока и логгированием на SD карту.

4. Добавлена индикация тока, и рассеиваемой мощности на резисторе. 

5. Добавлено отображение времени прошедшего с начала ктц. Поскольку дисплей 16*2 то алгоритм циклично показывает экран с основными параметрами (4 секунды) и экран со временем (1 секунда).

6. Оптимизирована работа с таймерами. Время отображается корректно несмотря что на обсчет показаний тратится приблизительно 100 мСек процессорного времени. 

7. Есть своего рода качели на разряд - по достижению нижнего порогового напряжения тест прекращается. При возвращении к рабочему - цикл продолжается.

В планах

1. Добавить режим заряда.

2. Добавить шим регулировку зарядного и разрядного тока. 

3. Добавить кнопки и меню с вариантами выбора параметров тестирования. 

 

Вот схема

Только резистор у меня 0,22 ома.

Полевой транзистор конечно же с логическим уровнем управления с материнских плат.

 IMG 20141214 002943

Вот код v5.0 рабочий. В коде есть вспомогательные переменные для будущих опций. Не обращайте на них внимания. Все работает.

 

#include <LiquidCrystal.h>

int sample = 1000;// Количество выборок за такт 

int interval = 0;

int sensorPin = 0;    // к пину Analog IN 0

int sensor2Pin = 2;   // к пину Analog IN 2

int ledPin = 6;      // пин затвора фета

int fetPin = 13;      // пин затвора 

int timing =0; // переменная используется для избавления от Delay()

int prevtiming=0; // переменная используется совместно с timing для избавления от delay()

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 1(lcd)-gnd; 2(lcd)-+5; 3(lcd)-gnd; 4(lcd)-12; 5(lcd)-gnd; 6(lcd)-11; 11(lcd)-5; 12(lcd)-4; 13(lcd)-3; 14(lcd)-2

int view = 0; //переменная меняющая экраны ; ее значение дальше в программе задает количество экранов 

int sec = 0; 

int sec1=0;

int minut = 0;

int hour = 0;

int sensorValue = 0;  // variable to store the value coming from the sensor1

int sensor2Value = 0;  // variable to store the value coming from the sensor2

long val =0;

long val2=0;

float VoltageBaterry = 0; // переменная для отображения вольтажа батареи

float AmpBaterry = 0; // переменная для отображения тока 

float PowerBaterry=0; // переменная для вычисления мощности 

float AhBaterry=0; // переменная для емкости

float val3=0;

void getval() {

   for (int i=0; i<1000; ++i) {

        val = val + analogRead(sensorPin);

        }

             VoltageBaterry = val*0.0048828/1000;

             val=0;

   for (int i=0; i<1000; ++i) {

        val2 = val2 + analogRead(sensor2Pin);

        }

             val3 = val2/1000*0.0048828;

      AmpBaterry = ((VoltageBaterry-val3)/0.22); // мгновенное значение тока последнее число - сопротивление нагрузочного резистора в омах

      val2=0;

      if(AmpBaterry<0) {

        AmpBaterry=AmpBaterry-AmpBaterry;

      }

      PowerBaterry =(AmpBaterry*VoltageBaterry); 

 }

 

void done() {

   

  digitalWrite(ledPin, LOW);   // set the fet off

  digitalWrite(fetPin, LOW);

   getval(); 

    

    lcd.setCursor(0, 0);

    lcd.print("I=");

    lcd.print(AmpBaterry);

    lcd.print("A ");

    lcd.setCursor(7, 0);

    lcd.print("    done");

    lcd.setCursor(7, 1);

  lcd.print(" AH=");

  lcd.print(AhBaterry);    

  lcd.print("   "); 

    lcd.setCursor (0, 1);

  lcd.print("V=");

  lcd.print(VoltageBaterry);

 lcd.print("V"); // выводим в сроку 2 0 позицию значение напряжения

 }

 

void active() {

      digitalWrite(ledPin, HIGH);   // set the LED on

      digitalWrite(fetPin, HIGH);   // set the LED on

      timing = millis() + prevtiming;

      if (timing>1000){  

      prevtiming= (millis()%1000) - millis();

      sec=sec+1;

      view=view+1;

      AhBaterry = AmpBaterry/3600 + AhBaterry;

           }

      if (view > 4) {

        view=0;

      }

      if (sec >59.00) {

        sec=0;

        minut=minut+1;

      }

        if (minut > 59) {

          hour=hour+1;

          minut=0;

        }

      

      if (view < 4) {

      window1();

      }

      else {

      window2();

      }

  }

  

void window1() { // процедура вывода информации на первый экран

  lcd.setCursor (0, 1);

  lcd.print("V=");

  lcd.print(VoltageBaterry); // выводим в сроку 2 0 позицию значение напряжения

  lcd.print("V");

  lcd.setCursor(7, 1);

  lcd.print(" AH=");

  lcd.print(AhBaterry);    

  lcd.print("   "); 

  lcd.setCursor(0, 0);// 1 line first char

  lcd.print("I=");

  lcd.print(AmpBaterry);

  lcd.print("A ");

  lcd.print("P=");

  lcd.print(PowerBaterry);

  lcd.print("W    ");

}

 

void window2() {

  lcd.setCursor(0, 1);

  lcd.print("                ");

  lcd.setCursor(0, 0);

  if (hour<10) {

  lcd.print("        0");

  lcd.print (hour);

  }

  else {

  lcd.print(hour);

}

 

lcd.print (":");

if (minut<10) {

  lcd.print ("0");

lcd.print(minut);

}

else

lcd.print (minut);

lcd.print(":");

if (sec<10) {

  lcd.print("0");

  lcd.print (sec);

}

  else {

    lcd.print (sec);

  }

  }

 

void setup() {

  

   Serial.begin(9600);

  //Инициализация последовательного порта

  

  pinMode(ledPin, OUTPUT);//activation led and enable for FET

  pinMode(fetPin, OUTPUT);//activation led and enable for FET

  lcd.begin(16, 2);// set up the LCD's number of rows and columns:

  lcd.print("Bat Tester v2.0");  // Print a message to the LCD.

  delay(2000);

  digitalWrite(ledPin, HIGH);   // set the LED on

  digitalWrite(fetPin, HIGH);   // set the LED on

  }

 

void loop() {

   

 

  getval();

   if (VoltageBaterry >0.95) {

   active();

   }

   else {

   done();

   }

   }