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

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

  1. Ardu

    Ardu Нуб

    Спасибо, буду знать! Но в моём случае активные действия продолжаются практически непрерывно. Подумываю сделать индикацию на светодиодах. Твердотельное реле мне необходимо для снижения шума и увеличения силы допустимого тока.
     
  2. jambose

    jambose Нуб

    Как с зарядкой обстоят дела? Что-то тема остоновилась.
     
  3. ostrov

    ostrov Гуру

    Не первый случай, когда дело начинается мощным фанатизмом и заканчивается скромной тишиной.
     
  4. Vad33

    Vad33 Капитан-оригинал

    Бензин кончился. :(
     
  5. Влерий

    Влерий Нуб

    В принципиальной схеме ошибка...
    А именно надо диодный мост повернуть на 180 градусов.
     
  6. alp69

    alp69 Форумчанин

    Да и конденсатор на 20000 мкф вызывает сомнение. Реле непонятно какие цепи коммутирует.
     
  7. Aliotr

    Aliotr Нерд

    Что не понравилось:
    1. 16 вольт не выдадут 30 ампер
    2. Напряжение заряда сглажено большим конденсатором. От него будут искры при подключении. Для чего он нужен?
    3. Питание ардуино от той же обмотки что и нагрузка.
    4. Нет фильтров от импульсных помех.
    5. Твердотельное реле на коммутацию постоянного тока (нет регулировки, но есть коммутация)
    6. Зачем здесь ардуино, не понятно вообще, может для случайных сбоев и зависаний зимой?
    7. Очень дорогостоящий проект.
    Думаю:
    зарядное должно быть недорогим, простым и надежным устройством, работающем в жару, холод, влажность с одинаковой стабильностью. Может быть не очень мощным (до 4А) переносным (не тяжелым) или стационарным в гараже ( под потолок его, чтобы не мешался)).
    Регулировку и коммутацию дешевле и проще делать на тиристорах, это старая аксиома.

    Ну а задумка имеет право на жизнь, ждем результата, может и мнение сменю ))
     
  8. Leone

    Leone Нерд

    Немного код подправил проверьте может есть замечания

    Код (C++):
    int voltPin =0; //напряжение с аккумулятора через делитель
    int chargePin = 13; //выход на реле подачи зарядного импульса с выпрямителя





    void setup()
    {
      Serial.begin(9600);
      pinMode(chargePin, OUTPUT); //назначаем пин выходом
      pinMode(voltPin, INPUT);    //Задаємо вхід для сканування напруги
    }


           

    void loop()
    {    int voltage;

       label: /// Просканувати величину напруги та та почати зарядку або відмінити її

           
             voltage = voltage_1(); //читаємо напругу
             Serial.println("Voltage");
             Serial.println(voltage);              
       if(voltage < 13.5) //если напряжение меньше 13.5 Вольта, то подаем импульс
           {
              voltage = voltage_1();  //читаємо напругу
               Serial.println("__________Reading___________");
               Serial.println("Voltage");
               Serial.println(voltage); //Надрукувати значення напруги
           
                digitalWrite(chargePin, HIGH); //Включити зарядку
             
         label_1: //Заряджання не вийшло за межі тому продовжуємо цикл    

     
                delay(500);
                voltage = voltage_1(); //читаємо напругу
                Serial.println("Cikl_po4ato");
                Serial.println("Voltage");
                Serial.println(voltage); //Надрукувати значення напруги
                if(voltage < 14.5)  //Якщо напруга меньше тоді виконуємо
                {
                    digitalWrite(chargePin, HIGH); //Включити зарядку
                    Serial.println("VOLTAGE<14.5 Charge_1");
                    delay(2000);
                }
                else   //Якщо ні то зупиняємо зарядку та переходемо на початок і чекаємо падіння напруги до заданої
                {
                    digitalWrite(chargePin, LOW); //Зупинити зарядку
                    Serial.println("Kasanie>14.5 na 1 SEC");
                    goto label;
                }
                voltage = voltage_1(); //читаємо напругу
             
                Serial.println(voltage);
                if(voltage < 14.5)  //Якщо напруга меньше тоді виконуємо
                {
                    digitalWrite(chargePin, HIGH);  //Включити зарядку
                    Serial.println("VOLTAGE<14.5 Charge_2");
                    delay(2000);
                }
                else   //Якщо ні то зупиняємо зарядку та переходемо на початок і чекаємо падіння напруги до заданої
                {
                    digitalWrite(chargePin, LOW);     //Зупинити зарядку
                    Serial.println("Kasanie14.5 na 2 SEC");
                    goto label;
                }
                voltage = voltage_1(); //читаємо напругу
                Serial.println(voltage);
                if(voltage < 14.5)  //Якщо напруга меньше тоді виконуємо
                {
                    digitalWrite(chargePin, HIGH);  //Включити зарядку
                    Serial.println("VOLTAGE<14.5 Charge_3");
                    delay(2000);
                }
                else   //Якщо ні то зупиняємо зарядку та переходемо на початок і чекаємо падіння напруги до заданої
                {
                    digitalWrite(chargePin, LOW);    //Зупинити зарядку
                    Serial.println("Kasanie14.5 na_3_SEC");
                    goto label;
                }
                voltage = voltage_1(); //читаємо напругу
                Serial.println(voltage);
                if(voltage < 14.5)  //Якщо напруга меньше тоді виконуємо
                {
                    digitalWrite(chargePin, HIGH);   //Включити зарядку
                    Serial.println("VOLTAGE<14.5 Charge_4");
                    delay(2000);
                    Serial.println("CIKL_ZAVERHENO");
                    digitalWrite(chargePin, LOW);    //Зупинити зарядку
                }
                else   //Якщо ні то зупиняємо зарядку та переходемо на початок і чекаємо падіння напруги до заданої
                {
                    digitalWrite(chargePin, LOW);    //Зупинити зарядку
                    Serial.println("Kasanie<14.7_5_SEC");
                 
                    goto label;
                }
             
            }
       
        else  //Очікуємо заданий час та перевіряємо чи напруга зменшилась для надання дозволу зарядки
        {
        Serial.println("Voltage>14.5V");
        digitalWrite(chargePin, LOW);    //Зупинити зарядку
        Serial.println("full_charge_WAIT");
        delay(10000);
        goto label;
        }
    delay(6000); //Затримка між циклами зарядки
    goto label_1;  
       
       
       
    }

                             
                  int voltage_1 ()
                  {
                  int ReadVolt;
                  int ReadVolt_2;
                    ReadVolt = analogRead(voltPin);
                    delay(200);
                    ReadVolt_2 = analogRead(voltPin);
                  int voltage_1 = ((ReadVolt+ReadVolt_2)/2) * (18.9 / 1023.0);
                  return voltage_1;
             
                   }
     
    Последнее редактирование: 6 мар 2017
  9. Unixon

    Unixon Оракул Модератор

    @Leone, отредактируйте пост. Используйте тэг [ code ] [ /code ].
     
  10. alp69

    alp69 Форумчанин

    Есть. Они здесь.
     
  11. Leone

    Leone Нерд

    Сори первий раз тут!
     
    alp69 нравится это.
  12. mcureenab

    mcureenab Гуру

    Дешевле в магазине зарядное устройство купить. Отечественные под маркой Орион весьма достойные. И с цифровым управлением есть. Только подделок много. Нужно или непосредственно с сайта завода заказывать или у дилера по ссылке.

    Использовать для зарядника трансформатор на 600ватт это жесть по нынешним импульсным временам.
     
  13. Промах

    Промах Нерд

    Соглашусь на все 100 , может конечно ТС хотел "надёжности" добавить применив т-р , но меня 6 лет устраивает орион ( была поломка , кондер пленочный разорвало , поменял пару - проблемм нет ), он и блок питания до 18А и зарядник всепогодный . И подделки с АТХ блоком внутри повидал .
     
  14. Leone

    Leone Нерд

    Вот пример на два режима 6-12в таймерами можете подогнать под себя как источник питания БП-ПК (разогнаний до 16в) все поместилось в корпус плюс вольтметр и амперметр реле ииспользовал только на розряд и то для сохранения места так как радиатор транзисторов занимают много места на заряд использовал мощьныэ транзистори при 6А ели теплыэ!
    Код (C++):
    #define voltPin A0 //напряжение с аккумулятора через делитель
    #define chargePin  13 //выход на реле подачи зарядного импульса с выпрямителя
    #define switcherPin  10 //перемикач режиму заряду
    #define Led_6V  2 //Вихід на світлодіод зарядки в режимі 6в
    #define Led_12V  3 //Вихід на світлодіод зарядки в режимі 12в
    #define Disherge  4 //вихід на реле розряду

    void setup()
    {
        Serial.begin(9600);
        pinMode(chargePin, OUTPUT); //назначаем пин выходом
      pinMode(voltPin, INPUT);    //Задаємо вхід для сканування напруги
      pinMode(switcherPin, INPUT_PULLUP);
      pinMode(Led_6V, OUTPUT);
      pinMode(Led_12V, OUTPUT);
      pinMode(Disherge, OUTPUT);
    }

    void loop()
    {

      Serial.println(digitalRead(switcherPin));
      if(!digitalRead(switcherPin))
      {
        Serial.println("12V charging mode!");
        digitalWrite(Led_6V, LOW);
        digitalWrite(Led_12V, HIGH);
          if(CheckCapacity12V()) Charged12V();
          else Charging12V();
     

      }
      else
      {
        Serial.println("6V charging mode!");
        digitalWrite(Led_12V, LOW);
        digitalWrite(Led_6V, HIGH);
        if(CheckCapacity6V()) Charged6V();
        else Charging6V();
     

      }
    }



    void Charged6V()
    {
        Serial.println("6V battery is fullcharged!");
        Serial.print("Voltage: ");
        Serial.println(voltage());
      digitalWrite(chargePin, LOW);
        delay(10000);
     
    }

    void Charging6V()
    {
      Serial.println("6V charging!");
        while(voltage()<6.47)
    {
            Serial.print("Voltage: ");
            Serial.println(voltage());
        digitalWrite(chargePin, HIGH);
        digitalWrite(Disherge, LOW);
        delay(3000);
        digitalWrite(chargePin, LOW);
        digitalWrite(Disherge, HIGH);
        delay(500);
        if (digitalRead(switcherPin)!=1) return;
    }
    }


    bool CheckCapacity6V()
    {
        if(voltage()>6.39)
    {
       
          Serial.print("Voltage: ");
          Serial.println(voltage());
        return  true;
    }
     
        else
      {
         

          Serial.print("Voltage: ");
          Serial.println(voltage());
        return  false;
        }

    }

    void Charged12V()
    {
      Serial.println("12V battery is fullcharged!");
      Serial.print("Voltage: ");
      Serial.println(voltage());
      digitalWrite(chargePin, LOW);
      delay(10000);

    }

    void Charging12V()
    {
      Serial.println("12V charging!");

      while(voltage()<12.94)
    {
        Serial.print("Voltage: ");
        Serial.println(voltage());
        digitalWrite(chargePin, HIGH);
        digitalWrite(Disherge, LOW);
        delay(3000);
        digitalWrite(chargePin, LOW);
        digitalWrite(Disherge, HIGH);
        delay(500);
        if (digitalRead(switcherPin)!=0) return;
    }
    }


    bool CheckCapacity12V()
    {
      if(voltage()>12.80)
    {
     
        Serial.print("Voltage: ");
        Serial.println(voltage());
        return  true;
    }

      else
      {
     

        Serial.print("Voltage: ");
        Serial.println(voltage());
        return  false;
        }

    }


    float voltage()
    {
        float ReadVolt;
        float ReadVolt_2;
        ReadVolt = analogRead(voltPin);
        delay(200);
        ReadVolt_2 = analogRead(voltPin);
        float voltage_1 = ((ReadVolt+ReadVolt_2)/2) * (18.9 / 1023.0);
        return voltage_1;
    }
     
     
  15. Промах

    Промах Нерд

    Схему подключения обвязки к ардуине в студию, с номиналами деталей , особенно интересно как замер тока происходит .
     
  16. Leone

    Leone Нерд

    Ампераж замеряю цифровим амперметром вне схеми вольтаж тоже есть цифровой но и ардуинка его видит через делитель вот схема
     

    Вложения:

  17. Промах

    Промах Нерд

    Не , это неправильно , при таком раскладе есть шанс взорвать аком с замкнутой банкой ( или если замкнёт в процессе) , по любому надо как то задавать диаппазон возможных напряжений , ограничивать ток , особенно при глубоком разряде .
    У меня китайский IMAX B6 на 128 атмеге, замечательная штука , заряжает что угодно . Может есть где то в сети исходники , там и по току и по напряжению контроль, и защиты . Ценник на неё от 1000 до ..... , я брал за 1080 р .той весной.
     
    Leone нравится это.
  18. Leone

    Leone Нерд

    Согласен но пока так!
     
  19. Leone

    Leone Нерд

    Вот вариант с учетом ампеража схему пока еще не собрал если что до роботою то скину
    Код (C++):
    #define voltPin A0 //напряжение с аккумулятора через делитель
    #define chargePin  13 //выход на реле подачи зарядного импульса с выпрямителя
    #define switcherPin  10 //перемикач режиму заряду
    #define Led_6V  2 //Вихід на світлодіод зарядки в режимі 6в
    #define Led_12V  3 //Вихід на світлодіод зарядки в режимі 12в
    #define Disherge  4 //вихід на реле розряду
    #define AMPER_PIN A1 //Вхід сканування сили струму


    void setup()
    {
      Serial.begin(9600);
      pinMode(chargePin, OUTPUT); //назначаем пин выходом
      pinMode(voltPin, INPUT);    //Задаємо вхід для сканування напруги
      pinMode(switcherPin, INPUT_PULLUP); //Вхід для сканування стану перемикача режиму зарядки
      pinMode(Led_6V, OUTPUT); //Вихід на світлодіод індикації режиму зарядки на 6 вольт
      pinMode(Led_12V, OUTPUT); //Вихід на світлодіод індикації режиму зарядки на 12 вольт
      pinMode(Disherge, OUTPUT); // Вихід на реле розрядки
      pinMode(AMPER_PIN, INPUT); // Вхід для сканування струму
      }

    void loop()
    {
      Serial.println(digitalRead(switcherPin)); //Надрукувати положення перемикача
      if(!digitalRead(switcherPin)) //Якщо перемикач в режимі 12в виконати це
      {
        Serial.println("12V charging mode!"); //Надрукувати режим зарядки 12в
        digitalWrite(Led_6V, LOW);  //Погасити світлодіод 6в
        digitalWrite(Led_12V, HIGH); //Запалити світлодіод 12в
        if(CheckCapacity12V()) Charged12V(); //Звірити нупругу АКБ запустити режим зарядки 12в
        else Charging12V(); //якщо АКБ заряжено очікувати падіння до можливості включення повторної зарядки в режимі 12в
     

      }
      else //якщо перемикач в режимі 6в виконати це
      {
        Serial.println("6V charging mode!"); //Надрукувати режим зарядки 6в
        digitalWrite(Led_12V, LOW); //Погасити світлодіод режиму 12в
        digitalWrite(Led_6V, HIGH); //включити світлодіод режиму 6в
        if(CheckCapacity6V()) Charged6V(); //Звірити нупругу АКБ запустити режим зарядки 6в
        else Charging6V(); //якщо АКБ заряжено очікувати падіння до можливості включення повторної зарядки в режимі 6в
     

      }
    }



    void Charged6V() //Створення функції зарядка завершена 6в
    {
      Serial.println("6V battery is fullcharged!"); //Надрукувати зарядка на 6в завершена
      digitalWrite(chargePin, LOW); //Відключити зарядку
      Serial.print("Voltage: ");
      Serial.println(voltage());//Надрукувати напругу АКБ
      delay(10000);
     
    }

    void Charging6V() //Створення функції зарядка в режимі 6в
    {
      Serial.println("6V charging!"); //надрукувати режим зарядки
      while(voltage()<6.47) //Якщо напруга менше заданої
    {
        Serial.print("Voltage:   ");
        Serial.println(voltage());  // надрукувати значення напруги АКБ
        digitalWrite(chargePin, HIGH); //Включити вихід на зарядку
        digitalWrite(Disherge, LOW); //відключити реле розрядки
        if(AMPER() < 1.00 )  //якщо струм меньше заданого тоді виконати
        {
          Serial.print("Amperag:  ");
          Serial.println(AMPER()); //надрукувати значення струму
                delay(2000); //Час тривалості імпульсу зарядки
          digitalWrite(chargePin, LOW); //відключити зарядку
          digitalWrite(Disherge, HIGH); //включити реле розрядки
          delay(1000); //Час розряди
          if (digitalRead(switcherPin)!=1) return; //зчитати режим зарядки  та виконати повторно цикл зарядки якщо режим не змінено
        }
        else Amperag_HIGH(); //якщо струм більше заданого вище перейти в режим перевищення струму
      }
    }


    bool CheckCapacity6V() //Створення функції перевірки напруги в режимі 6в
    {
      if(voltage()>6.39) //якщо напруга АКБ перевищить задане вище значення то чекати падіння нижче заданого тут значення
    {
        Serial.print("Voltage: ");
        Serial.println(voltage());
        return  true; //повернути вірно
    }
      else //якщо ні
      {
       
     
        Serial.print("Voltage: ");
        Serial.println(voltage());
        return  false; //повернути невірно
        }

    }

    void Charged12V()//Створення функції батарея заряжена в режимі 12в
    {
      Serial.println("12V battery is fullcharged!");
      digitalWrite(chargePin, LOW); //Відключити зарядку
      Serial.print("Voltage: ");
      Serial.println(voltage()); //надрукувати напругу АКБ
     
      delay(10000);
     
    }

    void Charging12V()//Створення функції зарядка в режимі 12в
    {
      Serial.println("12V charging!"); //надрукувати режим 12в

      while(voltage()<12.94) //якщо напруга АКБ меньше заданої то виконати це
    {
        Serial.print("Voltage: ");
        Serial.println(voltage()); //надрукувати нарпугу АКБ
        digitalWrite(chargePin, HIGH); //Включити вихід на зарядку
        digitalWrite(Disherge, LOW); //відключити реле розрядки
        if(AMPER() < 5.00 ) //перевірити струм якщо він меньше заданого то виконати
        {
          Serial.print("Amperag:  ");
          Serial.println(AMPER()); //надрукувати значення струму
                delay(2000);  //час тривалості зарядки
          digitalWrite(chargePin, LOW); //відключити зарядку
          digitalWrite(Disherge, HIGH); //включити реле розрядки
          delay(1000); //час розрядки
        if (digitalRead(switcherPin)!=0) return; //звірити режим зарядки якщо його не змінено топовторити цикл
        }
        else Amperag_HIGH(); //якщо струм перевищив задане перейти в режим високий струм
    }
    }

    bool CheckCapacity12V() //Створення функції перевірка зарядкив режимі 12в
    {
      if(voltage()>12.80) //якщо напруга АКБ перевищить задане вище значення то чекати падіння нижче заданого тут значення
    {
       
        Serial.print("Voltage: ");
        Serial.println(voltage());
        return  true; //повернути вірно
    }
     
      else //якщо ні
      {
       
     
        Serial.print("Voltage: ");
        Serial.println(voltage());
        return  false; //повернути невірно
        }

    }

    void Amperag_HIGH() //Створення функції Високий струм
    {
      Serial.print("Amperag_HIGH  ");
      Serial.println(AMPER());  //надрукувати значення струму
      digitalWrite(chargePin, LOW); //відключити вихід на зарядку
      delay (5000); //зачекати заданий час
     
    }

    float AMPER() //Створення функції зчитати значення струму
    {
      return analogRead(AMPER_PIN) * (10 / 1023.0); //зчитати значення струму та ввести його в межі від 0-10А
    }


    float voltage() //створення функції зчитати значення напруги
    {
        float ReadVolt; //створення функції зчитати напругу 1 раз
        float ReadVolt_2; //створення функції зчитати напругу другий раз
        ReadVolt = analogRead(voltPin); //зчитуєм напругу перший раз
        delay(200); //чекаємо заданий час
        ReadVolt_2 = analogRead(voltPin); //читаємо напругу другий раз
        float voltage_1 = ((ReadVolt+ReadVolt_2)/2) * (18.9 / 1023.0); //напруга буде рівна зчитано перший раз плюс другий раж та підігнано в межі від 0-18.9в
        return voltage_1; //повернути середне значення напруги
    }
     
     
  20. Промах

    Промах Нерд

    Ещё кой чего - напруга для стандартных аков - макс 15.0 В для тех что с надписью calcium - до 16 , но опять же , смотреть что производитель рекомендует .
    ещё- для гелевых максимум 14,5-15,6 . . при том что для 6 вольтовой гели 7,4 -7,8 , и якобы перезаряд влечёт резкую потерю ёмкости. хотя с моей практики - гель терпел перезаряд гораздо лучше чем обычные кислотные .