Зарядка аккумулятора • Golf König Club - VW клуб Калининград •



Встречи Клуба каждую пятницу в 20.00 на АЗС "Нефтегаз Калининград" на Московском пр-те, 233

Часовой пояс: UTC + 2 часа



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Зарядка аккумулятора
СообщениеДобавлено: 10 фев 2018, 11:04 
Не в сети
Аватар пользователя

Зарегистрирован: 12 сен 2009, 15:10
Сообщений: 3754
Откуда: Кениг-Абад
Благодарил (а): 6 раз.
Поблагодарили: 53 раз.
Имя: Олег
Марка авто: -
Код двигателя: -
Год выпуска: 1900
№ тел.: 89212604616
Всем реле!

На новогодних праздниках решил подзарядить аккумуляторы в обоих авто, тк намечались морозы, да и машинки ежедневно пробегали по 10 км не больше в 2 приема, хронический недозаряд. Был неприятно удивлен, что аккумуляторы практически не берут заряд, оба бош сильвер S5 005, 61 и 63 Ач, одному год, второму два. Напряжение после отстоя у обоих 12.3- 12,4В, ставишь на зарядку - через несколько минут напруга 15,6В. И пистец. Отключаешь зарядку - через 10 минут 12.5В. Но оба крутят бодро, бош есть бош.
Полез курить интернет, наткнулся на очень интересный форум, в частности http://electrotransport.ru/ussr/index.php?topic=2103.0
Выкурил почти весь раздел сайта про свинец, решил сделать сам приставку к своей зарядке на ардуино. Купил втридорога на авито ардуино нано, накидал простенький адаптивный скетчик, прикрутил твердотельное реле. Первый аккумулятор простоял в режиме "добивки" емкости импульсами ночь. Напряжение после суток отстоя 13,0! Второй продержал сутки в добивке, но он сразу пошел в работу без отстоя. Далее одно неосторожное движение и я спалил ардуину...
Т.к. оба аккума заряжены, решил сам заказать ардуин с Китая. Заодно будет время прошивку подправить.
Я в С++ не силен, привык к Паскалю, полез в тырнет, попутно выяснил неприятный момент с ардуино - очень низкая точность измерений, я это заметил еще на первом устройстве, алгоритм не совсем корректно работал. В результате наткнулся на Massduino http://www.inhaos.com/product_info.php?products_id=161

Предлагаю свой вариант приставки-"моргалки" для заряда автомобильных аккумуляторов от любого имеющегося трансформаторного зарядного устройства. В будущем прикуярю монитор устройство приспособлю под компьютерный БП.

Пока модули ехали из Китая допилил прошивку. Несколько дней назад приехали. Отладил прошивку и снова снял аккумуляторы погонять. Тот двухлетний, который в прошлый раз был в добивке всего ночь, в машине на морозе без движения больше недели - начальная напруга 12,3В, бодро жрал заряд в течении 2х часов, далее добивка 2 суток. Через полчаса отстоя напряжение 13.2В, пошел в работу на замену второму аккумулятору. Второй годовалый аккумулятор - начальное напряжение 12.6В, поставил сегодня утром на зарядку, сразу ушел в режим добивки, авто на ходу ежедневно, пробеги также короткие, 15 км в день в 2 поездки. Практически через месяц после первой зарядки с добивкой сутки остался нормально заряженным. Значит сульфаты ушли. Погоняю его до понедельника.

Прошивка:
Код:
#include <stdint.h>
#define maxV 18650   //  R1=10.00 kOhm  R2=1.52 kOhm
#define U0 1033
#define U50 12300.
#define UpLimit 14220
#define dU 1
#define ChargeTime 250
#define MeasureCount 4
#define VoltmeterPin A7
#define ChargeRelayPin 2
#define InternalLedPin 13

// Переменные
uint16_t U1, RelaxPeriod = 1000;
//Функции
uint16_t ReadU (uint8_t Pin)
{
  uint32_t S = 0,
           SumU = 0;
  uint8_t j = 0;
  struct MeasuredValue
  {
    uint16_t Value;
    int16_t Delta;
  } U[MeasureCount];
  for (uint8_t i = 0; i <= (MeasureCount - 1); i++) // Считаем среднее арифметическое
  {
    U[i].Value = analogRead_16bits(Pin);
    SumU += U[i].Value;
  }
  SumU /= MeasureCount;
  for (uint8_t i = 0; i <= (MeasureCount - 1); i++) // Считаем среднеквадратическую погрешность
  {
    U[i].Delta = SumU - U[i].Value;
    U[i].Delta = abs(U[i].Delta);
    S +=  sq(long(U[i].Delta));
  }
  S /= (MeasureCount - 1);
  S = sqrt( S );
  // S *= 3;
  SumU = 0;

  for (uint8_t i = 0; i <= (MeasureCount - 1); i++)// Отсеиваем промахи
  {
    //Serial.print (abs(U[i].Delta));

    // Serial.print("  ");
    // Serial.print ( S);
    if (U[i].Delta <=  S)
    {
      SumU += U[i].Value;
      j++;
    }
    // Serial.print("  ");
    //  Serial.println(j);

  }
  /* if (j == 0)
    {
     for (uint8_t i = 0; i <= (MeasureCount - 1); i++)
     {
       Serial.print (i);
       Serial.print("  ");
       Serial.print (U[i].Delta);
       Serial.print("  ");
       Serial.println (U[i].Value);
     }
     Serial.println(S);

    }
  */
  SumU /= j;
  SumU = map(SumU, U0, 65535, 0, maxV);
  //Serial.println (U1);
  // Serial.println (j);
  return SumU;
}
//Процедуры
void relax(uint16_t dUPeriod)
{
  uint16_t U2;
  do
  {
    U1 = ReadU(VoltmeterPin);
    delay (dUPeriod);
    U2 = ReadU(VoltmeterPin);
  }
  while ((U1 - U2) >= dU);
  //Serial.println (U1);Serial.println (U2);Serial.println (U1-U2);Serial.println ();
}
void relayON()
{
  digitalWrite(ChargeRelayPin, HIGH);
  digitalWrite(InternalLedPin, LOW);
}
void relayOFF()
{
  digitalWrite(ChargeRelayPin, LOW);
  digitalWrite(InternalLedPin, HIGH);
}
//Инициализация
void setup()
{
  analogReference(INTERNAL2V56);
  pinMode(ChargeRelayPin, OUTPUT);   //SSR-10DA
  pinMode(InternalLedPin, OUTPUT);  //LED
  pinMode(VoltmeterPin, INPUT);    //Voltmeter
  do                //защита от обратной полярности
  {
    U1 = analogRead_16bits(VoltmeterPin);
    digitalToggle(InternalLedPin);
    delay(250);
  }
  while (U1 == 0);
  do                //раскачка до 12В
  {
    delay(2000);
    U1 = ReadU(VoltmeterPin);
    relayON();
    delay(1000);
    relayOFF();
  }
  while (U1 <= 12000);
  delay(500);
  //Serial.begin(9600);
}
//Цикл
void loop()
{
  uint32_t Timer, ChargePeriod;
  Timer = millis();
  relax(RelaxPeriod);
  Timer = millis() - Timer;
  U1 = ReadU(VoltmeterPin);
  RelaxPeriod = int(pow(2.72, ((U1 - U50) / 1000)) * 1000);
  relayON();
  //Timer = constrain(Timer, 500, 60000);
  ChargePeriod = int(pow(2.72, ((U50 - U1) / 1000)) * Timer);
  //Serial.println (U1); Serial.println (Timer); Serial.println (ChargePeriod); Serial.println (RelaxPeriod); Serial.println ();
  Timer = millis();
  delay(ChargeTime);
  while ((U1 <= UpLimit) && ((millis() - Timer) <= ChargePeriod))
  {
    U1 = ReadU(VoltmeterPin);
  }
  // Serial.println (U1);
  relayOFF();
}



Схема:


У вас нет доступа для просмотра вложений в этом сообщении.


Последний раз редактировалось Necromant 03 июн 2018, 21:50, всего редактировалось 8 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зарядка аккумулятора
СообщениеДобавлено: 10 фев 2018, 13:33 
Не в сети
Аватар пользователя

Зарегистрирован: 12 сен 2009, 15:10
Сообщений: 3754
Откуда: Кениг-Абад
Благодарил (а): 6 раз.
Поблагодарили: 53 раз.
Имя: Олег
Марка авто: -
Код двигателя: -
Год выпуска: 1900
№ тел.: 89212604616
У меня простое зарядное: 2 трансформатора ТН180, диодный мост, конденсатор на 2200 мкФ. К выводам аккумулятора подключаю клеммы от зарядного и крокодилами моргалку, причем стараюсь чтобы клемма зарядного не касалась крокодила, был контакт только через вывод аккумулятора. Питание моргалки по USB от зарядника для мобильника. Выпрямитель подключен через твердотельное реле, применены обычные провод с вилкой и розетка.

Про моргалку:
Делитель напряжения из тех номиналов, что были под рукой. Massduino выбрано именно из-за 16-битного АЦП. Можно использовать и 12-битные.
Цена вопроса: контроллер 130 руб, реле SSR-10DA 150 руб, крокодилы 8 руб, резисторы, вилка с розеткой из запасов.

_________________
Golf II'90 1,6 PN АКПП Ecotronic(2EE) Г/у 3-дв - экспроприирован супругой
Golf II'85 1,6 EZ АКПП 2E2 3-дв - снова возит мою попу
Не думай о том, о чем я не думаю!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зарядка аккумулятора
СообщениеДобавлено: 14 фев 2018, 17:59 
Не в сети
Аватар пользователя

Зарегистрирован: 12 сен 2009, 15:10
Сообщений: 3754
Откуда: Кениг-Абад
Благодарил (а): 6 раз.
Поблагодарили: 53 раз.
Имя: Олег
Марка авто: -
Код двигателя: -
Год выпуска: 1900
№ тел.: 89212604616
Позавчера закончил с нормальным аккумуляторами, перешел к трупам. Трофейный 12Ач из ИБП нивкакую не захотел заряжаться, начальное напряжение 10.5, через 6 часов пыток 10.8 . Плюнул на него, долил воды по 2 кубика в каждую банку и отставил. Сунул на зарядку 55Ач Медалист, вроде 2005 г.в. (не нашел маркировку) Помер он 2 года назад. Начальное напряжение 12.2В Заряд брал плохо, вторые сутки в добивке, посмотрим что будет дальше. Вчера замерил тот, который долитый 12Ач из ИБП - напряжение поднялось до 11,2, значит буду снова заряжать, доливать, отстаивать далее проведу КТЦ.

_________________
Golf II'90 1,6 PN АКПП Ecotronic(2EE) Г/у 3-дв - экспроприирован супругой
Golf II'85 1,6 EZ АКПП 2E2 3-дв - снова возит мою попу
Не думай о том, о чем я не думаю!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зарядка аккумулятора
СообщениеДобавлено: 14 фев 2018, 22:25 
Не в сети
Аватар пользователя

Зарегистрирован: 12 сен 2009, 15:10
Сообщений: 3754
Откуда: Кениг-Абад
Благодарил (а): 6 раз.
Поблагодарили: 53 раз.
Имя: Олег
Марка авто: -
Код двигателя: -
Год выпуска: 1900
№ тел.: 89212604616
Добавил в первый пост калибровку вольтметра, забыл сразу это сделать.
Снял медалиста с зарядки, отстоял полчаса. Пошел заводить холодный EZ (спасибо gesch подвез коммутатор). Медалист один раз медленно и печально провернул двигатель и потух. Без нагрузки кажет 13.1В . "Мнимый заряд". Надо делать КТЦ малым током с полной выкачкой, тогда будет ясно или пластинам хана или сульфаты. Надо заказать логгер и датчик тока, релюхи уже приехали, буду разряжать на лампу 21 Вт. И, наверное, прикуярю OLED монитор многострочный индикатор по шине I2C, надо тоже заказать.

_________________
Golf II'90 1,6 PN АКПП Ecotronic(2EE) Г/у 3-дв - экспроприирован супругой
Golf II'85 1,6 EZ АКПП 2E2 3-дв - снова возит мою попу
Не думай о том, о чем я не думаю!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зарядка аккумулятора
СообщениеДобавлено: 12 мар 2018, 20:05 
Не в сети
Аватар пользователя

Зарегистрирован: 12 сен 2009, 15:10
Сообщений: 3754
Откуда: Кениг-Абад
Благодарил (а): 6 раз.
Поблагодарили: 53 раз.
Имя: Олег
Марка авто: -
Код двигателя: -
Год выпуска: 1900
№ тел.: 89212604616
Выкладываю улучшенную прошивку
Добавлен контроль обратной полярности.
Теперь не только пауза адаптивная но и адаптивная скорость dU/dt, получился беспороговый алгоритм.

_________________
Golf II'90 1,6 PN АКПП Ecotronic(2EE) Г/у 3-дв - экспроприирован супругой
Golf II'85 1,6 EZ АКПП 2E2 3-дв - снова возит мою попу
Не думай о том, о чем я не думаю!


Последний раз редактировалось Necromant 03 июн 2018, 21:51, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Зарядка аккумулятора
СообщениеДобавлено: 03 июн 2018, 21:41 
Не в сети
Аватар пользователя

Зарегистрирован: 12 сен 2009, 15:10
Сообщений: 3754
Откуда: Кениг-Абад
Благодарил (а): 6 раз.
Поблагодарили: 53 раз.
Имя: Олег
Марка авто: -
Код двигателя: -
Год выпуска: 1900
№ тел.: 89212604616
#include <Wire.h>
#include <RTClib.h>
#include <stdint.h>
#include <SPI.h>
#include <SD.h>

#define maxV 18650 // R1=10.00 kOhm R2=1.52 kOhm
#define U0 1034
#define U50 12300.
#define UpLimit 14220 //отсечка сверху
#define LowLimit 12800 //нижний предел качелей
#define dU 1
#define minChargeTime 200 //условие перехода в качели
#define MeasureCount 4 //размер массива для измерения напряжения
#define VoltmeterPin A7
#define ChargeRelayPin 2 //SSR-10DA
#define InternalLedPin 13
#define chipSelect 10

RTC_DS1307 RTC;
// Переменные
uint16_t U1, RelaxPeriod = 1000;
uint8_t minChargeTimeCounter = 0;
String fileName = "";
//Функции
uint16_t ReadU (uint8_t Pin)
{
uint32_t S = 0,
SumU = 0;
uint8_t j = 0;
struct MeasuredValue
{
uint16_t Value;
int16_t Delta;
} U[MeasureCount];
for (uint8_t i = 0; (i + 1) <= MeasureCount; i++) // Считаем среднее арифметическое
{
U[i].Value = analogRead_16bits(Pin); // 8ms
SumU += U[i].Value;
}
SumU /= MeasureCount;
for (uint8_t i = 0; (i + 1) <= MeasureCount; i++) // Считаем среднеквадратическую погрешность
{
U[i].Delta = SumU - U[i].Value;
U[i].Delta = abs(U[i].Delta);
S += sq(long(U[i].Delta));
}
S /= (MeasureCount - 1);
S = sqrt( S );
// S *= 3;
SumU = 0;

for (uint8_t i = 0; (i + 1) <= MeasureCount; i++) // Отсеиваем промахи
{
//Serial.print (abs(U[i].Delta));

// Serial.print(" ");
// Serial.print ( S);
if (U[i].Delta <= S)
{
SumU += U[i].Value;
j++;
}
// Serial.print(" ");
// Serial.println(j);

}
/* if (j == 0)
{
for (uint8_t i = 0; (i +1)<= MeasureCount; i++)
{
Serial.print (i);
Serial.print(" ");
Serial.print (U[i].Delta);
Serial.print(" ");
Serial.println (U[i].Value);
}
Serial.println(S);

}
*/
SumU /= j;
SumU = map(SumU, U0, 65535, 0, maxV);
//Serial.println (U1);
// Serial.println (j);
return SumU;
}
//Процедуры
void relax(uint16_t dUPeriod)
{
uint16_t U2;
do
{
U1 = ReadU(VoltmeterPin);
delay (dUPeriod);
U2 = ReadU(VoltmeterPin);
}
while ((U1 - U2) >= dU);
//Serial.println (U1);Serial.println (U2);Serial.println (U1-U2);Serial.println ();
}
void relayON()
{
digitalWrite(ChargeRelayPin, HIGH);
digitalWrite(InternalLedPin, LOW);
}
void relayOFF()
{
digitalWrite(ChargeRelayPin, LOW);
digitalWrite(InternalLedPin, HIGH);
}
//Инициализация
void setup()
{
analogReference(INTERNAL2V56);
pinMode(ChargeRelayPin, OUTPUT); //SSR-10DA
pinMode(InternalLedPin, OUTPUT); //LED
pinMode(VoltmeterPin, INPUT); //Voltmeter
do //защита от обратной полярности
{
U1 = analogRead_16bits(VoltmeterPin);
digitalToggle(InternalLedPin);
delay(250);
}
while (U1 == 0);
if (!SD.begin(chipSelect))
{
digitalToggle(InternalLedPin);
delay(500);
while (1);
}
Wire.begin();

do //раскачка до 12В
{
delay(2000);
U1 = ReadU(VoltmeterPin);
relayON();
delay(1000);
relayOFF();
}
while (U1 <= 12000);
delay(500);
Serial.begin(9600);
RTC.begin();
if (! RTC.isrunning())
{
Serial.println("RTC is NOT running!");
}
DateTime now = RTC.now();
fileName = String(now.hour(), DEC) + String(now.minute(), DEC) + String(now.second(), DEC) + "." + String(now.day(), DEC);

}
//Цикл
void loop()
{
String dataString = "";

uint32_t Timer, ChargePeriod;

//uint32_t jj = 0;

dataString = String(millis(), DEC) + "," + String(U1, DEC);
File dataFile = SD.open(fileName, FILE_WRITE);
if (dataFile)
{
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
Timer = millis();
relax(RelaxPeriod);
Timer = millis() - Timer;
U1 = ReadU(VoltmeterPin);
RelaxPeriod = int(pow(2.72, ((U1 - U50) / 1000)) * 1000);
relayON();
//Timer = constrain(Timer, 500, 60000);
ChargePeriod = int(pow(2.72, ((U50 - U1) / 1000)) * Timer); //защита от вечного заряда
//Serial.println (U1); Serial.println (Timer); Serial.println (ChargePeriod); Serial.println (RelaxPeriod); Serial.println ();
Timer = millis();
while ((U1 <= UpLimit) && ((millis() - Timer) <= ChargePeriod))
{
U1 = ReadU(VoltmeterPin);
//jj++;
}
// Serial.println (U1);
relayOFF();
Timer = millis() - Timer;
Serial.println (Timer);// Serial.print (" ");Serial.print (Timer/jj);Serial.print (" "); Serial.println (jj);
if (Timer <= minChargeTime) //отсеиваем случайные значения из-за нестабильности питания
{
minChargeTimeCounter++;
}
else
{
minChargeTimeCounter = 0;
}
if (minChargeTimeCounter >= 5) //переход в качели
{
digitalWrite(InternalLedPin, LOW);
do
{
U1 = ReadU(VoltmeterPin);
delay(5000);
for (uint8_t i = 1; i <= 4; i++) //индикация качелей
{
digitalToggle(InternalLedPin);
delay(500);
}
}
while (U1 >= LowLimit);
minChargeTimeCounter = 0;
}
}

_________________
Golf II'90 1,6 PN АКПП Ecotronic(2EE) Г/у 3-дв - экспроприирован супругой
Golf II'85 1,6 EZ АКПП 2E2 3-дв - снова возит мою попу
Не думай о том, о чем я не думаю!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на форуме

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
© 2008 - 2019.Golf Konig Club.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB