Автор Тема: "Разрядно" устройство, или как да измерим капацитета на батерията  (Прочетена 1741 пъти)

Неактивен juliang

  • Много Напреднал
  • *****
  • Публикации: 1 356
  • Рейтинг: 269


Това засега е сглобено "на коляно", с подръчни елементи. Единственото което прави в момента е да мери напрежение и време. Идеята в бъдеще е следната:
1. Ограничаване на минималното напрежение до което да пада батерията, за да не се повреди необратимо. Теста трябва да прекъсне при достигане на 3.0 волта (или ако съм садист - до 2.5 волта :) ).
2. "Наръч" от резистори, с възможност за избор на оптималния според капацитета на батерията.
3. Много евентуално и много напред в бъдещето - и функция за зареждане, и функция за балансиране ... абе нещо такова:


В момента ползвам наскоро дошлите ми Ардуино Уно, LCD Shield и real-time clock модул. Резистор 10 вата 5.1 ома като товар. Едно це-ка ключенце с което може да се прекъсне товара и едновременно с това да се спре часовника (ако човек иска да похапне и да не оставя батерията без надзор).

Код:
#include <virtuabotixRTC.h>
#include <LiquidCrystal.h>


// Creation of the Real Time Clock Object
//SCLK -> 6, I/O -> 7, CE -> 8
virtuabotixRTC myRTC(10, 11, 12);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte oldSeconds;
int analogPin = 1;
int startMeasurementPin = 3;
float voltage = 0.0;
String text;
float batteryCapacity = 0;
int elapsedTime = 0;

void setup() {
  Serial.begin(9600);
  pinMode(startMeasurementPin, INPUT);
  lcd.begin(16, 2);              // start the library
  // Set the current date, and time in the following format:
  // seconds, minutes, hours, day of the week, day of the month, month, year
  //myRTC.setDS1302Time(00, 22, 20, 2, 21, 2, 2017);
}

void loop() {
  // This allows for the update of variables for time or accessing the individual elements.
  myRTC.updateTime();
  if (oldSeconds != myRTC.seconds)
  {
    oldSeconds = myRTC.seconds;
    elapsedTime++;
    voltage = analogRead(analogPin) / 204.38;
    batteryCapacity += voltage / 5.1;
    lcd.setCursor(0, 0);
    lcd.print(String(voltage) + "V   ");
    if (digitalRead(startMeasurementPin) == LOW)
    {
      lcd.setCursor(6, 0);
      lcd.print(String(elapsedTime) + "s");
      lcd.setCursor(11, 0);
      lcd.print("RUN ");
      lcd.setCursor(0, 1);
      lcd.print("Capacity " + String(batteryCapacity / 3.6) + "mAh");
      //    lcd.print(getTimeAsString(myRTC));
    }
    else
    {
      lcd.setCursor(11, 0);
      lcd.print("STOP");
    }
  }
}

String getTimeAsString(virtuabotixRTC rtc)
{
  String result;
  result = "Time:";
  if (rtc.hours < 10) {
    result = result + "0";
  }
  result = result + rtc.hours + ":";
  if (rtc.minutes < 10) {
    result = result + "0";
  }
  result = result + rtc.minutes + ":";
  if (rtc.seconds < 10) {
    result = result + "0";
  }
  result = result + rtc.seconds;
  return result;
}

И по кода има неща за издялкване ... ма като за 1/2 час с налучкването на правилните библиотеки - толкоз :)
« Последна редакция: Февруари 24, 2017, 10:08:25 pm от juliang »

Неактивен Коев

  • Beginner
  • *
  • Публикации: 89
  • Рейтинг: 18
Ако го направиш да изключва разряда при достигане на 3,6 волта, ще става за тестване и на оловнокисели батерии/с две клетки/.За зареждане след теста може да се ползват зарядни за таблет-5в, 1или2А, на първо време.

Неактивен Радико

  • Много Напреднал
  • *****
  • Публикации: 2 588
  • Рейтинг: 227
  • Трдният начин е по лесен
    • http://martinov-radiko.blogspot.com/
  • Скайп: radiko1a
Юлияне аз лично проявявам интерес към това как точно си се справил с модула за точно време.
Би ли споделил повече за ,от къде го купи, имаше ли проблем с библиотеките, изобщо всичко за него защото и аз мисля да ползвам такъв модул и всяка информация би била полезна. 

Неактивен juliang

  • Много Напреднал
  • *****
  • Публикации: 1 356
  • Рейтинг: 269
Юлияне аз лично проявявам интерес към това как точно си се справил с модула за точно време.
Би ли споделил повече за ,от къде го купи, имаше ли проблем с библиотеките, изобщо всичко за него защото и аз мисля да ползвам такъв модул и всяка информация би била полезна.
Модула го взех от али-то - поръчах една камара модули за всякакви функции, без да подбирам много конкретното реализиране. Ето този точно:

Реално самия модул представлява един чип DS1302 ( https://datasheets.maximintegrated.com/en/ds/DS1302.pdf), кварцов резонатор на 32768 херца и гнездо за батерийка. Има 5 писти на кръст, никаква допълнителна логика - каквото предлага чипа, това е. В али-то има и по-евтини, и по-функционални модули за реално време.
Колко ще е точен модула зависи изцяло от точността на кварца. Чипа само брои и превръща броя импулси в удобен за човека вид - смята си дни от седмицата, съобразява се с високосни години и т.н. Един път като "го свериш" с определена команда от библиотеката можеш да го откачаш от ардуиното и да го оставяш някъде по чекмеджетата и той ще си цъка от батерийката. Специално моя не е много точен... бяга около минута на ден :)
Коя библиотека ще се ползва зависи изцяло от това какъв чип се ползва в определения модул. Има библиотеки които могат да се оправят с различни чипове, има специализирани (и съответно по-малки като обем) библиотечки които могат да обслужват само един чип. Но общо-взето предлагат четене на дата и час и запис на дата и час. Връщат цялата информация в един клас, пък ти си взимаш каквото ти е нужно.
Този чип DS1302 има и 31 байта памет в него, която също се крепи от батерията и там можеш да си запишеш някаква дата/час - примерно за аларма. Идеята е да не товариш това инфо в ардуиното и да не се грижиш за запазването му. Но и за там имаш само четене/запис - чипа няма да те уведоми че времето е настъпило, трябва сам да сравняваш.
Другото което не можах да намеря е фукнционалност за elapsed time - разлика между две времена, или нещо като хронометър. Нито хардуерно, нито като библиотека (не че търсих много де :) ). Трябва сам да си правиш сметките колко дни, часа, минути и секунди са изтекли между двете дати. Вероятно някой по-добър чип има тази функционалност.

Неактивен vsl

  • Активен
  • **
  • Публикации: 242
  • Рейтинг: 98
  • Скайп: vslengineering
Здравейте,

Ако се използва резистор за разреждане на батерия то тока няма да константен. Напрежението пада във всеки момент и тока също би намалил. Това което се използва е електронен товар или electronic load. Пускам примерен сайт и схема за Ардино.

http://jasper.sikken.nl/electronicload/index.html


Неактивен locco

  • Активен
  • **
  • Публикации: 276
  • Рейтинг: 67
Малко сравняване "По Света и У нас":

http://www.instructables.com/id/Arduino-True-Battery-Capacity-Tester-Li-IonNiMH/?ALLSTEPS Arduino True Battery Capacity Tester (Li-Ion/NiMH/NiCD/Pb) by moris_zen in 11 steps
http://cxem.net/arduino/arduino31.php Измеритель ёмкости аккумуляторов (Li-Ion/NiMH/NiCD/Pb)
http://www.pchelar-probvaisambg.com/statia487_spisak.htm

http://www.electronicsblog.net/very-simple-arduino-lithium-ion-battery-capacity-testerdischarge-monitor/
http://cxem.net/arduino/arduino35.php Простой тестер емкости Li-ion аккумуляторов

http://anrieff.net/batterytest/index_bg.html
http://anrieff.net/abs/viewpost.php?lang=bg&id=67 Battery Level Meter
https://github.com/anrieff

И понеже е проект в разработка, бих предложил да се мери и вътрешното съпротивление на батерията [Rbatt]. Правят две контролни измервания [UbattVoltage] с волтмера, при изключен товар [Rt] в началото и в края на разреждането на батерията. После, като се сравняват с [Urt] същото измерване, но вече при включен товар [Rt], да се измерва вътрешното съпротивление [Rbatt] на Батерията. И по Закона на Ом за цялата верига имаме:
I = UbattVoltage / Rbatt + Rt; I*(Rbatt + Rt) = UbattVoltage; Rbatt = (UbattVoltage - I*Rt)/I; Rbatt = (UbattVoltage/I) - Rt; където I = Urt/Rt; Rbatt = (UbattVoltage*Rt/Urt) - Rt; където Rt=5,1 Om.
За по голяма точност стойността на Rt е най-добре да се измери с точен (4-5 разреден) мултимер и да се зададе като константа.
« Последна редакция: Февруари 25, 2017, 04:06:08 pm от locco »

Неактивен juliang

  • Много Напреднал
  • *****
  • Публикации: 1 356
  • Рейтинг: 269
Ако се използва резистор за разреждане на батерия то тока няма да константен. Напрежението пада във всеки момент и тока също би намалил...

batteryCapacity += voltage / 5.1 - това го има в кода.
Програмата всъщност измерва напрежението един път в секундата. Измеренето напрежение разделено на съпротивлението (5.1 ома) на резистора дава тока който преминава през тази секунда.
Програмата в началото задава batteryCapacity = 0 и всяка секунда добавя към batteryCapacity измерения за тази секунда ток. В нея дефакто ще има измерените амперсекунди. За да получа милиамперчаса умножавам по 1000 и деля на 3 600, или просто деля на 3.6 при самото изписване на дисплея:

lcd.print("Capacity " + String(batteryCapacity / 3.6) + "mAh");

Неактивен valex

  • Специалист
  • Сериозен
  • ***
  • Публикации: 1 032
  • Рейтинг: 147
  • изчислителна техника
juliang
Една идея от мен : правиш един управляем модул повишаващ напрежението чрез PWM на Arduinoto. Така можеш да регулираш разрядния ток през съпротивлението като променяш напрежението върху него.

Неактивен vsl

  • Активен
  • **
  • Публикации: 242
  • Рейтинг: 98
  • Скайп: vslengineering
batteryCapacity += voltage / 5.1 - това го има в кода.
Програмата всъщност измерва напрежението един път в секундата. Измеренето напрежение разделено на съпротивлението (5.1 ома) на резистора дава тока който преминава през тази секунда.
Програмата в началото задава batteryCapacity = 0 и всяка секунда добавя към batteryCapacity измерения за тази секунда ток. В нея дефакто ще има измерените амперсекунди. За да получа милиамперчаса умножавам по 1000 и деля на 3 600, или просто деля на 3.6 при самото изписване на дисплея:

lcd.print("Capacity " + String(batteryCapacity / 3.6) + "mAh");

Ставаше дума че няма да можеш да направиш СС разряд. А също така и СР (constant power)

Неактивен juliang

  • Много Напреднал
  • *****
  • Публикации: 1 356
  • Рейтинг: 269
Едва ли има уред, който да ползва батерията си в режим CC или CP... А и разликата между напрежението при пълна и празна батерия (е, не съвсем празна, а само изтощена до безопасна граница) е около 30%. Не виждам как този режим ще повлияе на измерването на капацитета й. Все пак не гоня лабораторна точност...
Самия резистор е с допуск 10%, двата ми китайски мултимера дават разлика от около 0.5 ома при меренето на стойността на съпротивлението (явно меренето на ниско съпротивление не им е от силните страни :) ), вероятно самата стойност на съпротивлението се променя при загряването докато работи, капацитета на батерията също се влияе от околната температура, real-time clock модула също има някаква грешка...
Вчера се заиграх да оптимизирам малко връзките и се оказа, че тия жички с които връзвам батерията и резистора са прекалено тънки - във всяка от тях има пад на напрежението около 1/2 волт заради големия ток, т.е. тяхното съпротивление би трябвало да се добави към съпротивлението на резистора. Обаче колко точно е то е неясно :) Ще трябва да чакам да ми дойдат холдерите за този модел батерии, които да осигурят стабилен контакт и да ползвам по-дебели и запоени проводници за да не изкривявам съвсем измерването.

Както не веднъж съм казвал и съм призовавал други колеги в тоя форум - теорията за измерването при един експеримент е не по-малко важна от измислянето на самия експеримент :) Винаги експериментатора трябва да подлага на съмнение показанията на уредите си, да търси местата където уредите биха могли да го излъжат и да подлага всяко измерване на проверка.

juliang
Една идея от мен : правиш един управляем модул повишаващ напрежението чрез PWM на Arduinoto. Така можеш да регулираш разрядния ток през съпротивлението като променяш напрежението върху него.
Трябва да се помисли върху този вариант :) Мерси!
« Последна редакция: Февруари 26, 2017, 11:43:03 am от juliang »

Неактивен krasias

  • Специалист
  • Сериозно Активен
  • ***
  • Публикации: 399
  • Рейтинг: 93
Juliang, май си попрекалил с тока щом греят чак проводниците. Производителите на батерии изкарват този капацитет при разряден ток 10mA, и добре знаеш че при различни токове батериите дават различен капацитет. Или най общо казано колкото тока на разряд е по голям толкова по малък капацитет ще отчиташ.

Неактивен juliang

  • Много Напреднал
  • *****
  • Публикации: 1 356
  • Рейтинг: 269
Juliang, май си попрекалил с тока щом греят чак проводниците. Производителите на батерии изкарват този капацитет при разряден ток 10mA, и добре знаеш че при различни токове батериите дават различен капацитет. Или най общо казано колкото тока на разряд е по голям толкова по малък капацитет ще отчиташ.
Това са елементи от батерии за лаптопи, а жичките китайчето ги е правило от някви толкоз тънки кабелчета, че не е истина...  и връзките бяха кофти...
Ако елементите са 2 600 мАч и дърпам по 10 мА от тях... лаптопа ми е трябвало да работи към 10 дена на батерия :)

Сметката за резистора съм я прави така, че батерията да "кляка" за час-два, колкото е нормалното време за работа на един лаптоп на батерия.
Сутринта смених кабелите, сковах си една кутийка за батерия, вече ардуиното и волтметъра вързан на клемите на батерията показват едно и също. меря една клетка и засега резултата е:
Време - 4500 секунди (демек час и 15 мин)
Напрежение под товар: 3.63V
Напрежение без товар: 3.78V
Изцицани от батерията досега - 948 милиамперчаса.

Данните ми изглеждат като да са достверни... ще чакам да падне до 3 волта и ще видя какво ще покаже.