Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Измеритель ёмкости аккумуляторов (Li-Ion/NiMH/NiCD/Pb)

Измеритель ёмкости аккумуляторов

Представлен проект измерителя емкости аккумуляторов, основанный на микроконтроллере, который может измерять практически все типы аккумуляторов. Измеритель может подключаться к компьютеру и давать полную информацию о аккумуляторе - график разряда и емкости.
Обратите внимание, что это мой первый серьёзный проект на Arduino.

Что должно получится в итоге

На этом графике произведены замеры аккумулятора с заявленной емкостью 2000 mAh. Реальная емкость оказалась 1580 mAh:

График напряжения

График измерений Li-Ion аккумулятора:

График измерений Li-Ion аккумулятора

Таблица замеров

Все графики сформированны из текстового документа, с значениями измерений, на ПК.

Начало начал – Arduino

Arduino

Эту копию Arduino Diecimila я ждал примерно 2 недели, поэтому я купил ATmega168 и подумал что смогу заставить её работать не хуже Arduino без нескольких компонентов (в частности без кварца). Но это не получилось и мне пришлось ждать 16МГц кварц и два конденсатора 22 пФ.

Конструкция измерителя

FET-транзистор с резистором 10 Ватт

К транзистору подключен резистор 2.2Ом 10 Вт. К резистору я подключил два A/D контакта Arduino и измерял падение напряжения на нем, вычисляя из этого значения ток I = DeltaV/R.
Я также добавил зуммер для оповещения окончания заряда и необходимости отключения аккумулятора.

Внешний вид измерителя

Для индикации я использовал ЖК-дисплей 2*16. Я нашел документацию и пример работы с ним на сайте Arduino и начала разрабатывать программу.

Тип используемого аккумулятора (NiMH/NiCD или Li-ION) определяется по диапазону напряжения. После определения типа аккумулятора, начнется его разрядка для определения параметров.

Внешний вид измерителя

Цикл разряда аккумулятора длится 30-120 минут. Длительность цикла зависит от емкости аккумулятора.

Схема управления нагрузкой

Параллельно резистору подключаются 2 A/D контакта.
Vr = Vbat-Vfet.

Программа

#include LiquidCrystal.h

int sensorPin = 0;    // к пину Analog IN 0
int sensor2Pin = 2;   // к пину Analog IN 2
int SPKPin = 6;		  // пин к затвору транзистора
int ledPin = 13;      // пин LED

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins

int sensorValue = 0;  // variable to store the value coming from the sensor 
int sensor2Value = 0;  // variable to store the value coming from the sensor 
float LiMinThreshold = 2700; // Lithium Minimal Voltage for load removal
float LiMaxThreshold = 4200; // Lithium Max Voltage for load removal
float NmhMinThreshold = 950; // NMH Minimal Voltage for load removal
float NmhMaxThreshold = 1600; // NMH Max Voltage for load removal
float SelectedMinThreshold = 5000;
int i;
int BatVoltage = 5000;
int FetVoltage = 5000;
long TotalCurrent = 0;
boolean done = false;
unsigned long PrevMillis ;
unsigned long MillisPassed ;

void CL2(){
  lcd.setCursor(0, 1);// Second line first char
  lcd.print("                        ");
  lcd.setCursor(0, 1);// Second line first char
}  

void setup() {
  Serial.begin(9600);// start serial port to send data during run to the PC
  pinMode(ledPin, OUTPUT);//activation led and enable for FET
  pinMode(SPKPin, OUTPUT);//activation led and enable for FET
  lcd.begin(24, 2);// set up the LCD's number of rows and columns: 
  lcd.print("Bat PWR Tester[Active]");  // Print a message to the LCD.
  lcd.setCursor(0, 1);// Second line first char
  lcd.print("Detecting Bat Type..."); // print voltage value
  delay(2000); 
  lcd.setCursor(0, 1);// Second line first char
  lcd.print("                        ");
  lcd.setCursor(0, 1);// Second line first char
  digitalWrite(ledPin, HIGH);   // set the LED on
  sensorValue = analogRead(sensorPin);   // read the value from the sensor:
  digitalWrite(ledPin, LOW);   // set the LED off
  // Detecting battery type
  BatVoltage = sensorValue*4.887;
  if (BatVoltage > 4500){
    lcd.print("Warning high-V! ");
    done = true;}
  else if (BatVoltage > LiMinThreshold){
    lcd.print("Type:Li-Ion Bat ");
    SelectedMinThreshold = LiMinThreshold;}
  else if (BatVoltage > NmhMinThreshold){
    lcd.print("Type:NiMH/Cd Bat ");
    SelectedMinThreshold = NmhMinThreshold;}
  else{
    lcd.print("Unknown Bat V < 1");
    done = true;}
  lcd.print("V=");
  lcd.print(sensorValue*4.887); // print voltage value
  Serial.print("DT[ms]");  
  Serial.print("\t");  
  Serial.print("Bat[mV]");  
  Serial.print("\t");  
  Serial.print("Fet[mV]");  
  Serial.println(""); 
  delay(3000); 
  CL2();
  PrevMillis = millis();
}

void loop() {
    if (BatVoltage > SelectedMinThreshold && !done) {
      digitalWrite(ledPin, HIGH);   // set the LED on
      sensorValue = analogRead(sensorPin);   // read the value from the sensor:
      sensor2Value = analogRead(sensor2Pin);   // read the value from the FET:
      FetVoltage = (sensor2Value*4.887);
      BatVoltage = (sensorValue*4.887);
      CL2();
      lcd.print("V=");
      lcd.print(BatVoltage); // print voltage value
      lcd.print("mV");
      //lcd.print(FetVoltage); // print voltage value
      TotalCurrent=TotalCurrent+MillisPassed/1000*(BatVoltage-FetVoltage)/2.2/3.6;
      lcd.print(" I=");
      lcd.print(TotalCurrent/1000);     
      lcd.print("mAH         ");
      delay(1000); 
      MillisPassed = millis()- PrevMillis;
      PrevMillis = millis();
      Serial.print(int(MillisPassed)); 
      Serial.print("\t");    // prints a tab
      Serial.print(BatVoltage); 
      Serial.print("\t");    // prints a tab
      Serial.print(FetVoltage); 
      Serial.println("");    // prints a tab
      CL2();
    }
    else
    {
      done=true;
      digitalWrite(ledPin, LOW);   // set the LED off - stop loading
      lcd.setCursor(0, 0);// First line first char
      lcd.print("Bat Power Tester [DONE] ");  // Print a message to the LCD.
      CL2();//clear line 2
      sensorValue = analogRead(sensorPin);   // read the value from the sensor:
      BatVoltage = (sensorValue*4.887);
      lcd.setCursor(0, 1);// Second line first char
      lcd.print("V=");
      lcd.print(BatVoltage); // print voltage value
      lcd.print("mV I=");
      lcd.print(TotalCurrent/1000);     
      lcd.print("mAH            ");
        for (int i=0; i<100 ; i++){
          digitalWrite(SPKPin, HIGH);
          delay(1);
          digitalWrite(SPKPin, LOW);
          delay(1);
        }
      delay(1000);
    }
}

Схема подключения LCD к Arduino - стандартная. Посмотреть можно на официальном сайте по Arduino.

Обсуждение проекта на форуме

Оригинал статьи

Теги:

Шпакунов А. Опубликована: 2012 г. 0 2
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (20) | Я собрал (0) | Подписаться

0
kubanoid #
Компилятор ругается.А вот так ему больше нравится:
#include
Ответить
0
kubanoid #
Странно как то включается нагрузка. Удалил строки 114-119.А включение:
74а - digitalWrite(SPKPin, HIGH);
и выключение:
102а - digitalWrite(SPKPin, LOW);
Ответить
0
Раджа #
Я так понял, что в конце пепелац диодом помигать должен, или я не понимаю, что там что-то должно помигать.
А зарядка действительно нигде не включается.
Ответить
0
Марьян #
Это не нагрузка, на 13 нагрузка, на 6 спикер должен быть, и даст в цикле фор сигнал окончания проверки
Ответить
0
Владамир #
Глянь на картинку или в скетч- дисплей 2х24, а не 2х16, как ты написал!
Ответить
0
Роман #
1500мАч из 2000 это еще хорошо, а я вот получил куда хуже результат для новых АА емкость 450мАч из 3000. Китайцы мать их за ногу...
Правда я делал не по этой схеме, но сомневаться в достоверности показаний у меня нет оснований
Ответить
0
Дмитрий #
А по какой делал схеме? Скинешь, пожалуйста?
Ответить
0
777Andrej #
Видео работы
https://youtu.be/J-G7O6tPhI8 доработанный, звуковая сигнализация окончания разряда, время разряда.
Ответить
0
Богдан #
Собрал схему, скетч залился без проблем. Работает супер!
А на счет того, что какие-то не понятные измерения идут, то попросту нужно сделать нормальные контакты на батарейке и все будет супер.
Ответить
0
muhammed #
Ребят, у меня тема диплома такая. Скажите можно ли сделать этот аппарат на Arduino Uno CH340G?
Ответить
0
talibanich #
А в чем разница? Естественно можно
Ответить
0
yucan #
Хоть Pro mini можно использовать... Ещё бы сюда и схему заряда прилепить!
Ответить
0
Марьян #
Ну тут надо зарядить, узнать емкость , и по емкости будет известно каким током заряжать чтоб не превысить допустимый.. ну и контроль заряда до 4.2 вольт
Ответить
0
Serg #
Подскажите, где править под другой номинал резистора, и как сказывается на работу сопротивление перехода полевика?
Ответить
0
Дмитрий #
А как настроить скетч под другой транзистор или резистор, что надо изменить?
Ответить
0
zadan #
Похоже резистор тут влияет TotalCurrent=TotalCurrent+MillisPassed/1000*(BatVoltage-FetVoltage)/2.2/3.6;
Про транзистор любой, с минимальным сопротивление открытия и напряжением открытия, не более питания Ардуинки + достаточным рабочим током. (По хорошему рекомендую перед затвором поставить токоограничительный резистор 270Ом (чтобы не спалить микроконтроллер) и между затвором и истоком 10к-100к).
Ответить
0
zlitos #
Всем привет. Если тема еще жива, поясните мне пожалуйста, что меряется на пине А2? При закрытом транзисторе там практически напряжение на аккумуляторе, так как вход ардуины высокоомный падение на резисторе 2,2Ом это мизер. При открытом же транзисторе, у которого сопротивление канала десяток миллиом, измеряется фактически земля. По моему мнению, из за того, что напряжение на А0 практически равно А2 при закрытом транзисторе (разница в 1-3 единицы квантования АЦП) и при открытом транзисторе на А2 земля, точность измерения данного устройства можно считать отсутствующей величиной. Или я не прав?
Ответить
0
The Man Works #
При транзисторе измеряется напряжение на пине А2 и напряжение на пине A0. Разница этих напряжений (А0 - А2) - это падение напряжения на резисторе. Соответственно, если поделить это падение напряжения на сопротивление резистора (2,2 Ом), то мы получим ток, протекающий через резистор, который является током разряда аккумулятора. А зная ток разряда аккумулятора в каждый момент времени пока аккумулятор не сел до минимального напряжения мы можем вычислить ёмкость в mAh.
Ответить
0
Максим #
Подскажите, а им можно проверить акб от ибп?
Ответить
0
ssam #
Тогда у вас будет 12В между GND и пинами A0,A2, что выведет из строя ваш мк.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Осциллограф DSO138 Pickit 2 - USB-программатор PIC-микроконтроллеров
вверх