avatar_UriBas

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

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

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

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

Dunkel

Цитата: AleksBelg от 25 Янв. 2018 в 23:12Вообще б конечно хотелось бы сравнить эфффективность вашего ЗУ. Алгоритм на мой взгляд толковый. Нарпимер, как алгоритм справляется с десульфатацией, как по сравнению с мигалкой того же Павла Валерьевича.

Не совсем корректное сравнение. Я пытаюсь сделать полноценное ЗУ с адаптивным алгоритмом. Все восстановительно-целительные свойства являются побочным эффектом работы ЗУ. Как они проявляются я точно не знаю, т.к. целенаправленно этим не занимался. Меня больше интересует сам процесс заряда, а не сопутствующая десульфатация. Да и как ее измерять я даже не представляю.
А моргалка П.В. представляет из себя только добавку к ЗУ для десульфатации. Сама по себе она ничего не заряжает.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Serg

Цитата: Dunkel от 25 Янв. 2018 в 21:12напряжение БП можно принять как константу

Нельзя -такой БП будет неожиданно дорог. КМК.

Dunkel

Цитата: Serg от 26 Янв. 2018 в 10:12
Нельзя -такой БП будет неожиданно дорог. КМК.

Если читать предложение целиком, а не выдергивать половину, вопросов будет гораздо меньше.

Цитата: Dunkel от 25 Янв. 2018 в 21:12т.к. измеряем в паузе - напряжение БП можно принять как константу

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

Кass

Цитата: Dunkel от 26 Янв. 2018 в 10:33В паузе БП не нагружен, и его действительно можно считать константой.

Ну не совсем. У вас сразу после заднего фронта идет заряд сглаживающей емкости по экспоненте и переходные процессы регулятора. Только через определенный промежуток можно говорить о константе в определенном приближении.
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

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

Dunkel

#760
Цитата: Кass от 26 Янв. 2018 в 11:07Ну не совсем. У вас сразу после заднего фронта идет заряд сглаживающей емкости по экспоненте и переходные процессы регулятора. Только через определенный промежуток можно говорить о константе в определенном приближении.

Совершенно справедливо, поэтому для этой схемы в скетче добавлена 1мс к паузе перед измерением.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_Soroka

Цитата: Кass от 26 Янв. 2018 в 11:07
Ну не совсем. У вас сразу после заднего фронта идет заряд сглаживающей емкости по экспоненте и переходные процессы регулятора.
совсем не так работают импульсные БП, как вам это кажется.
При сбросе нагрузки, микросхема управления пытается уменьшить свой ШИМ-заполнение, и если энергию некуда девать во вторичке, то будет полное отключение ШИМ, в литературе это "разрывные токи" называется.
А когда конденсаторы разряжаться ниже напряжения реагирования, то микросхемы перейдет в "бурст"режим, и если нагрузка вдуг появится а скорость реагирования не справится - вы получите "бабах" вашего китайского блока питания, и никакие предохранители вас не спасут, как не спасут и "встроенные защиты".

mr.Dream

Цитата: Alex_Soroka от 26 Янв. 2018 в 11:15При сбросе нагрузки, микросхема управления пытается уменьшить свой ШИМ-заполнение, и если энергию некуда девать во вторичке, то будет полное отключение ШИМ, в литературе это "разрывные токи" называется.
При сбросе нагрузки через очень короткое время модулятор еще об этом не знает, и продолжает работать с прежним заполнением, пока от цепи ОС через интегратор не изменится сигнал. А посколько цепь ОС делается заведомо медленной с "частотой среза" куда ниже несущей модулятора, то реагирует она з запозданием, и как пишет товарисч Кass, присутствуют переходные автоколебательные затухающие процессы. Без выбросов може отработать только линейный регулятор, и то присущие наносекундные всплески из за паразитной индуктивности выводов транзистора :) А в схеме, где есть реактивные элементы, не напрасно вводят понятие "постоянная времени", и от переходных процессов не избавиться никак. Разве что предугадывать: "за 50мкс произойдет уменьшение нагрузки на 90%" :)
Разрывные токи - это совсем другое. Это режим работы преобразователя, когда до следующего "такта" ток успевает упасть до нуля. Эту "фишку" используют квазирезонансные схемы для повышения КПД.  И к разрыву тока за пределами сглаживающего фильтра отношения не имеет.

Кass

Цитата: Alex_Soroka от 26 Янв. 2018 в 11:15совсем не так работают импульсные БП, как вам это кажется.
При сбросе нагрузки, микросхема управления пытается уменьшить свой ШИМ-заполнение, и если энергию некуда девать во вторичке, то будет полное отключение ШИМ

Александр, вы опять пишите про однотаткники, который запасает энергию в сердечнике трансформатора и при отключении нагрузки ее нужно куда то деть. Это проблемы сугубо вашего БП. У нормальных двухтактных такой проблемы нет. Там нет запасенной энергии в трансформаторе. Она там запасается в сглаживающем конденсаторе на выходе, который после импульса пустой. По азам электротехники вам должно быть известно, что напряжение на конденсаторе не может возрасти мгновенно, и потому после заднего фронта идет заряд и напряжение на кондере растет по экспоненте. Поэтому нет проблем ни куда деть энергию, ни в скорости реакции ООС.

Цитата: mr.Dream от 26 Янв. 2018 в 11:32А посколько цепь ОС делается заведомо медленной с "частотой среза" куда ниже несущей модулятора, то реагирует она з запозданием, и как пишет товарисч Кass, присутствуют переходные автоколебательные затухающие процессы. Без выбросов може отработать только линейный регулятор, и то присущие наносекундные всплески из за паразитной индуктивности выводов транзистора  А в схеме, где есть реактивные элементы, не напрасно вводят понятие "постоянная времени", и от переходных процессов не избавиться никак. Разве что предугадывать: "за 50мкс произойдет уменьшение нагрузки на 90%" 

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

Вот приятно когда люди пишут грамотные и без пафоса. :)
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

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

Dunkel

Цитата: UriBas от 25 Янв. 2018 в 06:41Это значит, что алгоритм чувствует по скорости изменения напряжения, когда нужно снижать средний ток..  и прощает" даже ошибки в измерении.. что в свою очередь означает, что можно применять для заряда в широком диапазоне напряжений (исключает влияние сопротивление проводов, контактов и т.д. на качество заряда!!) и не надо даже указывать  сколько там банок одна (2В) или шесть (12В).

Я тут подумал насчет эксперимента с 6В АКБ, и как-то засомневался - разве величина Дельты не зависит от количества банок?
Мне кажется для 6В она должна быть в два раза меньше.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Кass

Цитата: Dunkel от 26 Янв. 2018 в 11:14
Совершенно справедливо, поэтому для этой схемы в скетче добавлена 1мс к паузе перед измерением.

А тау просчитали для той емкости? Успевает кривая заряда выйти на горизонтальный участок? Иначе будет зависимость от амплитуды импульса тока.

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

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

UriBas

Цитата: Dunkel от 26 Янв. 2018 в 13:15Я тут подумал насчет эксперимента с 6В АКБ, и как-то засомневался - разве величина Дельты не зависит от количества банок?  Мне кажется для 6В она должна быть в два раза меньше.
Да, по идее, должна быть меньше.. Самое простое, привязать значение Дельты к порогам напряжений:
1) от 1В до 1,5В (для никелевых) Д= (надо вывести через эксперименты)
2) от 1,8 - 2,4В Д=0,6/6  (для титанатных акб тоже может пойдет, надо экспериментировать)
3) от 3,6 - 4,8В Д=0,6/5
-- - - --  -
7). 10,8 - 14,4В   Д=0,6
8_)  21,6 - 28,8В Д = 1,2
..  Список можно расширить на всю химию и можно было бы заряжать практически любые аккумуляторы без лазания по меню и разных настроек.   
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Dunkel

Цитата: Кass от 26 Янв. 2018 в 13:25А тау просчитали для той емкости? Успевает кривая заряда выйти на горизонтальный участок? Иначе будет зависимость от амплитуды импульса тока.
Просто подобрал задержку опытным путем.
Моргалка должна работать с любым БП, а не с конкретным экземпляром, поэтому считать тут не получиться.


Цитата: Кass от 26 Янв. 2018 в 13:25Кстати, вы не думали добавить датчик тока от того же Ардуино и просчитывать средний ток и емкость залитую и слитую?
Пока не вижу такой необходимости.
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Magic David

#768
Цитата: Кass от 25 Янв. 2018 в 16:26
Отнюдь. Тут люди так же распинались в других темах про чудодейственные свойства импульсного заряда, а когда проводились сравнительные тесты со множеством и на новых АКБ, все оказывалось в корне не так, а как у меня на аватаре. ;)

М моей практике по импульсным зарядам на протяжении примерно лет 15 тоже такие же результаты, что плюсы импульсов есть только в лечении сильно больных подопечных, и только на период лечения. Как бы не помогали вам антибиотики, жрать их постоянно нельзя. Слишком много побочных эффектов.
1. Импульсы ведь тоже разные бывают. Возможно, мощные импульсы, необходимые для десульфатизации в особо запущенных случаях, могут быть вредны для аккумуляторов в хорошем состоянии.  Например, никто вроде не критикует алгоритмы вроде "качелей" или "капельного заряда", а ведь это тоже импульсы...   
2. Кроме десульфатизации, импульсная зарядка должна решать задачу исключения интенсивного газообразования и перегрева в конце заряда, избегая заряда малыми токами, которые по некоторым утверждениям вредны (хотя и на этот счет тоже мнения расходятся).  А такие импульсы и не должны быть слишком мощными.

Собственно, мнения о "пользе" или "вреде", без непредвзятого подтверждения эксперементами переходят в разряд слухов. Особенно при наличии взаимоисключающих "неопровержимых" доказательств у обеих сторон.

Кass

Цитата: Magic David от 29 Янв. 2018 в 10:591. Импульсы ведь тоже разные бывают. Возможно, мощные импульсы, необходимые для десульфатизации в особо запущенных случаях, могут быть вредны для аккумуляторов в хорошем состоянии.  Например, никто вроде не критикует алгоритмы вроде "качелей" или "капельного заряда", а ведь это тоже импульсы... 

Мы говорим о зарядном устройстве или десульфататоре? О заряде, или лечении?

Цитата: Magic David от 29 Янв. 2018 в 10:592. Кроме десульфатизации, импульсная зарядка должна решать задачу исключения интенсивного газообразования и перегрева в конце заряда, избегая заряда малыми токами, которые по некоторым утверждениям вредны (хотя и на этот счет тоже мнения расходятся).  А такие импульсы и не должны быть слишком мощными.

По некоторым утверждениям - это по слухам и мифам. Так? Я вроде так и не увидел ни одного исследования.которые бы это хоть как то доказывали. Пока же наука и все результаты показывают абсолютно противоположное.
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

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

Dunkel

#770
Цитата: UriBas от 26 Янв. 2018 в 14:12
Да, по идее, должна быть меньше.. Самое простое, привязать значение Дельты к порогам напряжений:
1) от 1В до 1,5В (для никелевых) Д= (надо вывести через эксперименты)
2) от 1,8 - 2,4В Д=0,6/6  (для титанатных акб тоже может пойдет, надо экспериментировать)
3) от 3,6 - 4,8В Д=0,6/5
-- - - --  -
7). 10,8 - 14,4В   Д=0,6
8_)  21,6 - 28,8В Д = 1,2
..  Список можно расширить на всю химию и можно было бы заряжать практически любые аккумуляторы без лазания по меню и разных настроек.


Попробовал зарядить 6В АКБ.
Специально для опытов приобрел GS1,3-6  https://www.chipdip.ru/product/gs1.3-6
1,3 А/ч, Cycle use 7,2-7,5V,  0,39A MAX. Из магазина на клеммах 6,3В. 
Заряжал с помощью БП 12В 2А (это на нем написано, ток не проверял).

Схема:



Алгоритм тот же, ориентироваться по пороговым значениям не стал, ввел параметр "вольтаж", который пропорционально корректирует параметры, связанные с количеством банок.
Т.е. для 6В вдвое уменьшается Дельта, dU/dT и т.д.
Подробности в скетче:

Спойлер


// 27/01/2018 v6.6
// (c)dunkel
// PRO MINI, питание стаб. 5V на Vcc
// БП 12,45В 2А, АКБ 3 банки
// n-fet , драйвер TC4420
// Pin12 - заряд, на затвор мосфета
// PinА1 - напряжение с делителя АКБ 2k/510
// PinА2 - LM35

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


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

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

float voltaz = 6; // Вольтаж АКБ
boolean lm35 = 0; //Наличие градусника
int pachka = 10000; // Ограничитель пачки
long imp = 1 ; //Импульс в мкc
float imp_kor = 0.95; // Корректировка импульса
int dop_pause = 4000 ; //Добавка к паузе в мкc
int pause_kor = 20; // Корректировка паузы
float delta = 0.5 * voltaz / 12; // Дельта - увеличение напряжения в импульсе, В
float dop_delta = 1 * voltaz / 12; //Корректировка Дельты
float dUdT = 5 * voltaz / 12; // dU/dT, mV
float razryv = 0.1 * voltaz / 12; // Порог разрыва между MAX MAXP

void setup() {
  Serial.begin(115200);
  pinMode(pin, OUTPUT); // - на затвор мосфета
  digitalWrite(pin, LOW); //
  //pinMode(13, OUTPUT); // LED
  //digitalWrite(13, HIGH); // LED
  for (int j = 1; j <= 10; j++) {
    if (lm35 == 1) { //Измеряем температуру при наличии градусника
      temp = 0;
      for (int j = 1; j <= 10; j++) {
        temp += analogRead(A2);
      }
      temp = temp * 0.0488;
    }
    Serial.print(temp); Serial.println(", 0, 0, 0, 0, 0, 0, 0, 0");
    //digitalWrite(13, HIGH); // LED
    delay(500);
    //digitalWrite(13, LOW); // LED
    delay(500);
  }
  if (temp > 30) delta = 0.005 * (110 - temp); //Температурная компенсация

  Serial.print("voltaz  "); Serial.println(voltaz);
  Serial.print("lm35  "); Serial.println(lm35);
  Serial.print("pachka  "); Serial.println(pachka);
  Serial.print("imp  "); Serial.println(imp);
  Serial.print("imp_kor  "); Serial.println(imp_kor);
  Serial.print("dop_pause  "); Serial.println(dop_pause);
  Serial.print("pause_kor  "); Serial.println(pause_kor);
  Serial.print("delta  "); Serial.println(delta);
  Serial.print("dop_delta  "); Serial.println(dop_delta);
  Serial.print("dUdT  "); Serial.println(dUdT);
  Serial.print("razryv  "); Serial.println(razryv);
  Serial.println("6 , 6, 0, 0, 0, 2, 0, 0, 5"); //v6.5 2k/0,5
}
void loop() {

  if (lm35 == 1) { //Измеряем температуру при наличии градусника
    temp = 0;
    for (int j = 1; j <= 10; j++) {
      temp += analogRead(A2);
    }
    temp = temp * 0.0488;
  }
  if (temp > 30) delta = 0.005 * (110 - temp); //Температурная компенсация
  if ( kalibr == 1 ) { //Калибровка импульса
    Serial.println("0, 0, 0, 0, 0, 0, 0, 0, 0");

    do {
      imp = imp * 2;
      dop_pause = dop_pause / 2;
      kvasec = (float)imp * 1000 / ((float)imp + (float)pause + (float)dop_pause);
      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 (UAKM < UAK) UAKM = UAK; //Максимальное напряжение за секунду
        if ( (millis() - time) >= 1000 ) { // Выводим значение каждую сек.
          sec++;
          Serial.print(UAKM); //  график
          Serial.print(" , ");
          Serial.print(UK);
          Serial.print(" , ");
          Serial.print(UK + delta + dop_delta * raskach);
          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(kvasec);
          time = millis();
          UAKM = 0;
        }
      }
      while ( (UAK - UK) < (delta + dop_delta * raskach) && i < pachka ) ;
      for (float j = 1; j <= 5; j++) {
        Serial.println(j / 10);
        // digitalWrite(13, HIGH); // LED
        delay(500);
        //digitalWrite(13, LOW); // LED
        delay(500);
      }
    }
    while ( (UAK - UK) < (delta + dop_delta * raskach) ) ;
    kalibr = 0; //Конец калибровки
    Serial.println("1, 1, 1, 1, 1, 1, 1, 1, 1");
  }

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

  // digitalWrite(13, HIGH); // LED
  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 (UAKM < UAK) UAKM = UAK; //Максимальное напряжение за секунду
    if (UAK > MAX) MAX = UAK; //Фиксируем максимальное напряжение заряда
    if (UAK > MAXP) MAXP = UAK; //Фиксируем максимальное напряжение пачки
    if (UAK > U14) flag++; //Счетчик касаний 14,4В
    if ( (millis() - time) >= 1000 ) { // Выводим значение каждую сек.
      sec++;
      Serial.print(UAKM); //  график
      Serial.print(" , ");
      Serial.print(UK);
      Serial.print(" , ");
      Serial.print(UK + delta + dop_delta * raskach);
      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(kvasec);
      time = millis();
      UAKM = 0;
    }
    if ( i > 500000 ) { //Пора на повторную калибровку
      kalibr = 1;
      break;
    }
  }
  while ( (UAK - UK) < (delta + dop_delta * raskach) ) ; //Выходим из цикла при достижении Дельты
  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; //Ограничитель роста паузы
  kvasec = (float)imp * 1000 / ((float)imp + (float)pause + (float)dop_pause);
  raz = raz + 1; //Увеличиваем паузу между пачками импульсов
  //digitalWrite(13, LOW); // LED

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

  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 * raskach);
    Serial.print(" , ");
    Serial.print(temp);    //!!!
    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("0");
  }
  dU0 = 0;
  raskach = 0;

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

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

// Измерение UAK, длительность 2мс
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(1100);
  for (int j = 1; j <= 8; j++) {
    U1 += analogRead(A1);
  }
  V1 = U1 * K1;
  result = UBP - 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 = UBP - V1;
  return result;
}


График выглядит как-то странновато, но вероятно это особенности первого заряда.
Калибровку не делал, напряжение завышено примерно на 0,3В.



Квасеки тоже далеки от гиперболы, такое впечатление, что АКБ сопротивлялась заряду:



Тем не менее алгоритм отработал вполне успешно, НРЦ 6,71В через полтора часа после окончания заряда, через 12ч. 6,6В.

Лог:
https://drive.google.com/file/d/1fLAU-nUnxZ_p8iS1CrLyuPGU0TVWw_tk/view?usp=sharing
Многофункциональная облачная моргалка/логгер:
https://morgalka78.wordpress.com/

Alex_N

Если измерять подряд раз 500, а потом усреднять, то дребалыга уйдет и всё будет гораздо красивее. Но это кому как нравится.

Яков93

Цитата: Alex_N от 01 Фев. 2018 в 07:50
Если измерять подряд раз 500, а потом усреднять, то дребалыга уйдет и всё будет гораздо красивее. Но это кому как нравится.
Гораздо лучше искать среднюю из действительно средних, отбрасывая слишком низкие или слишком высокие значения и вообще не включая их в расчет. Вот таким скетчем мы сначала делаем массив из скажем 32 значений, потом этот массив сортируем по величине, а потом вычисляем среднюю арифметическую только из тех значений, что стоят в середине, крайние самые высокие и самые низкие значения отбрасываются.


Спойлер
#define I_RAW A0
   int nums[32];
   int a, c, t;
   int size_nums;
   size_nums = 32;
   long I=0;

void loop()
{
for(t=0; t<size_nums; t++) nums[t] = analogRead(I_RAW);

   for(a=1; a<size_nums; a++)
     for(c=size_nums-1; c>=a; c--)
       {
        if(nums[c-1] > nums[c])
         {
          t=nums[c-1];
          nums[c-1]=nums[c];
          nums[c]=t;
         }
       }

  for(t=7; t<23; t++)
     {
      I+=nums[t];
     }
     I=I>>4;
}

Не знаю насчет скорости, но по идее так гораздо точнее всякие левые случайные значения отбрасываются. Даже если в 500 значениях "3", "4" вдруг случайно ворвется помеха например в "100" то среднее уже не будет 3,5, а будет 3,69. В случае с нахождением медианы такие риски исключаются.

Кass

Цитата: Яков93 от 01 Фев. 2018 в 10:38Гораздо лучше искать среднюю из действительно средних, отбрасывая слишком низкие или слишком высокие значения и вообще не включая их в расчет.

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

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