Простой разрядник-измеритель емкости аккумуляторов 18650 с автоматическим отключением

wgaint
Offline
Зарегистрирован: 15.03.2015

За основу проекта взята статья:
https://www.electronicsblog.net/very-simple-arduino-lithium-ion-battery-capacity-testerdischarge-monitor/

В схему был дабавлен недорогой зарядник разрядник с защитой от перезаряда и переразряда. Нижний порог срабатывания равен 2,5 вольта. Цена чуть больше бакса.

Батарея подключается к B. +  к плюсу, - к минусу. Нагрузка к OUT. В качестве нагрузки брал 2 резистора (больших совецких по 5 см каждый :) ) по 10 ОМ в паралель (итого 5 ОМ). Таким образом ток разряда заряженной батареи равен 0,8А что соответствует среднестатистической нагрузке для 18650 (ноуты, мощные фанари, моторы и т.д). Рассчетное врямя разряда исправной батареи емкостью 2aH около 3-х часов. Для удобства в разрыв нагрузки поставил выключатель. Ardulino подключена к нагрузке, а не к батарее, чтобы иметь возможность определять начало и конец разряда.

В скетч добавлено условие: начинать измерение только если на входе Ардулино есть напряжение. 

ну и собственно сам код:

#define LED 13 //мигаем диодом если процесс идет
#define resistor 5 //номинал сопративления нагрузки
float capacity=0, value,voltage,current, time=0, minut;
void measure (void) {
  value= analogRead(0);
  if (value > 10) { //если есть напряжение на входе
  voltage=value/1024*5.0;
  current = voltage / resistor; //сила тока
  capacity = capacity + current / 3600; //емкость
  
  time++;
  minut = round(time/60);
  Serial.print("Voltage= ");
  Serial.print(voltage);
  Serial.print("V Current= ");
  Serial.print(current);
  Serial.print("A Capacity= ");
  Serial.print(capacity);
  Serial.print("Ah ");
  Serial.print("Discharging time= ");
  Serial.print(minut);
  Serial.print(" min ");
  Serial.print("\n");
  }
  else Serial.print("No voltage \n");
}
boolean x=false;
ISR(TIMER1_OVF_vect) {
  TCNT1=0x0BDC;
  x=!x;
  measure();
}
void setup() {
  pinMode(LED, OUTPUT);
  TIMSK1=0x01; // enabled global and timer overflow interrupt;
  TCCR1A = 0x00; // normal operation page 148 (mode0);
  TCNT1=0x0BDC; // set initial value to remove time error (16bit counter register)
  TCCR1B = 0x04; // start timer/ set clock
  Serial.begin(9600);
};
void loop () {
  digitalWrite(LED, x); //мигаем диодом если процесс идет
};

 

BestMC
Offline
Зарегистрирован: 07.06.2015

Попробовал повторить ваш проект. Если не подключать аккумулятор - все работает, но когда подключаю аккумулятор,  то ничего не идет.. В чем может быть проблема? 

toc
Offline
Зарегистрирован: 09.02.2013

BestMC, дайте схему подключения.

wgaint, по-моему, в 27-й строке не хватает словa volatile.

BestMC
Offline
Зарегистрирован: 07.06.2015
Схему, к сожалению, дать не могу - не силен в этом.. 
 
Попытаюсь на словах описать все:
 
1)К такой ж плате зарядки-разрядки лития подключаю аккумулятор к контактам B+ и B- 
 
2)К контактам OUT+ и OUT- подключаю нагрузку
 
3)OUT- к земле Arduino
 
4)OUT+ к А0 Arduino
 
Если отключить аккумулятор, то в консоли пишет "No Voltage" и раз в секунду мигает светодиод. Когда подключаю аккумулятор - в консоли пусто, светодиод не мигает..
toc
Offline
Зарегистрирован: 09.02.2013

1 Плата ардуино подключенa по usb?
2 Этот контролер заряда подключён к usb?
3 Попробуйте нагрузку менее мощную.
4 Что будет если соединить только gnd ?

BestMC
Offline
Зарегистрирован: 07.06.2015

1 Да.

2 Нет, там USB для зарядки используется.

3 Пробовал, ничего не меняется.

4 Не совсем понял вопрос, как это сделать?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

BestMC, сфотографируйте что вы там наподключали, да и делов-то. наверняка ошибка в подключении.

BestMC
Offline
Зарегистрирован: 07.06.2015

Камера в телефоне без автофокуса, так что фото нормального все равно не получится. Попробовал в Paint нарисовать схему, надеюсь, все понятно получилось..

wgaint
Offline
Зарегистрирован: 15.03.2015

У меня работает.

Проверьте на ощупь резистор должен быть теплый-горячий. Что за резистор брали, может слабый?

А лучше замерьте напряжение на OUT тестером.

Судя по тому что надпись "no voltage" исчезает, напряжение появляется, но в этом случае должно быть сообщение с показаниями.

BestMC
Offline
Зарегистрирован: 07.06.2015

А у меня не работает(

Резистор греется, пробовал разные, от 15 до 4 Ом

На 4 Ом иногда срабатывала защита на плате зарядки лития, пробовал и без этой платы.. Не работает.. 

У вас если отключена батарея и нагрузка от ардуино продолжает писать "No voltage"? 

Может дело в ардуино? Я использовал Nano v3.0..

wgaint
Offline
Зарегистрирован: 15.03.2015

У меня на леонардо. Выложил скетч еще раз. Там, кстати, передача  сообщений идет 1 раз в 30 сек. Удобней в ексель вставлять - графики строить, не так много данных.



#define LED 13 //мигаем диодом если процесс идет
#define resistor 5 //номинал сопративления нагрузки
float capacity=0, value,voltage,current, time=0, minut;
int k = 0;
void measure (void) {
  value= analogRead(0);
 if (value > 10) { //если есть напряжение на входе
  voltage=value/1024*5.0;
  current = voltage / resistor; //сила тока
  capacity = capacity + current / 3600; //емкость
  k++;
  time++;
  minut = round(time/60);
        if (k > 29) {
          k = 0;
        Serial.print("Voltage= ");
        Serial.print(voltage);
        Serial.print("V Current= ");
        Serial.print(current);
        Serial.print("A Capacity= ");
        Serial.print(capacity);
        Serial.print("Ah ");
        Serial.print("Discharging time= ");
        Serial.print(minut);
        Serial.print(" min ");
        Serial.print("\n");
        }
  
}else Serial.print("No voltage \n");
}
boolean x=false;
ISR(TIMER1_OVF_vect) {
  TCNT1=0x0BDC;
  x=!x;
  measure();
}
void setup() {
  pinMode(LED, OUTPUT);
  TIMSK1=0x01; // enabled global and timer overflow interrupt;
  TCCR1A = 0x00; // normal operation page 148 (mode0);
  TCNT1=0x0BDC; // set initial value to remove time error (16bit counter register)
  TCCR1B = 0x04; // start timer/ set clock
  Serial.begin(9600);
};
void loop () {
  digitalWrite(LED, x); //мигаем диодом если процесс идет
};
nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Привет. С картинкой будет проще разобраться. Правильно нарисовал?

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

А можно так разряжать?

R1 = 0.05 Ом,
R2 ~= 5 Ом.
Фишка в том, что R1 взят из USB-дохтора или может быть заменен любым другим с хорошими параметрами,
а вместо R2 используется любая нагрузка - старые Б/У резисторы, подобранные как попало

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Чему равно напряжение аккумулятора?

Допустим, R2 = 5.5 Ом,

R - 5.55 Oм...?