avatar_Яков93

Поочередная зарядка ячеек батареи

Автор Яков93, 22 Май 2024 в 17:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Рамиль555

Цитата: Иван Сусанин от 03 Июнь 2024 в 15:14Перемычку не трогал, запаяна на литийион/феррум.
Пока не определил, но кажется что гаснет когда банки отбалансированы, но спустя некоторое время (напряжение не устаканилось) может ненадолго зажигаться,- корректируя заряд.

А перемычку включения балансира распаяли? Она замкнута по умолчанию. Я распаял и вывел на кнопку.

Яков93

Измерение напряжения ячеек предполагаю по такой схеме
2024-06-13_07-03-42.jpg

Стабилитрон TL431 на входе нужен чтобы ограничить измеряемое напряжение ячейки выше 2,5В. Никакого смысла измерять напряжение Li-Ion ячейки ниже 2,5В все равно нет, просто бесполезно расходуется ресурс АЦП Ардуины. Таким образом границы измерения напряжения ячейки будут от 2,5 до 4,2В, диапазон напряжений после TL431 будут от 0 до 1,7В.
Можно подать эти 0 - 1,7В напрямую на АЦП Ардуины, прикрутив к ней внешнее референсное напряжение 1,7 В.
А можно и расширить этот диапазон от 0 до 5В с помощью ОУ. Тогда можно использовать дефолтное референсное напряжение Ардуины.

Мне пока ближе вариант с ОУ. Хочется еще и проходящий зарядный ток измерять, брать напряжение с шунта встроенного в DC-DC и усиливать его с помощью ОУ. Т.е. ОУ в любом случае понадобится.

дотошный_крендель

Цитата: Яков93 от 13 Июнь 2024 в 07:29Стабилитрон TL431 на входе нужен чтобы ограничить измеряемое напряжение ячейки выше 2,5В. Никакого смысла измерять напряжение Li-Ion ячейки ниже 2,5В все равно нет, просто бесполезно расходуется ресурс АЦП Ардуины.
+
mxus3k 3витка MTX39 26"(maxxis dhf minion) + kls-7230s 80А/160А + ANT BMS 130A + lipo 10s1p 21Ah 20-25C + (avid code + avid G2 CleanSweep 203mm).

usavich

Яков93, для начала почитай датащит TL431.
ЕздюкЪ на батарейках! Без смс бмс и регистрации. Заряжаюсь от солнца.

Яков93

#40
Цитата: usavich от 14 Июнь 2024 в 01:49Яков93, для начала почитай датащит TL431.
А можно по-подробнее, что не так?

upd. Схема подключения TL431 не типичная, я понимаю. Но в симуляции в Протеусе все четко работало. Попробовал сейчас в натуре, - не работает.
1. Великоват номинал резистора. Даже при 1 кОм нижняя граница на аноде при 2,5 на REF не снижается до 0, держится на 0,2В.
2. Лучше наверное подключать TL по типовой схеме на инвертирующий вход LM358.

usavich

В виртуальных мирах все иначе.
У TL431 минимальный ток стабилизации 1мА. Резистор не является источником тока.
ЕздюкЪ на батарейках! Без смс бмс и регистрации. Заряжаюсь от солнца.

дотошный_крендель

все там нормально работает на tl431 - не помню правда какой резик ставил

можно попробовать более специализированный ИОН - MCP1525
mxus3k 3витка MTX39 26"(maxxis dhf minion) + kls-7230s 80А/160А + ANT BMS 130A + lipo 10s1p 21Ah 20-25C + (avid code + avid G2 CleanSweep 203mm).

Яков93

Вот уточненная схема измерения напряжения с TL431 и ОУ

2024-06-15_07-46-48.jpg

Собрал в железе - все адекватно работает

дотошный_крендель

резики номиналом 29 КОм и в железе?
mxus3k 3витка MTX39 26"(maxxis dhf minion) + kls-7230s 80А/160А + ANT BMS 130A + lipo 10s1p 21Ah 20-25C + (avid code + avid G2 CleanSweep 203mm).

Яков93

Цитата: sdenis2023 от 15 Июнь 2024 в 16:57резики номиналом 29 КОм и в железе?
Конкретно 29 кОм не было, взял 30 кОм. А вообще пересчитаю номиналы под ардуину мини на 3,3В.

Яков93

#46
Продолжаю ковырять схему
Вот что у меня на сегодняшний день получается
2024-07-12_06-56-05.jpg

1. Ардуино мини на 3,3 В
2. Регулируемый DC-DC. Вход 10-12 В, выход 4,5 В 1,5 А.
3. Измеритель напряжения и тока на ОУ MCP6002.
4. Блок питания 5В для измерителя напряжения и тока, Ардуина подключается к  входным12 В .
5. Блок смены полярности для подзарядки элементов
6. Ключи для коммутации ячеек.

Сделал вот такую разводку
Подзаряд велосипеда 2.jpg

В собранном виде должно выглядеть вот так
2024-07-12_06-54-06.jpg 2024-07-12_06-54-30.jpg

Осталось самая малость  ;-D  Сделать платку, распаять элементы, и написать скетч  :exactly:

Алгоритм работы такой.
1. Проверка напряжения каждой ячейки.
1.1. Ардуина отключает генерацию DC-DC подавая 3,3В на вывод FB дисишки.
1.2. Отключает все ключи.
1.3. В зависимости от номера ячейки блок 5 меняет полярность ее подключения к блоку измерения напряжения. После чего открывается пара ключей на этой ячейке.
1.4. Напряжение измеряется, повторяется с п.1.2. для следующей ячейки и вычисляется самое низкое.
2. Подзаряд.
2.1. Те же действия что и в п.п. 1.1-1.3. только 1.3. для самой разряженной ячейки.
2.2. Включается генерация DC-DC.
Контролировать напряжение можно делая перерыв в заряде, повторяя п.1 через какой-то промежуток времени (например раз в минуту). А также по силе тока проходящего в ячейку. Если сила тока большая значит ячейка еще не дозаряжена.

Яков93

Платка спаяна
IMG_20240718_214257_1.jpg...IMG_20240718_214246_1.jpg

Вырезал дорожки фрезером, но т.к. давно им не пользовался кое-что подзабыл, поэтому некоторые вещи пошли не так как хотелось. Да еще и в процессе выключили свет, настройки сбились и фреза вообще перерезала кучу дорожек, печалька.

Завтра постараюсь проверить все ли правильно спаялось и как работает. И буду писать скетч.

дотошный_крендель

резики можно было и не СМД ставить - у вас места вагон целый  :-)
mxus3k 3витка MTX39 26"(maxxis dhf minion) + kls-7230s 80А/160А + ANT BMS 130A + lipo 10s1p 21Ah 20-25C + (avid code + avid G2 CleanSweep 203mm).

Яков93

Цитата: sdenis2023 от 18 Июль 2024 в 21:58резики можно было и не СМД ставить - у вас места вагон целый  :-)
Хотелось компактности, свободное место по краям предполагалось срезать фрезой, но после того как она мне дорожки перерезала...  :ireful:  >:D
Короче не стал лишнее срезать, всегда в случае чего успею.
Да, если буду схему доделывать можно подумать про обычные резисторы по крайней мере в некоторых местах.

Яков93

Подключил к цепочке аккумуляторов 18650 13s, вроде работает  :dance:

Каждые двадцать секунд отключает DC-DC, проверяет напряжение на каждой ячейке, выбирает наименее заряженную, подключает к ней зарядyю DC-DC. И так по кругу

скетч Ардуино
int digitPins[] = {3,4,5,6,7,8,9,10,11,12,13,14,15,16};                        // указываю пины для ключей на ячейках
#define DCPower 17                                                            // пин для отключения DC-DC
#define Bridge 2                                                              // пин для переключения моста
byte bat_min;


void setup() {
  Serial.begin(9600);
  for(int i=0; i < (sizeof(digitPins) / sizeof(digitPins[0]));i++)
  {
    pinMode(digitPins, OUTPUT);                                           // декларирую пины как выходные
    digitalWrite(digitPins, LOW);                                          // устанавливаю на них изначально низкий уровень
     
  }
  pinMode(DCPower, OUTPUT);
  digitalWrite(DCPower, LOW);
  pinMode(Bridge, OUTPUT);
  digitalWrite(Bridge, LOW);
 
 
 //number(voltmetr());
}


// the loop function runs over and over again forever
void loop() {
  uint32_t sec = millis() / 1000ul;                                             //полное количество секунд
   
  if(sec % 20 == 0)
  {
    digitalWrite(DCPower, HIGH);
    delay(50);
    number(voltmetr());
    Serial.println("");
    digitalWrite(DCPower, LOW);
  }

//digitalWrite(DCPower, LOW);

}

byte voltmetr()
{
  int vt_old, vt_now, v_min;
 
  for(byte h=13; h >= 1; h--)
  {
    number(h);
    if(h==13) vt_old = analogRead(A5);
    delay(70);
    vt_now = analogRead(A5);
    v_min = min(vt_old, vt_now);
    if(v_min==vt_now) bat_min=h;
    vt_old=v_min;
    Serial.print("ячейка № ");
    Serial.print(h);
    Serial.print(" напряжение: ");
    Serial.print(vt_now);
    Serial.print(" разряженная ячейка № ");
    Serial.println(bat_min);
   
    delay(50);
  }

  return bat_min;
}


void number(int num)                                                    // подключение нужной ячейки
{
  //digitalWrite(DCPower, HIGH);                                           //отключаю DC-DC
  for(int i=0; i < (sizeof(digitPins) / sizeof(digitPins[0])); i++)     // отключаю все ключи
  {
    digitalWrite(digitPins, LOW);

  }

if (num%2==0) digitalWrite(Bridge, HIGH);                                // переключение моста в зависимости от номера ячейки
else digitalWrite(Bridge, LOW);
   
  for(int i=0; i<2; i++)                                                //включаю ключи на нужной ячейке
  {
    digitalWrite(digitPins[num-i], HIGH);
  }
}
Пока в программе никак не проверяю зарядный ток, плюс можно проверять напряжение во время заряда, чтобы не дай Бог выше 4,2 не поднялось.
Можно переделать алгоритм как захочется.

главное заработало в принципе. Были у меня сомнения по поводу транзисторов, выдержат/не выдержат. Поставил в качестве ключей AO4826, по даташиту у них Vds 60 В. Но покупал у двух разных продавцов на алиэкспрессе, по внешнему виду они немножко друг от друга отличались. Но вроде похоже обошлось.
Usavich'у благодарность, за то что ткнул в необходимость транзисторов с высоким Vds.






usavich

Яков93, в том-то и прикол, что до 40В всего много и дешево, а дальше ОЙ! Да, всегда обращай внимание на минимальные токи - стабилитроны и всякие регуляторы могут превращаться в хороший генератор белого шума, хотя в симуляторах "все пучком".
 4.2В это при заряде постоянным током. Я тут с импульсным зарядом экспериментирую и, похоже побил "рекорд" - 4.65В на ячейку, причем ни нагрева, ни клапан не стрельнул. Естественно, никому повторять мой опыт не рекомендую. На данном этапе могу сказать, что поведение ячеек при заряде сильно зависит от производителя.
ЕздюкЪ на батарейках! Без смс бмс и регистрации. Заряжаюсь от солнца.

Яков93

Выявилась техническая проблема.

Внезапно испустили дух два ключа, один на плюсе (прямо хорошо, с дымом и отвалившейся ножкой истока) и еще один практически незаметно, через один ключ после него.
2024-05-23_05-43-07_break.jpg

Предполагаю, что ключ Q1-Q2 на "+" не закрылся, когда поступила команда на открытия ключа Q5-Q6. Почему так получилось не вполне ясно, т.к. схема отработала вполне спокойно, без всяких нагревов и дыма как минимум минут сорок. За это время ключи открывались в разнообразных комбинациях и ничего не взрывалось. В момент аварии я уже все собрался сворачивать эксперимент, начал отключать программатор от ардуино, видимо нарушил работу программы и она слегка сошла с ума - дала команды в неправильной последовательности.

Я задумался, а как вообще должен закрываться ключ Q1-Q2.
Для принудительного закрытия ему нужно отрицательное напряжение на затворе, а он его может вообще не получить в некоторых ситуациях. Т.к. он подключен к плюсу батареи, то отрицательного напряжения он от нее не получит.
Он может получить минус от линии питания DC-DС через встроенный диод, когда по этой линии к стоку Q2 будет подходить минус. Но по этой линии по умолчанию тоже идет плюс, минус появляется только по команде ардуино. И если у нее случится какой-то сбой, то минус может не появиться и ключ не закрыться.

Сейчас я контакты на "мосте" перебросил, теперь на стоке Q2 по умолчанию минус.
А также поставил дополнительную подтяжку с минусового полюса первой ячейки к затвору Q1-Q2. Резистор на 20к и диод Шоттки.
2024-05-23_05-43-07_new.jpg
Мне кажется должно закрываться стабильнее.

А еще было бы идеально вставить какой-то типа многоканальный триггер, или элемент "исключающее ИЛИ (XOR)". Чтобы в случае сбоя ардуины и случайного срабатывания больше двух выводов сигнал на ключи или не срабатывал или бы просто отрубался.

дотошный_крендель

Цитата: Яков93 от 22 Июль 2024 в 10:25А еще было бы идеально вставить какой-то типа многоканальный триггер, или элемент "исключающее ИЛИ (XOR)". Чтобы в случае сбоя ардуины и случайного срабатывания больше двух выводов сигнал на ключи или не срабатывал или бы просто отрубался.
+

ещё не плохо бы ввести доп задержки на переключениях между ячейками
mxus3k 3витка MTX39 26"(maxxis dhf minion) + kls-7230s 80А/160А + ANT BMS 130A + lipo 10s1p 21Ah 20-25C + (avid code + avid G2 CleanSweep 203mm).