Автоматика для КТЦ или продлеваем жизнь аккумуляторам

    В результате публикации рассказов о моей автономной солнечной энергосистеме, описанной здесь, здесь и здесь, частыми были схожие вопросы: каков срок окупаемости и как долго прослужит система? Надо отметить, что одной из самых дорогих и капризных частей системы являются аккумуляторы. Именно накопители энергии изнашиваются быстрее всего, емкость аккумуляторов падает и количество оставшихся циклов заряд-разряд неуклонно уменьшается. С уменьшенной емкостью аккумуляторов хорошо знакомы автомобилисты, когда внезапный резкий мороз не оставляет шанса старому аккумулятору завести автомобиль.
    Я задался вопросом, как определить остаточную емкость аккумулятора, чтобы это было максимально просто и быстро.





    Для начала, немного теории, чтобы понимать, как измерять остаточную емкость аккумулятора и что для этого нужно.

    Контрольно-тренировочный цикл заряда-разряда проводится для предотвращения сульфатации и определения емкости аккумулятора. Контрольно-тренировочные циклы проводятся не реже одного раза в год и выполняются следующим образом: заряжают АБ нормальным током до полного заряда; выдерживают АБ 3 часа после прекращения заряда; корректируют плотность электролита; включают зарядку на 20-30 минут для перемешивания электролита; проводят контрольную разрядку постоянным нормальным током 10-часового режима и контролируют время полного разряда до напряжения 1,7 В на банку (10,2 В на АБ); емкость батареи определяют как произведение величины разрядного тока и времени разряда. После контрольного разряда батарею сразу же ставят на зарядку и полностью заряжают. Если оказалось, что емкость АБ меньше 50% номинальной, она считается неисправной.
    Неавтоматизированный контрольный разряд требует постоянного присутствия обслуживающего персонала для фиксации и регулировки тока разряда. (с)взято отсюда

    То есть для определения остаточной емкости нам нужно разряжать аккумулятор нагрузкой с известной и постоянной мощностью до величины 10,2 (в иных источниках рекомендуют разряжать 12В аккумулятор не ниже, чем до 10,8В) Вольта. Можно просто купить вот такой прибор и не ломать голову изобретением велосипеда, но ежедневная борьба с ленью требует новых свершений и изобретений.


    Итак, руководствуясь принципом «Чем проще-тем надежнее», было решено собрать собственное автоматизированное устройство для измерения остаточной емкости аккумулятора, и заодно, проведения КТЦ. Так как зарядное устройство у меня уже было, то изобретать велосипед не было нужды. Требовалось лишь включить эту зарядку вовремя. А вот разряжать надо чем-то, что имеет постоянную нагрузку, независимо от окружающей температуры и напряжения аккумулятора. Самый простой способ — это разрядка автомобильными лампами накаливания. Номинал мощности пишут прямо на них, поэтому потребляемый ток можно вычислить простой арифметикой: Вт/12=ток нагрузки. То есть лампа на 60 Вт будет потреблять 5 Ампер. Аккумулятор разряжают током, составляющим 10% емкости или 0,1С и заряжают таким же током.
    В результате пятиминутного раздумья было составлено ТЗ для будущего устройства:
    1. Фиксация времени начала процесса разряда
    2. Слежение за напряжением аккумулятора
    3. По достижении критического напряжения устройство должно отключить нагрузку и включить ЗУ
    4. Фиксация времени окончания процесса разряда

    Из всего этого следовало, что нам понадобится:
    1. Arduino Nano — 175 руб
    2. RTC1307 — 56 руб
    3. Реле — 131 руб
    4. LCD 2х16 i2c — 222 руб
    5. 3 резистора по 10 кОм, некоторое количество проводов — 50 руб
    Итого: 634 руб

    Чтобы Ардуина понимала, какое напряжение в каждый момент времени на аккумуляторе, необходимо было подсоединить аккумулятор к ардуино. Сделать напрямую этого нельзя, так как аналоговые входы контроллера могут принимать не более 5В, поэтому было решено собрать делитель напряжения из 3 резисторов по 10кОм. Минус аккумулятора и минус контроллера связывались напрямую. Питание контроллера осуществлялось от отдельного источника питания. Схема подключения и код представлены ниже:



    Скетч КТЦ
    // Date and time functions using a DS1307 RTC connected via I2C and Wire lib
    #include <EEPROM.h>
    #include <Wire.h>
    #include <DS1307.h>
    #include "RTClib.h"
    #include <LiquidCrystal_I2C.h>
    int rtc[7];
    byte rr[7];
    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
    #define RELE_NAGRUZKA 2 //объявляем работу реле нагрузки на пине 2
    #define RELE_ZARYADKA 3 //объявляем работу реле зарядки на пине 3
    int analogPin = 0;
    int flag=0;
    float val=0;
    float valkoef=0;
    
    void setup () 
    {
      DDRC|=_BV(2) |_BV(3);  // POWER:Vcc Gnd
      PORTC |=_BV(3);  // VCC PINC3
      RTC.get(rtc,true);
      lcd.init();                      // initialize the lcd 
      lcd.backlight();
      lcd.home();
      pinMode(RELE_NAGRUZKA, OUTPUT); //инициируем реле только на выход  
      pinMode(RELE_ZARYADKA, OUTPUT); //инициируем реле только на выход
      lcd.clear();  
      digitalWrite(RELE_NAGRUZKA, HIGH);
      digitalWrite(RELE_ZARYADKA, HIGH);
      RTC.SetOutput(DS1307_SQW32KHZ);
      EEPROM.write (0, rtc[2]); // при старте записываем значение времени, часы
      EEPROM.write (1, rtc[1]); // при старте записываем значение времени, минуты
    }
    
    void loop () 
    {
     val = analogRead(analogPin); // считываем значение напряжения с аналогового порта
     valkoef=val/74,49; // приводим снятое с аналогового пина значение к обычным вольтам
     RTC.get(rtc,true);
     lcd.setCursor (0,0);
     lcd.print (rtc[2]);
     lcd.print (":");
     lcd.print (rtc[1]);
     lcd.print (":");
     lcd.print (rtc[0]);
     lcd.print (" str");
     lcd.print (EEPROM.read(0));
     lcd.print (":");
     lcd.print (EEPROM.read(1));
     lcd.setCursor (0,1);
     lcd.print (valkoef);
     lcd.print (" ");
     lcd.print (flag);
     
     if (valkoef < 10.72)
       {
        flag=1;
        EEPROM.write(2, rtc[2]); // записыываем время окончания разрядки, часы
        EEPROM.write (3, rtc[1]); // записыываем время окончания разрядки, минуы
       }
     if (flag==1)
     {
       digitalWrite(RELE_ZARYADKA, LOW); // включаем зарядку
       digitalWrite(RELE_NAGRUZKA, HIGH); // выключаем нагрузку
       lcd.print (" stp");
       lcd.print (EEPROM.read(2)); // выводим время окончания разрядки
       lcd.print (":");
       lcd.print (EEPROM.read(3));
     }
       
     if ((valkoef > 10.72) && (flag==0))
     {
       digitalWrite(RELE_NAGRUZKA, LOW);
        }
     else
       {
         digitalWrite(RELE_NAGRUZKA, LOW);
        
       }
      delay(500);
    }
    



    Как работает устройство? Элементарно!

    К первому реле подключается нагрузка, ко второму ЗУ. Причем лучше разрывать высоковольтную цепь питания зарядного устройства, чтобы не оставлять включенным устройство без аккумулятора. При включении контроллера в первой строке отображается текущее время и время старта работы нагрузки. Во второй строке отображается текущее напряжение на аккумуляторе и время окончания разряда, когда аккумулятор достигнет критического напряжения. Сразу по достижении значений, реле нагрузки отключается и включается реле заряда. Если добавить пару кнопок, то можно с легкостью настроить регулировку порога напряжения или настройку часов реального времени. На данном этапе такой задачи не стояло, поэтому код максимально прост и функционален. Вычитая из времени окончания время старта разрядки, можно получить емкость, если умножить время на ток, потребляемый нагрузкой.

    Заключение
    Итак, организовать контрольно-тренировочный цикл для любого аккумулятора, имея зарядное устройство, 600-700 рублей на запчасти и пару часов времени, очень просто. Не забывайте, что заряженный аккумулятор служит дольше, а периодические КТЦ придают уверенности хотя бы в том, что Вы точно будете знать, что утром машина заведется, несмотря ни на какие морозы.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 7
    • 0
      В такой схеме ток у вас получится непостоянным (поэтому и пишут, что требуется постоянное присутствие и регулировка тока). Даже считая сопротивление ламп постоянным, ток будет меняться на 20%. А сопротивление ламп заметно зависит от накала (хотя чем больше напряжение, тем больше сопротивление, что частично скомпенсирует изменение тока, но надо считать или мерить).
      • 0
        Железная часть позволяет измерять напряжение на аккумуляторе, правда, не очень точно. Полагаю, что переписать код так, чтобы напряжение учитывалось в подсчете емкости, несложно. Я сам делал похожую штуку для слежения за разрядом литий-ионных аккумуляторов, и учитывал напряжение — график весьма нелинейный.
        Найти ВАХ лампочки тоже не очень сложно, из этого можно вычислить более-менее точную емкость.

        А вообще, если в это дело еще и амперметр засунуть, будет совсем здорово.
        • 0
          Литий-ионные аккумуляторы и свинцово-кислотные имеют сильно разные кривые разряда. Данная система применима именно к самый распространенным автомобильным свинцово-кислотным батареям. Меняя границу напряжения, можно перейти к различным сборкам других типов батарей.
          Амперметр можно подключить и создать БД, но упор делался на простоту схемы.
        • 0
          Погрешность измерения методом разрядки лампой накаливания укладывается в 5-7%, что для автомобильного аккумулятора в 45-65 Ач будет не очень критично. А так как лампа сама поддерживает свою температуру, то и сопротивление у нее меняется мало.
        • 0
          Активную нагрузку достаточно просто сделать на полевике. Подключаем его к любому PWM-выходу, настраиваем все сопутссвующее. Рабочий код такой:
          //Discharge procedure
          if ((state & POWER_BIT) && (state & ACTIVE_BIT) && (state & DISCHARGE_BIT)) {
          i = read_adc_last(CURRENT_IN);
          tmp = fabs(convert_current(i) * 10);
          if (tmp > (set_current + 1))
          OCR0--;
          if (tmp < (set_current — 1))
          OCR0++;
          current_counter = tmp*10/36;
          }
          Пояснения:
          read_adc_last — функция выдает последнее значение ацп из массива (нужно для вычисления среднего, чтоб не плавали показания на экране).
          convert_current — конвертирует значение тока с ацп в амперы. fabs нужен так как сигнал тока идет на общий вход ацп и при зарядке ток положительный, при разрядке — отрицательный.
          CURRENT_IN — константа с номером входа ацп
          set_current — переменная в которую пользователь задает желаемый ток. Умножено на 10, т.е. 10 = 1А
          плюс/минус 0.1 А — гистерезис.
          current_counter — счетчик милиампер-часов. Каждую секунду добавляется к общему счетчику. (усреднение еще не сделал).

          данная процедура выполняется по аппаратному таймеру раз в 50 мс (не важно на самом деле)

          Обычный low-profile кулер от 1155 сокета спокойно рассеивает 150 Вт.
          • 0
            Данный метод позволяет вычислить емкость с крайне высокой точностью. Его лечше использовать для аккумуляторов малой емкости, где каждый Ач на счету. Подскажите, какой полевик может выдержать ток 20А, если разряжать аккумулятор 190Ач током в 0,1С?
          • 0
            20А — смех вообще для типичного N-канального полевика. Тут скорее вопрос в максимально допустимой рассеиваимой мощности кристалла и сопротивлении в открытом состоянии.
            И тут ВНИМАНИЕ: надо подбирать заведомо «плохой» полевик с «высоким» сопротивлением затвора, что бы мощность рассеивалась именно на нем, а не на проводах, соединениях итд итп.
            Я использую IRFP360: 23 A максимальный ток, 280 Вт, 0.2 Ома в открытом состоянии (в реальности под нагрузкой и нагревом около 1 Ома).
            Главное рассеить мощность хорошим радиатором, но как я и говорил: процессорные кулеры в этом плане очень удобны и эффективны.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.