avatar_UriBas

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

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

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

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

Dunkel

#720
Для желающих собрать моргалку еще пара проверенных вариантов схемы.
Только имейте в виду, в этих схемах сигнал с МК НЕ инвертируется.
Если скетч с инвертированным сигналом, нужно его немного поправить - поменять HIGH и LOW в команде digitalWrite.

Спойлер







Последняя схема взята отсюда:  http://radiohlam.ru/?p=1388
Рекомендую почитать.

Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

Ещё желательно, мне кажется, использовать БП с ограничением по току.
У меня сразу несколько. Один лабораторный Б5-47 на 3А - 30В. И самоделка из АТ - регулировка до 17 В,
а ампер - немеренно.
У кого какие возможности.

pridecom

Хочу сделать устройство для замера показателей АКБ на ардуино, но не очень силен в этой теме, подскажите как лучше реализовать.
==
Есть показатель на АКБ емкости, например 55Ah.
Замерить можно разрядом ламой на 2 ампера, но в какой момент нужно остановить замер времени? 10.8 вольта под нагрузкой или через какое-то время без нагрузки должно быть такое напряжение?
==
Есть еще какие-то EN1  и EN2 но тут я вообще не понял как его замерить...
==
В общем жду советов и алгоритмов  :ку: для сборки девайса по тестированию АКБ. Нагрузочную вилку не предлагать)

UriBas

[user]pridecom[/user],  Есть учебники по Ардуино http://alexgyver.ru/arduino_lessons/   и специализированные форумы, к примеру http://arduino.ru/ .. если хотите больше, вводите в гугле "Ардуино учебник" 
Ну и по АКБ тоже надо приобрести хотя бы начальные знания.. почитать темы,  а потом прочитать эту тему, найдете про алгоритмы, схемы и прочее.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

pridecom

Цитата: UriBas от 12 Янв. 2018 в 11:59
Ну и по АКБ тоже надо приобрести хотя бы начальные знания.. почитать темы,  а потом прочитать эту тему, найдете про алгоритмы, схемы и прочее.
Буду признателен за ссылку про правильный замер электрической емкости АКБ

Dunkel

Цитата: pridecom от 12 Янв. 2018 в 12:05Буду признателен за ссылку про правильный замер электрической емкости АКБ

Так и спросите в соответствующей теме. Здесь вообще-то про моргалку.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dunkel

#726
Еще одна модификация алгоритма. По моей нумерации это версия 6.
Переделал процедуру калибровки импульса (кванта). Теперь происходит не только постоянное уменьшение кванта, но и его увеличение (при необходимости) путем ухода на перекалибровку.
Критерием является превышение длительности пачки в 500 000 квантов.
Также добавлена начальная раскачка больных или сильно разряженных АКБ путем временного повышения Дельты на 1В. Для отлавливания "больных" введен параметр "Спад" - разница между максимальным напряжением при заряде и максимальным напряжением в текущей пачке. Если Спад увеличивается при малых значениях длительности пачки, значит АКБ не принимает заряд..
Экспериментальным путем в качестве лечения было выбрано временное увеличение Дельты на 1В, что позволяет АКБ восстановить хотя бы минимальную способность воспринимать заряд. После окончания восстановительной процедуры и последующей перекалибровки, заряд возвращается в штатный режим.

Дальнейшие эксперименты по восстановлению больных АКБ приостановлены в связи с отсутствием у меня пациентов. Ежели у кого в Питере валяются небольшие полудохлые АКБ 4-12Ач, могу принять в дар для опытов. "Погремушки" не предлагать, их только на помойку.

Еще переделал лог. Он теперь линейный по времени и пишется в 9 каналов, подробности в скетче:
Спойлер

Скетч работает на схемах, приведенных несколькими постами выше, сигнал не инвертирован.

// 10/01/2018
// (c)dunkel
// PRO MINI, питание стаб. 5V на Vcc
// БП 19В 3А, АКБ 7а/ч
// p-fet , драйвер pnp
// Pin12 - заряд, на затвор мосфета
// PinА1 - напряжение с делителя АКБ 3,3k/680

//Лог пишется в 9 каналов, через Serail Oscilloscope
//  http://x-io.co.uk/serial-oscilloscope/
//
//1 UAKB -Напряжение на АКБ
//2 UK   -НРЦ
//3 UK + delta  -НРЦ+Дельта
//4 i    -Количество импульсов в пачке (0 в паузе)
//5 imp  -Длительность импульса (кванта)
//6 dop_pause + pause  -Длительность паузы между импульсами
//7 MAX  -Максимум за время заряда
//8 MAXP -Максимум в пачке
//9 sec/dU0  -Время работы в сек. / dU/dT в паузе между пачками
//
//В начало лога пишутся значения изменяемых параметров


unsigned long time;
int pin = 12 ; // на затвор мосфета
int raz = 10 ; //Пауза между пачками в сек
int pause = 1000 ; //Пауза в мкc
float U14 = 14.4; // Напряжение отсечки 14.4В
float UK = 0; //Контрольное напряжение перед зарядом (НРЦ)
float UAK = 0; //Напряжение АКБ
float MAX = 0; // MAX Напряжение АКБ
float MAXP = 0; // MAX Напряжение АКБ в пачке
long flag = 0; //Счетчик превышений 14,4В
boolean kalibr = 1; //Необходимость калибровки
float dU0 = 0; // dU/dT
long sec = 0; // Время работы в сек.

// Изменяемые параметры:

int pachka = 10000; // Ограничитель пачки
int imp = 1 ; //Импульс в мкc
float imp_kor = 0.95; // Корректировка импульса
int dop_pause = 4000 ; //Добавка к паузе в мкc
int pause_kor = 50; // Корректировка паузы
float delta = 0.5; // Дельта - увеличение напряжения в импульсе, В
float dop_delta = 0; //Корректировка Дельты
float dUdT = 5; // dU/dT, mV

void setup() {
  Serial.begin(115200);
  pinMode(pin, OUTPUT); // - на затвор мосфета
  digitalWrite(pin, LOW); //
  for (int j = 1; j <= 5; j++) {
    Serial.println("0, 0, 0, 0, 0, 0, 0, 0, 0");
    delay(1000);
  }
  Serial.println(pachka);
  Serial.println(imp);
  Serial.println(imp_kor);
  Serial.println(dop_pause);
  Serial.println(pause_kor);
  Serial.println(delta);
  Serial.println(dop_delta);
  Serial.println(dUdT);
}
void loop() {

  if ( kalibr == 1 ) { //Калибровка импульса
    Serial.println("0, 0, 0, 0, 0, 0, 0, 0, 0");

    do {
      imp = imp * 2;
      dop_pause = dop_pause / 2;
      UK = readU016();
      time = millis();
      long i = 0;
      do {
        i++;
        digitalWrite(pin, HIGH); //
        delayMicroseconds(imp); //Импульс длительностью imp
        digitalWrite(pin, LOW); //
        UAK = readU0(); //Пауза длительностью 1ms
        delayMicroseconds(dop_pause); //Добавка к паузе в мкc
        if ( (millis() - time) >= 1000 ) { // Выводим значение каждую сек.
          sec++;
          Serial.print(UAK); //  график
          Serial.print(" , ");
          Serial.print(UK);
          Serial.print(" , ");
          Serial.print(UK + delta + dop_delta);
          Serial.print(" , ");
          Serial.print(i);
          Serial.print(" , ");
          Serial.print(imp);
          Serial.print(" , ");
          Serial.print(dop_pause + pause);
          Serial.print(" , ");
          Serial.print(MAX);
          Serial.print(" , ");
          Serial.print(MAXP);
          Serial.print(" , ");
          Serial.println(sec);
          time = millis();
        }
      }
      while ( (UAK - UK) < (delta + dop_delta) && i < pachka ) ;
      for (int j = 1; j <= 5; j++) {
        Serial.println("0, 0, 0, 0, 0, 0, 0, 0, 0");
        delay(1000);
      }
    }
    while ( (UAK - UK) < (delta + dop_delta) ) ;
    kalibr = 0; //Конец калибровки
  }

  //Начало пачки импульсов

  UK = readU016(); // Напряжение НРЦ
  time = millis();
  long i = 0;
  MAXP = 0;
  do {   //Пачка i импульсов
    i++;
    digitalWrite(pin, HIGH); //
    delayMicroseconds(imp); //Импульс длительностью imp
    digitalWrite(pin, LOW); //
    UAK = readU0(); //Пауза длительностью 1ms
    delayMicroseconds(dop_pause); //Добавка к паузе в мкc
    if (UAK > MAX) MAX = UAK; //Фиксируем максимальное напряжение заряда
    if (UAK > MAXP) MAXP = UAK; //Фиксируем максимальное напряжение пачки
    if (UAK > U14) flag++; //Счетчик касаний 14,4В
    if ( (millis() - time) >= 1000 ) { // Выводим значение каждую сек.
      sec++;
      Serial.print(UAK); //  график
      Serial.print(" , ");
      Serial.print(UK);
      Serial.print(" , ");
      Serial.print(UK + delta + dop_delta);
      Serial.print(" , ");
      Serial.print(i);
      Serial.print(" , ");
      Serial.print(imp);
      Serial.print(" , ");
      Serial.print(dop_pause + pause);
      Serial.print(" , ");
      Serial.print(MAX);
      Serial.print(" , ");
      Serial.print(MAXP);
      Serial.print(" , ");
      Serial.println(sec);
      time = millis();
    }
    if ( i > 500000 ) { //Пора на повторную калибровку
      kalibr = 1;
      break;
    }
  }
  while ( (UAK - UK) < (delta + dop_delta) ) ; //Выходим из цикла при достижении Дельты
  if ( i < pachka ) {  // Если пачка короче XXX имп
    imp = imp * imp_kor ; // Уменьшаем длительность импульса
    dop_pause = dop_pause + pause_kor ; //Увеличиваеи добавку к паузе
  }
  if (imp < 1) imp = 1; // Импульс не укорачивается менее 1мкс
  if (dop_pause > 3000) dop_pause = 3000; //Ограничитель роста паузы
  raz = raz + 1; //Увеличиваем паузу между пачками импульсов

  //Конец пачки импульсов, Начало паузы между пачками

  float dU0K = readU016();
  for (int h = 1; h <= raz; h++) { //Пачка импульсов - пауза длительностью raz
    delay(900);
    UAK =  readU016();  //1c
    float dU0 = (dU0K - UAK) * 1000; //mV
    dU0K = UAK;
    if (dU0 <= dUdT) raz = raz - 1 ;// Если скорость падения напряжения ниже XXмВ - уменьшаем паузу
    Serial.print(UAK); //  график
    Serial.print(" , ");
    Serial.print(UK);
    Serial.print(" , ");
    Serial.print(UK + delta + dop_delta);
    Serial.print(" , ");
    Serial.print("0");    //!!!
    Serial.print(" , ");
    Serial.print(imp);
    Serial.print(" , ");
    Serial.print(dop_pause + pause);
    Serial.print(" , ");
    Serial.print(MAX);
    Serial.print(" , ");
    Serial.print(MAXP);
    Serial.print(" , ");
    Serial.println(dU0);
  }
  dU0 = 0;
  dop_delta = 0;

  if (i < 500 && (MAX - MAXP) > 0.1) { //Раскачка больных АКБ
    dop_pause = dop_pause / 2 ;
    dop_delta = 1.0;
  }

  //Конец паузы между пачками
}

// Измерение UAK, длительность 1мс
float readU0() {
  long U1 = 0; //Напряжение на АКБ
  float result = 0.0;
  float V1 = 0.0;
  float K1 = 0.003622; // 8 1ms   3,3k/680
  //  float K1 = 0.003003; // 8 1ms  2k/510
  delayMicroseconds(100);
  for (int j = 1; j <= 8; j++) {
    U1 += analogRead(A1);
  }
  V1 = U1 * K1;
  result = V1;
  return result;
}

// Измерение UAK 128, длительность 100мс
float readU016() {
  long U1 = 0; //Напряжение на АКБ
  float result = 0.0;
  float V1 = 0.0;
  float K1 = 0.0002259; // 128 14ms  3,3k/680
  //  float K1 = 0.0001876; // 128 14ms 2k/510
  delay(86);
  for (int j = 1; j <= 128; j++) {
    U1 += analogRead(A1);
  }
  V1 = U1 * K1;
  result = V1;
  return result;
}


И красивые картинки:

Спойлер
АКБ 7Ач была разряжена до 9,7В (пришлось пожертвовать здоровой АКБ).
Заряд длился долго, это график за 24 ч., (1 канал лога):



Спуском на нулевую отметку обозначены перекалибровки.

Вот укрупненно начальная раскачка:




И при наложении значений НРЦ и НРЦ+Дельта (2 и 3 канал) будет видно, что в промежутке 1500-2800 Дельта была увеличена:



А при наложении длительности импульса (5 канал), можно увидеть, что в этом промежутке величина кванта опускалась до минимума 1мкс, а потом подскочила до 18мкс, после перекалибровки:



Лог:

https://yadi.sk/d/_vljQ-lr3RQ5Ys
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dunkel

Цитата: UriBas от 12 Янв. 2018 в 17:30
[user]Dunkel[/user],  Что-то у меня с этого яндекса не загружается..  (Еще пока не закончил разбираться с предыдущим скетчем..   некоторые моменты интересны)

У меня нормально грузится.
Давайте почту, отправлю.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

А я хочу в моргалку табло прицепить, датчик тока, датчик темп-ры, БП от ноута.
Ну и связь с ноутбуком разумеется. Короче до лета будет чем заняться.

AleksBelg

Уважаемый Dunkel, позвольте пару вопросов по предлагаемой вами схеме зарядки. Вы ее рекомендуете только для зарядки UPS -вых АКБ? Автомбильные можно заряжать? нужно что то менять в алгоритме заряд/пауза?
У меня есть полевик IRL3103, возможно ли его использовать в место предлагаемого вами?,т.е с выхода ардуины подавать сразу на затвор полевика?

Dunkel

[user]AleksBelg[/user], для моргалки не важно какой тип аккумулятора, все они свинцово-кислотные, различие только в величине зарядного тока. Вот по этой величине и подбирайте мосфет.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

AleksBelg

[user]Dunkel[/user], спасибо. С ардуиной только разбираюсь. скетч с поста 726 актуален для первой схемы из поста 720?
в скетче,как я понял, надо точнее подобрать коэффициент делителя на R2/R3, что бы напряжение на выводе А1   соотвтествовало напряжению на аккумуляторе ? В скетче в описании указаны номиналы сопротивлений как во второй схеме поста 720. Вы наверняка имеете некую статистику по работе вашего ЗУ, удается ли убрать сульфатацию? на счет правильности алгоритма заряда не возникает,но вот интересно насколько эфффективно восстанавливает эта зарядка подубитые аккумуляторы. за ранее спасибо!

Dunkel

Цитата: AleksBelg от 23 Янв. 2018 в 22:25скетч с поста 726 актуален для первой схемы из поста 720?
И для первой, и для второй. Только там мосфет p-канальный, не перепутайте.

Цитата: AleksBelg от 23 Янв. 2018 в 22:25в скетче,как я понял, надо точнее подобрать коэффициент делителя на R2/R3
Не надо, этот алгоритм не использует пороговые значения. Просто ставьте резисторы, как указано в скетче.

Цитата: AleksBelg от 23 Янв. 2018 в 22:25но вот интересно насколько эфффективно восстанавливает эта зарядка подубитые аккумуляторы
Нету у меня сейчас больных АКБ, проверить не на чем.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Dunkel

Небольшая иллюстрация возможностей адаптивного алгоритма без контроля пороговых значений.
Коэффициент делителя задан с ошибкой процентов на 20. Несмотря на это, заряд прошел абсолютно нормально, только график получился неправильный:



Ввел еще одну величину - "квасек" (квант в секунду). Физически это суммарное время открытого состояния мосфета в мс за секунду.
Можно использовать, например, для фиксации окончания заряда. На графике это выглядит так:


Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

UriBas

Цитата: Dunkel от 24 Янв. 2018 в 21:41Небольшая иллюстрация возможностей адаптивного алгоритма без контроля пороговых значений.  Коэффициент делителя задан с ошибкой процентов на 20. Несмотря на это, заряд прошел абсолютно нормально, только график получился неправильный.. 
Ввел еще одну величину - "квасек" (квант в секунду). Физически это суммарное время открытого состояния мосфета в мс за секунду.
Можно использовать, например, для фиксации окончания заряда.
Вроде неплохо все идет, теперь надо сделать разряд и посмотреть емкость, интересно растет или нет? Потом сравнить с классикой..  еще подумать, как подсчитывать залитую емкость, может квасеки" как-то использовать.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Alex_N

А почему заряд остановился на 13.7В ? Надо бы указать напряжение с БП.

UriBas

#736
[user]Alex_N[/user], Там же написано, что коэф. делителя с ошибкой примерно в 20%..  поэтому напряжение с отставанием, но заряд прошел нормально.  Это значит, что алгоритм чувствует по скорости изменения напряжения, когда нужно снижать средний ток..  и прощает" даже ошибки в измерении.. что в свою очередь означает, что можно применять для заряда в широком диапазоне напряжений (исключает влияние сопротивление проводов, контактов и т.д. на качество заряда!!) и не надо даже указывать  сколько там банок одна (2В) или шесть (12В).. круто!  (Возможно и на акк разной химии будет работать без настроек..)
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Кass

Цитата: UriBas от 25 Янв. 2018 в 06:41Alex_N, Там же написано, что коэф. делителя с ошибкой примерно в 20%..  поэтому напряжение с отставанием, но заряд прошел нормально. 

Что бы говорить о том, нормально прошел заряд или нет, нужно провести несколько десятков КТЦ и посмотреть динамику. Потом желательно смотреть еще плотность, что там с ней.
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)