Зарядное для свинцовых аккумуляторов на базе ардуино

Тема в разделе "Технологии радиолюбителя", создана пользователем Ardu, 20 июл 2015.

  1. Ardu

    Ardu Нуб

    Доброго времени суток коллеги по увлечению! Нуждаюсь в зарядном устройстве для 12 В аккумуляторов.
    Для начала проект будет с самыми необходимыми функциями, позже функциональные возможности будут расширены.
    Требуемый алгоритм заряда: зарядка аккумулятора от внешнего стабилизированного источника тока начинается при снижении напряжения до 10.8 В на клеммах аккумулятора и заканчивается при повышении его до 14.7 В.
    Компоненты для зарядного устройства: ардуино про мини, модуль с реле, блок питания на 16 В и стабилизацией тока, делитель напряжения на резисторах.
    Программу напишу сам и буду дорабатывать её по мере развития проекта.
    В планах прицепить дисплей для индикации тока, напряжения, температуры, количества "влитых" амперчасов, общего времени заряда и времени между циклами заряд-разряд.
    Буду рад любой критике и информации.
     
  2. Deniss

    Deniss Гик

    Оставьте делитель напряжения для диодов, а еще лучше вообще забудьте про него. Зачем вообще напряжение зарядки менять? Первая стадия зарядки это 15В и большой ток (20-30% емкости), вторая добивка тем же напряжением и малым током вплоть до 0,1А
     
    Ardu нравится это.
  3. Ardu

    Ardu Нуб

    А как мне считывать напряжение с аккумулятора ардуинкой? Нельзя же напрямую на неё такое напряжение (10-15В)?! Видимо я непонятно объяснил, напряжение зарядки не будет меняться. При разряде аккумулятора до 10,8 В автоматически начинается его заряд током, ограниченным сверху в зависимости от ёмкости используемого аккумулятора. При первом касании 15 В - аккумулятор буду считать условно заряженным. Алгоритм заряда менять нельзя, нужен именно такой.
     
  4. DrProg

    DrProg Вечный нерд

    Напрямую нельзя, через делитель можно. Только как замерять напряжение самой батареи при ее зарядке? Вероятно надо периодически выключать ЗУ и замерять только после этого.
     
    ИгорьК и Ardu нравится это.
  5. Ardu

    Ardu Нуб

    Значит всё же делитель на резисторах использовать? А я не буду измерять напряжение на отстоявшейся батарее, слишком долго ждать придётся, поднялось до 15В и хватит, будет условно заряженной. Быстрее бы все комплектующие пришли, начну выкладывать фотки и описание процесса сборки.
     
  6. DrProg

    DrProg Вечный нерд

    Что там собирать то, два резистора, одно реле и проводков чуть.
     
    ИгорьК и Ardu нравится это.
  7. Ardu

    Ardu Нуб

    Планы грандиозные! Дисплей с кучей информации, температура заряжаемого аккумулятора, возможно и тренировочные разряды на мощную нагрузку будут. Следите за темой, проект будет усложняться. Начну с простого, а дальше будет веселее.
     
  8. Ardu

    Ardu Нуб

    Ну, поехали!
    Комплектующие пока такие:
    Транс 220 В на 16 В мощностью 600 Ватт, диодный мостик mb3510, ардуино про мини atmega168 5V 16MHz и cp2102 для заливки программ, твердотельное реле на базе irf520 (слабовато, поменяю на что-то мощнее), индикатор 1602, smd резисторы кОм'ные разных номиналов.
    Конденсатор для выпрямителя чуть позже приобрету.
    Пока ищу программу для замеров напряжения с аналогового порта и разбираюсь с индикатором 1602.
     
    Последнее редактирование: 17 авг 2015
  9. Ardu

    Ardu Нуб

    Irf 520 заменил на irfz48n.
    Пока алгоритм зарядки такой:
    Замеряем напряжение на аккумуляторе через резистивный делитель и, если оно меньше 13,2 В, подаём импульс тока длительностью 4 секунды. Потом ждём 4 секунды и снова замеряем напряжение.
    Смысл такой зарядки в более полном усвоении зарядного тока и предупреждении "закипания" аккумулятора.
     
    Последнее редактирование: 19 авг 2015
  10. Ardu

    Ardu Нуб

    Скетч пока выглядит так:
    int voltPin =0; //напряжение с аккумулятора через делитель
    int chargePin = 9; //выход на реле подачи зарядного импульса с выпрямителя

    void setup() {
    pinMode(chargePin, OUTPUT); //назначаем 9 пин выходом

    }

    void loop() {
    int val = analogRead(voltPin); //создаем переменную val

    if(val < 655) //если напряжение меньше 13 Вольт, то подаем импульс
    {
    digitalWrite(chargePin, LOW);
    delay(4000);
    } //задаем длительность зарядного импульса
    else
    {
    digitalWrite(chargePin, HIGH);

    }
    digitalWrite(chargePin, HIGH); \\пауза перед следующим замером
    delay(4000);
    }
    Как видите, заряд происходит безостановочно.
    Критерий окончания заряда ещё не придумал, скорее всего это будет большой интервал между импульсами заряда.
     
  11. Ardu

    Ardu Нуб

    Может кто-то хорошо разбирается в программировании и поможет мне изменить программу под такой алгоритм:
    1) замеряем напряжение на клеммах аккумулятора
    2) если напряжение меньше 13,2В, то включаем реле зарядки на 4 сек или до достижения 14,5 В, смотря что наступит быстрее.
    3) иначе выключаем реле
    4) замеряем напряжение до тех пор, пока оно перестанет падать со скоростью быстрее 0,01 В в минуту
    5) начинаем цикл заново.
     
  12. Ardu

    Ardu Нуб

    Сразу прошу строго не судить, до написания проги я знал два оператора, теперь уже знаю четыре! Все работает, скетч сейчас такой:
    int voltPin =0; //напряжение с аккумулятора через делитель
    int chargePin = 9; //выход на реле подачи зарядного импульса с выпрямителя

    void setup() {
    Serial.begin(115200);
    pinMode(chargePin, OUTPUT); //назначаем 9 пин выходом
    }

    void loop() {
    label:
    delay(6000);
    int val = analogRead(voltPin); //создаем переменную val
    delay(200);
    int val20 = analogRead(voltPin);
    float voltage = ((val+val20)/2) * (18.9 / 1023.0);
    Serial.println("__________Reading___________");
    Serial.println("Voltage");
    Serial.println(voltage);
    if(voltage < 13.4) //если напряжение меньше 13.4 Вольта, то подаем импульс
    { Serial.println("VOLTAGE<13.4 Charge");
    digitalWrite(chargePin, LOW);
    delay(1000);
    int vall = analogRead(voltPin); //создаем переменную val
    delay(200);
    int val201 = analogRead(voltPin);
    float voltage1 = ((vall+val201)/2) * (18.9 / 1023.0);
    Serial.println(voltage1);
    if(voltage1 < 14.7)
    {
    digitalWrite(chargePin, LOW);
    Serial.println("VOLTAGE<14.7 Charge1");
    delay(1000);
    }
    else
    {
    digitalWrite(chargePin, HIGH);
    Serial.println("Kasanie14.7 na 1 SEC");
    goto label;
    }
    int val2 = analogRead(voltPin);
    delay(200);
    int val202 = analogRead(voltPin);
    float voltage2 = ((val2+val202)/2) * (18.9 / 1023.0);
    Serial.println(voltage2);
    if(voltage2 < 14.7)
    {
    digitalWrite(chargePin, LOW);
    Serial.println("VOLTAGE<14.7 Charge2");
    delay(1000);
    }
    else
    {
    digitalWrite(chargePin, HIGH);
    Serial.println("Kasanie14.7 na 2 SEC");
    goto label;
    }
    int val3 = analogRead(voltPin);
    delay(200);
    int val203 = analogRead(voltPin);
    float voltage3 = ((val3+val203)/2) * (18.9 / 1023.0);
    Serial.println(voltage3);
    if(voltage3 < 14.7)
    {
    digitalWrite(chargePin, LOW);
    Serial.println("VOLTAGE<14.7 Charge3");
    delay(1000);
    }
    else
    {
    digitalWrite(chargePin, HIGH);
    Serial.println("Kasanie14.7 na 3 SEC");
    goto label;
    }
    int val4 = analogRead(voltPin);
    delay(200);
    int val204 = analogRead(voltPin);
    float voltage4 = ((val4+val204)/2) * (18.9 / 1023.0);
    Serial.println(voltage4);
    if(voltage4 < 14.7)
    {
    digitalWrite(chargePin, LOW);
    Serial.println("VOLTAGE<14.7 Charge4");
    delay(1000);
    digitalWrite(chargePin, HIGH);
    }
    else
    {
    digitalWrite(chargePin, HIGH);
    Serial.println("Kasanie14.7 5SEC");
    goto label;
    }
    }
    else
    {
    Serial.println("Voltage>13.4V");
    digitalWrite(chargePin, HIGH);
    Serial.println("OverVoltageWAIT");
    delay(8000);
    }
    Грабли случились в виде просадки опорного напряжения,
    под нагрузкой в виде реле. Запитал модуль реле отдельно.
    Как "это чудо" работает:
    Если аккумулятор разряжен, зарядное будет выдавать
    4 сек заряда и столько же времени отдыха до тех пор, пока
    напряжение на аккумуляторе не достигнет 14,5 В. Тут же заряд
    будет отключен и не возобновится до снижения напряжения на
    клеммах 13,4 Вольта и ниже. В таком режиме можно оставить
    аккумулятор на сутки.
    Токи в пределах разумного, при ёмкости 7 А/ч 2 А, а при 40А/ч 10 А.
    Если победю сульфатацию, отпишусь. Чуть позже буду дорабатывать проект.
     
    Последнее редактирование: 28 авг 2015
  13. Ardu

    Ardu Нуб

    Нечаянно удалил принципиальную схему: IMG_20150824_180554.jpg
     

    Вложения:

  14. DrProg

    DrProg Вечный нерд

    Сразу не понял, зачем измерять напряжение дважды с промежутком 20 милисекунд? Что изменяется за это время?
     
    ИгорьК нравится это.
  15. Ardu

    Ardu Нуб

    Хотелось усреднить данные о напряжении, скачут они как-то неадекватно. Мультиметр намного точнее показывает и главное стабильно. Видимо какие-то наводки... Может коэффициент резистивного делителя изменить попробовать?
     
  16. Unixon

    Unixon Оракул

    А никто не хочет в этой установке ток зарядки измерить и отрегулировать? :)
    Аккумулятору то вообще-то ток даже важнее, чем напряжение... (в рабочем диапазоне)
     
    Последнее редактирование: 29 авг 2015
  17. DrProg

    DrProg Вечный нерд

    Вот тут почти готовая схема включая делитель. ;)
     
    ИгорьК и Ardu нравится это.
  18. Ardu

    Ardu Нуб

    Прикрутил дисплей 1602, научил его русскому и переделал скетч, он пока испытания проходит.
    Расчетный ток около 30 А, ток можно LM до 5 Ампер ограничить. Импульсный зарядный ток может быть больше, чем рекомендуемый. А если будет "вскипать", то ардуино его вычислит за счёт скачка напряжения при заряде. Контакты реле разомкнутся и заряд будет приостановлен.
    Добавлено позднее:
    С аккумулятором происходят какие-то чудеса! Полностью заряженный, после отстоя, показывает 12,54В, вместо 12,9В (как обычно)
     
    Последнее редактирование: 29 авг 2015
  19. Ardu

    Ardu Нуб

    Сейчас проходит обкатка скетча, алгоритм получился интересным.
    Жду твердотельное реле, надеюсь с ним перестанет виснуть дисплей.
    На данный момент дисплей виснет в течении нескольких часов заряда.
     
  20. DrProg

    DrProg Вечный нерд

    Рекомендую сделать так, чтобы подсветка дисплея отключалась через несколько минут после активных действий, потом включалась если что то происходит. Так увеличивается ресурс и уменьшаются глюки.
     
    ИгорьК и Ardu нравится это.