avatar_UriBas

Моргалка на Arduino. Этюды для начинающих.

Автор UriBas, 08 Март 2017 в 16:08

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

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

toljan_010

добрый   всем  день.спасибо  за  ответы...заряжаю   обычным  для  кар   трансформатором.но  поскольку  сильная   сульфатация-виден  белый   налет--то   он  не  берет   положенные  ему   400ампер   а  начинает   кипеть...после     изучения   материалов   форума   немного   мозги   прояснились...кипятить  перестал...поскольку   на  каждой   банке   перемычки  то   стал   делить   на  группы...слабые   банки   гоняю  отдельно..но  поскольку   заряд  не   импульсный   не  порционный   то   и   сульфатация   не   уходит..вместо   8часов   кара  работает  2-3   потом   опять   заряд...согласен   что   на   каждую   банку   уже  на  заводе   надо   ставить   регулятор-балансир...но  производителю  естественно  это  не   надо...пока  выход  вижу    в  моргалке...тем  более  что   уже  есть  у  вас   видимые   результаты...

Серик

#1063
Цитата: toljan_010 от 22 Авг. 2018 в 08:12он  не  берет   положенные  ему   400ампер   а  начинает   кипеть..
Приветствую Всех Форумчан!
Здравствуйте, Уважаемый toljan_010!
Спойлер
Начинает кипеть- равномерное ли газовыделение по элементам?
Равномерно ли изменяется уровень электролита по элементам?
Прозрачный ли электролит во всех элементах при газовыделении в конце заряда?
В конце заряда/после завершения заряда какая плотность по элементам?
С 1-го по 24-ый?
А также, в конце заряда, перед отключением, какое напряжение заряда по элементам?
С 1-го по 24-ый?
Через некоторое время после выключения, как прекратилось газовыделение, какое напряжение нагрузки по элементам?
С 1-го по 24-ый?
Запишите эти показатели и сопоставьте пожалуйста.
На форуме уже писалось, газовыделение начинается при заряде 75% рабочей емкости ( не номинальной ).
То есть если аккумулятор с номиналом 400 А*ч превратился в, например, 100 А*ч, то закипание начнется уже после приема 75 А*ч.
А в какой теме это все возможно обсуждать?
Скопировал этот пост в тему: Эксплуатация ...
https://electrotransport.ru/index.php?msg=1431122

UriBas

[user]toljan_010 [/user][user]Серик[/user], Дальше обсуждать нюансы по аккумуляторам можно в теме https://electrotransport.ru/index.php?topic=48647.1098#topmsg - "Эксплуатация свинцовых аккумуляторов: вопросы и ответы 2"

Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

aniserg

два вопроса к уважаемому Necromant'у:
1. не нашел что такое - digitalToggle. при компиляции выскакивает такая ошибка - 'digitalToggle' was not declared in this scope.
2. можно ли вместо analogRead_16bits использовать просто analogRead

Necromant

#1066
Цитата: aniserg от 18 Сен. 2018 в 11:29
два вопроса к уважаемому Necromant'у:
1. не нашел что такое - digitalToggle. при компиляции выскакивает такая ошибка - 'digitalToggle' was not declared in this scope.
2. можно ли вместо analogRead_16bits использовать просто analogRead
1 Это участок кода отвечающий за индикацию (при подключении библиотеки Massduino должно работать), можете переписать по своему вкусу или вообще закомментировать этот участок
2 Используется именно Massduino из-за наличия встроенного оверсемплинга АЦП 16 бит,  просто analogRead не даст необходимой точности, алгоритм будет работать некорректно, необходимо будет или  переделать схему измерения напряжения (растянуть диапазон 10-15 Вольт при помощи стабилитрона, это приемлемый вариант) или отказаться от контроля ошибок и просто усреднять большое количество измерений (менее предпочтительно)

aniserg

Спасибо, понятно.
как, кстати, поживают трансформатор и реле в таком режиме?

Necromant

#1068
Цитата: aniserg от 24 Сен. 2018 в 09:56
Спасибо, понятно.
как, кстати, поживают трансформатор и реле в таком режиме?
Самому реле пофигу, фактически это симистор, запас по току огромный, радиатор не нужен
Транформаторы тоже с запасом по мощности, а что им будет, коммутационные выбросы и переходные процессы во вторичке съедает аккумулятор, выбросы в первичку гасятся снаббером в ТТ реле, так что они в тепличных ласковых условиях.
Само ТТ реле включает нагрузку при переходе напряжения через 0, а отключает при переходе тока через 0. Так что коммутационные выбросы ничтожны.
Там другая проблема существует: при сетевом напряжении ниже нормы ток также оказывается очень малым и не позволяет достичь отсечки, поэтому подачи ограничены не только верхним порогом, но и по времени.

aniserg


Necromant

Кусочек графика заряда (условно добивка)

стабильно 12,868В


скетч
Спойлер

мусор не удалял, если кому надо, подчищу

// Пауза по первой производной, качели, отсечка
#include <stdint.h>
#define maxV 18820 // R1=10.00 kOhm R2=1.52 kOhm
#define U0 780
#define U50 12300.
#define UpLimit 14220  //отсечка сверху
#define LowLimit 12800  //нижний предел качелей
//#define dU 1 // значение первой производной для паузы
#define minChargeTime 200 //условие перехода в качели
#define MeasureCount 4  //размер массива для измерения напряжения
#define VoltmeterPin A0
#define ChargeRelayPin 6 //SSR-10DA
#define InternalLedPin 13

// Переменные
uint16_t RelaxPeriod = 1000;
int16_t U1;
uint8_t minChargeTimeCounter = 0;// счетчик условий перехода в качели
//Функции
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 (SumU);
  return SumU;
}
//Процедуры
void relax(uint16_t Period)// Пауза по первой производной
{
  int16_t U2;
  do
  {
    U1 = ReadU(VoltmeterPin);
    delay (Period);
    U2 = ReadU(VoltmeterPin);
    // Serial.println (U1-U2);Serial.println ();
  }
  while ((U1 - U2) > 0);
  //Serial.println (U1);Serial.println (U2);

}
/*void relax(uint16_t Period)// Пауза по второй производной
  {
  uint16_t U2;
  int16_t dU1, dU2;
  U1 = ReadU(VoltmeterPin);
  do
  {
    delay (Period);
    U2 = ReadU(VoltmeterPin);
    dU1 = U1 - U2;
    delay (Period);
    U1 = ReadU(VoltmeterPin);
    dU2 = U2 - U1;
    Serial.println (dU1); Serial.println (dU2); Serial.println (dU1 - dU2); Serial.println ();
  }
  while ((dU1 - dU2) >= 0);

  }*/
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;
  //uint32_t jj = 0;
  Timer = millis();
  relax(RelaxPeriod);
  Timer = millis() - Timer;
  U1 = ReadU(VoltmeterPin);
  RelaxPeriod = int(pow(2.72, ((U1 - U50) / 1000)) * 3000);
  //Timer = constrain(Timer, 500, 60000);
  ChargePeriod = long(pow(2.72, ((U50 - U1) / 1000)) * Timer); //защита от вечного заряда
  //Serial.println (pow(2.72, ((U50 - U1) / 1000)) * Timer);
  Serial.println (U1);
  Serial.println (Timer); Serial.println (ChargePeriod); Serial.println (RelaxPeriod); Serial.println ();
  Timer = millis();
  relayON();

  while ((U1 <= UpLimit) && ((millis() - Timer) <= ChargePeriod))//отсечка
  {
    U1 = ReadU(VoltmeterPin);
  }
  //jj++;
  // Serial.println (U1);
  relayOFF();
  //качели
  Timer = millis() - Timer;
  Serial.println (Timer); Serial.println ();
  //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;
  }
}


Necromant

Забыл дописать: Это один из моих Бош S5 61 или 63 Ач

А сейчас у меня новый подопытный труп Centra 64Ач
3 года разряженный под капотом стоящего автомобиля, по моим подсчетам около 20 циклов заморозки/разморозки, уровень воды в норме
НРЦ было 1,64В, сунул на зарядку (раскачка 1 сек зарядка/ 2 сек пауза и так до 12В) Сначала напряжение было 2,5/15 вольт, через 6 часов 11,7/12,9. Расчухается, сниму лог ноутом, тоже выложу.  А пока допишу скетч разрядки  и гирлянду из лампочек соберу.

Necromant

Утром новый подопытный труп показал: напряжение в конце паузы 12,2 , в конце подачи 13,5 , подача примерно 16-17 сек, значит пока отсечка по времени (по Вудбриджу), Пауза 60-70 сек по первой производной. С логом печалька, ардуиновский терминал поймал глюк, ничего не вывелось. АКБ нагрелся, на ощупь примерно 40 градусов, слегка кипит, глаз черный, отключил до вечера. Вечером довпихну в скетч вывод на SD карту, сниму лог.

Necromant

Чуда не случилось, мертвый бобик совсем сдох  - НРЦ после нескольких часов отстоя 10,25,  КЗ одной банки, но зато в остальных хоть что-то зашевелилось. Хотел посмотреть динамику восстановления на тщательно засульфатированном почти новом (всего полгода в эксплуатации) АКБ но морозы сделали свое дело.

Паяка

[user]Necromant[/user], грустно. Плюс ставлю из не злорадства, а уважения к эксперименту.
GT TF1 60V 20Ah Chilwee DZF

Necromant

На самом деле хороший результат - зарядка заставляет принимать заряд даже совсем трупы. Сейчас сунул на заряд Медалиста, лог пишется в терминал, завтра выложу.

Паяка

[user]Necromant[/user], мёртвого бобика тоже советую не выкидывать. Всякое случается. ;-)
GT TF1 60V 20Ah Chilwee DZF

Necromant

бобик соседа, выгнал его на улицу под дождь  :-)
Медалист на зарядке показывает нечто интересное: переход первой производной через 0 в точке 12868 милливольт (ардуину калибровал по Mastech MAS830L). Прям как и у Боша в предыдущей зарядке, но с другими параметрами (другая постоянная времени дифференцирования, она у меня вычисляется для каждого цикла, зависит от одного адаптивного параметра и 2-х задаваемых констант)
Фонендоскопом пузырьки практически не слышны (на грани чувствительности слуха)

Alex_N

Цитата: Паяка от 24 Окт. 2018 в 21:40Necromant, мёртвого бобика тоже советую не выкидывать. Всякое случается.
Бесполезно. Я с таким месяца два провозился и всё равно в утиль сдал. КЗ не лечится ничем.

UriBas

Цитата: Alex_N от 25 Окт. 2018 в 18:09Бесполезно. Я с таким месяца два провозился и всё равно в утиль сдал. КЗ не лечится ничем. 
На форумах читал,  в каких случаях людям удавалось устранять КЗ, например:  Прожиганием мостика (КЗ) мощным импульсом тока; промывкой водой и последующим зарядом; переполюсовкой;  удалением шлама с поверхности пластин (пинцетом и чем-то подобным) еще когда с помощью тонкой полоски текстолита проводили между пластинами и удаляли мостик, используя тепловизор.. и т.д.  Иногда само по себе уходило. 
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651