Тест группы батарей - Нужна помощь в реализации

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Доброго времени суток!!!

Нужна помощь в реализации одной моей задумки:

- имеется группа аккумуляторных батарей на 48В (4 шт по 12)

- группа разряжается устройством которое контролирует общее напряжение, но каждая батарея не должна просаживаться ниже 10.8В

- весли лог разряда по времени.

В общем схема выглядит вот так:

Данные с Arduino №1-4 должны поступать на Arduino UNO и затем выводится на ноутбук (в будущем хочу LCD поставить).

 

Для Arduino №1-4 прога есть. Вроде ном работает... А вот с дальнейшей реализацией возникли проблемы. 

 

Подскажите кто-что сможет.

 

Заранее спасибо!!!

 

 

/*
 * Copyright 2015 Yuriy Tim http://tim4dev.com
 * На основе оригинального кода (c) Scott Daniels http://provideyourown.com
 *
 * В ATmega есть внутренний источник опорного напряжения 1.1В (другое название internal bandgap reference voltage), которое не зависит от Vcc.
 *
 * Даташит на ATMEGA 328
 * http://www.atmel.com/devices/atmega328p.aspx?tab=documents
 *   "bandgap reference voltage" :
 *   min = 1.0
 *   typical = 1.1
 *   max = 1.2
 */



// резисторы делителя напряжения
const float r1 = 98810;  // 100K
const float r2 = 9932;  // 10K

// эту константу (typVbg) необходимо откалибровать индивидуально
const float typVbg = 1.138; // 1.0 -- 1.2

float Vcc = 0.0;
float MaxVoltage = 0.0;
float bat1,bat2,bat3,bat4, batN = 0;




#define A_PIN 1
#define COUNT 5

int i;
float curVoltage;
char *stime;


/****************************************************************************
 * Главная программа
 ****************************************************************************/

void setup() {  
    Serial.begin(9600);
    Serial.println("---");
    delay(1000); 
  // определение опорного напряжения
  analogReference(DEFAULT);  // DEFAULT INTERNAL использовать Vcc как AREF
  delay(100);
  Vcc = readVcc();
  MaxVoltage = Vcc / (r2 / (r1 + r2));
  analogWrite(A_PIN, 0); 
    Serial.print("Vcc = ");
    Serial.println(Vcc);
    Serial.print("Max V. = ");
    Serial.println( MaxVoltage );
    Serial.println("---");
  delay(2000);
}



void loop() {
  bat1=0;
  bat2=0;
  bat3=0;
  bat4=0;
  batN=0;
  
  stime = TimeToString(millis()/1000);
  Serial.print("Time ");
  Serial.print(stime);  
  Serial.print(" ");

 
  bat1=calc(1); 
  bat2=calc(2);
  bat3=calc(3);
  bat4=calc(4);
     Serial.print("V1=");
    Serial.print(bat1); 
   
    bat2=bat2-bat1;
    Serial.print(" V2=");
    Serial.print(bat2); 
     
    bat3=bat3-bat2-bat1;
    Serial.print(" V3=");
    Serial.print(bat3); 

    bat4=bat4-bat3-bat2-bat1;
    Serial.print(" V4=");
    Serial.print(bat4); 

    batN=bat4+bat3+bat2+bat1;
    Serial.print(" V_O=");
    Serial.print(batN); 




  
 /*   Serial.print("V1=");
    Serial.print(bat1); 
   
    bat2=bat2-bat1;
    Serial.print(" V2=");
    Serial.print(bat2); 
     
    bat3=bat3-bat2-bat1;
    Serial.print(" V3=");
    Serial.print(bat3); 

    bat4=bat4-bat3-bat2-bat1;
    Serial.print(" V4=");
    Serial.print(bat4); 

    batN=bat4+bat3+bat2+bat1;
    Serial.print(" V_O=");
    Serial.print(batN); 
*/
    
/* bat1=calc(1); 
  bat2=calc(2);
  bat3=calc(3);
  bat4=calc(4);
 Serial.print("V1=");
    Serial.print(bat1); 
   
   
    Serial.print(" V2=");
    Serial.print(bat2); 
     
  
    Serial.print(" V3=");
    Serial.print(bat3); 

   
    Serial.print(" V4=");
    Serial.print(bat4); 

  
    Serial.print(" V_O=");
    Serial.print(batN); 
    
    Serial.print(" ");
    delay(1000);
*/
  delay(5000);
 Serial.println();
 
  
}
float calc(int a) {
 float result;
  Vcc = readVcc();
  // считываем точное напряжение с A0, где будет находиться наш вольтметр с делителем напряжения
  curVoltage = 0.0;
  for (i = 0; i < COUNT; i++) {
      curVoltage = curVoltage + analogRead(a);
      delay(10);
  }
  curVoltage = curVoltage / COUNT;
  float v  = (curVoltage * Vcc) / 1024.0;
  float v2 = v / (r2 / (r1 + r2)); 
/*    Serial.print("V");
    Serial.print(a); 
    Serial.print(" = ");    
    Serial.print(v2); 
    Serial.print(" ");
    delay(1000);
*/
  result = v2; 
  analogWrite(a, 0);
  return result;
}



/****************************************************************************
 * Функции
 ****************************************************************************/

float readVcc() {
  byte i;
  float result = 0.0;
  float tmp = 0.0;

  for (i = 0; i < COUNT; i++) {
    // Read 1.1V reference against AVcc
    // set the reference to Vcc and the measurement to the internal 1.1V reference
    #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
        ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
        ADMUX = _BV(MUX5) | _BV(MUX0);
    #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
        ADMUX = _BV(MUX3) | _BV(MUX2);
    #else
        // works on an Arduino 168 or 328
        ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    #endif

    delay(3); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Start conversion
    while (bit_is_set(ADCSRA,ADSC)); // measuring

    uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
    uint8_t high = ADCH; // unlocks both

    tmp = (high<<8) | low;
    tmp = (typVbg * 1023.0) / tmp;
    result = result + tmp;
    delay(5);
  }

  result = result / 5;
  return result;
}

char * TimeToString(unsigned long t)
{
  static char str[12];
  long h = t / 3600;
  t = t % 3600;
  int m = t / 60;
  int s = t % 60;
  sprintf(str, "%02ld:%02d:%02d", h, m, s);
  return str;
}

 

Green
Онлайн
Зарегистрирован: 01.10.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Мне другое интересно, под линиями с вопросительными знаками что подразумевается, опторазвязка? ;)

rkit
Онлайн
Зарегистрирован: 23.11.2016

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

Делал модуль для точно такой же задачи на один аккумулятор, вам нужно 4 таких, и все подключить прямо к уно.

Напряжение считать, исходя из того, что v_sens / R2 = acc+ / R9.

 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

да

Monarch1986
Offline
Зарегистрирован: 18.12.2018

это схема готового модуля? или сами собирали?

Monarch1986
Offline
Зарегистрирован: 18.12.2018

rkit пишет:

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

Делал модуль для точно такой же задачи на один аккумулятор, вам нужно 4 таких, и все подключить прямо к уно.

Напряжение считать, исходя из того, что v_sens / R2 = acc+ / R9.

 

это схема готового модуля? или сами собирали?

Green
Онлайн
Зарегистрирован: 01.10.2015

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

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Green пишет:

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

все верно ардуина будет питаться от самой батарею. а емкость больше 100А/ч

rkit
Онлайн
Зарегистрирован: 23.11.2016

Сам

Green
Онлайн
Зарегистрирован: 01.10.2015

Ну и передавайте данные по последовательному интерфейсу. На приёмной стороне организуйте 4 программных uart-а и принимайте по очереди. 

Green
Онлайн
Зарегистрирован: 01.10.2015

Тут даже 5-я Ардуино лишняя. Только 3 оптрона и резисторы.)

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Green пишет:

Тут даже 5-я Ардуино лишняя. Только 3 оптрона и резисторы.)

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

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Green пишет:

Ну и передавайте данные по последовательному интерфейсу. На приёмной стороне организуйте 4 программных uart-а и принимайте по очереди. 

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

Green
Онлайн
Зарегистрирован: 01.10.2015

htpicc@gmail.com. Или платный раздел.

rkit
Онлайн
Зарегистрирован: 23.11.2016

Гонять UART по дешевым оптронам я бы не рекомендовал, у них очень низкая пропусканая способность и несимметрично заваленные фронты. Бывают быстрые оптроны, но гораздо дешевле цифровые изоляторы на трансформаторах, по типу adum1201

Green
Онлайн
Зарегистрирован: 01.10.2015

Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Green пишет:

Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)

я изначально пробовал на 1 ардуино делать... идея у меня не вышла

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)

+ 4 реле.

svm
Offline
Зарегистрирован: 06.11.2016

SLKH пишет:

Green пишет:

Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)

+ 4 реле.

А почему не 4 делителя? Что нужно милливольты ловить?

nik182
Offline
Зарегистрирован: 04.05.2015

А просто делителями с каждой банки не обойтись?  На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. Для батареи вполне достаточно. 

SLKH
Offline
Зарегистрирован: 17.08.2015

svm пишет:

SLKH пишет:

Green пишет:

Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)

+ 4 реле.

А почему не 4 делителя? Что нужно милливольты ловить?

да, скорее всего, можно и 4 делителя. Не думаю, что при разрядке 100А аккумулятора лабораторная точность нужна.

Впрочем, это вопрос к ТС: "а чё надо-то"? 

rkit
Онлайн
Зарегистрирован: 23.11.2016

nik182 пишет:

А просто делителями с каждой банки не обойтись?  На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. Для батареи вполне достаточно. 

Осталось только продать почку за резисторы с точностью 0.005% и потратить пару месяцев работы на механизм температурной компенсации.

SLKH
Offline
Зарегистрирован: 17.08.2015

Ещё вариант:

Если нам нужно только "каждая батарея не должна просаживаться ниже 10.8В", то цепляем на эти батареи tl431 + оптрон. Дешево и развязано.

SLKH
Offline
Зарегистрирован: 17.08.2015

nik182 пишет:

А просто делителями с каждой банки не обойтись?  На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. 

В протеусе или в гараже?

nik182
Offline
Зарегистрирован: 04.05.2015

rkit пишет:

nik182 пишет:

А просто делителями с каждой банки не обойтись?  На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. Для батареи вполне достаточно. 

Осталось только продать почку за резисторы с точностью 0.005% и потратить пару месяцев работы на механизм температурной компенсации.

Зачем все эти тонкости и месяцы? Изделие единичное. На любых резисторах можно  каждый делитель  прокалибровать и в процессор ввести поправочные коэффициенты.  Температурная компенсация тоже может быть общитана, но сердце вещует что точность измерения нужна меньше чем изменение температуры может внести в измерительную цепь. Ваш комментарий говорит о том что Вы далеки от инженерных решений. Цифра 0.005 % очень убедительно об этом говорит.  Лучше молчать, чем выставлять себя википедиком.        

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)

тоже об этом подумал, единственное не знаю из INA есть что с напряжением в 60 вольт

rkit
Онлайн
Зарегистрирован: 23.11.2016

Для даже-не-википедиков расскажу секрет: резисторы малой точности шумят. Не по гауссу. Калибровать бессмысленно. Если бы всё было так просто, никто бы 0.005% резисторов не производил, и не покупал по 50 долларов за штуку.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit пишет:

Для даже-не-википедиков расскажу секрет: резисторы малой точности шумят. Не по гауссу. Калибровать бессмысленно. Если бы всё было так просто, никто бы 0.005% резисторов не производил, и не покупал по 50 долларов за штуку.

ищем константан и мотаем?

nik182
Offline
Зарегистрирован: 04.05.2015

Даже в гараже шум резисторов из стандартного ряда при измерении напряжения аккумуляторной батареи поддаётся фильтрованию. Задача чисто инженерная. Высокие материи привлекать не требуется. 1% абсолютная погрешность измерения напряжения при слежении за состоянием свинцового аккумулятора вполне достаточна. Все температурные, шумовые и прочие наводочные погрешности цепей измерения укладываются в эту погрешность. Все разговоры про 0.005% точность в рамках данной темы вызывают улыбку. Если это необходимо - докажите на конкретных расчётах. Иначе это выглядит как слышал звон, да не знаю где он.  Для 0.005% резисторов есть свои области применения и к измерению напряжения свинцовых аккумуляторов не имеющие ни какого отношения. Надеюсь читающие топик примут к сведению, что здесь задача не  научных исследований. Личные желания иметь большую точность измерений говорит только о низком уровне образования по данной теме.        

rkit
Онлайн
Зарегистрирован: 23.11.2016

nik182 пишет:

Даже в гараже шум резисторов из стандартного ряда при измерении напряжения аккумуляторной батареи поддаётся фильтрованию.

Для особо доходчивых повторю еще раз: Не по гауссу. ФНЧ подавляет только гауссов шум. Фликкер шум подавляют непростыми схемами с чоппингом. Не понял, что написали - молчи, иначе еще сильнее опозоришься.

Не спорю с тем, что померить напряжение можно дешево и легко, и даже привел пример чуть выше. Но 0.1 от 58 вольт на копеечной китайской платке -- нет. И чтобы опять не начинал, у свинцовых аккумуляторов максимальное напряжение не 12, а 14.4.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

rkit, мне кажется никто не спорит, что все детали шумят, у всего свой ткс и.т.п и.т.д. Но всё познаётся в сравнении . Какой уровень шума будет у резисторного делителя, сможете озвучить конкретные цифры? Учитывая, что  на опорном того же блюпилла(stm32f103) собственный шум в пике до  100мВ (!),  будет ли шум резисторов как то выделяться из общего фона?  Может ли вообще АЦП зафиксировать это шум?

nik182
Offline
Зарегистрирован: 04.05.2015

rkit пишет:

Для особо доходчивых повторю еще раз: Не по гауссу. ФНЧ подавляет только гауссов шум. Фликкер шум подавляют непростыми схемами с чоппингом.... 

А интернет говорит что по гауссу https://www.compel.ru/lib/97388

И хочу заметить, что плотность шума для резисторов используемых в делителях - сотни кОм - из той же статьи доли микровольт. При ступени АЦП 5 мВ как шум резистора без усилителя может повлиять на результат оцифровки? Ответ с цифрами, пожалуйста. Ваши не подкреплённые расчётами заявления показывают отсутствие понимания проблемы. Вы своими безответственными заявлениями вводите заблуждениями участников дискуссии.     

bwn
Offline
Зарегистрирован: 25.08.2014

Может и глупость скажу, но на атмеге328, в электронной нагрузке, никаких шумов не наблюдаю, вяло шевелится младший разряд (0,059В для 60В). В лупе 500 измерений и среднее. Референс от TL431. Свинец, он тяжелый и крепкий, зачем плодить сущности?

rkit
Онлайн
Зарегистрирован: 23.11.2016

dimax пишет:

rkit, мне кажется никто не спорит, что все детали шумят, у всего свой ткс и.т.п и.т.д. Но всё познаётся в сравнении . Какой уровень шума будет у резисторного делителя, сможете озвучить конкретные цифры? Учитывая, что  на опорном того же блюпилла(stm32f103) собственный шум в пике до  100мВ (!),  будет ли шум резисторов как то выделяться из общего фона?  Может ли вообще АЦП зафиксировать это шум?

Может. И речь тут уже не столько об этой задаче, сколько о заявлении "инженера" о том, что резисторы можно просто откалибровать, и это волшебно из подобранной в лесу палки сделает точный измерительный прибор.

 

nik182 пишет:

А интернет говорит что по гауссу https://www.compel.ru/lib/97388

А если прочитать что написано в интернете, а не просто не думая что-то нагуглить, то можно понять, что речь не идет о фликкер-шуме и постоянном токе.

"Среднеквадратичное (RMS) напряжение переменного шума (AC)"

"без DC-составляющих"

 

bwn пишет:

Может и глупость скажу, но на атмеге328, в электронной нагрузке, никаких шумов не наблюдаю, вяло шевелится младший разряд (0,059В для 60В). В лупе 500 измерений и среднее. Референс от TL431. Свинец, он тяжелый и крепкий, зачем плодить сущности?

А тут перепутано разрешение и точность. Прибор может показывать хоть 50 знаков после запятой без колебаний, но это еще не значит, что это значение соответствует реальности.

nik182
Offline
Зарегистрирован: 04.05.2015

rkit пишет:

Может. И речь тут уже не столько об этой задаче, сколько о заявлении "инженера" о том, что резисторы можно просто откалибровать, и это волшебно из подобранной в лесу палки сделает точный измерительный прибор.

Простите, может быть я что то пропустил? Где я хоть слово сказал про точный измерительный прибор? Я с самого начала говорю что для поставленной задачи, с инженерной точки зрения, достаточно поставить любые резисторы и один раз откалибровать пересчётные коэффициенты для программы обработки. Минимум трудо и деньго затрат. Этого достаточно, что бы даже 328 МК справился с поставленной ТС задачей. Совершенно согласен, что не надо множить сущности. 

P.S. Про шум я знаю достаточно. Мне приходилось, по основной специальности, строить усилители  для усиления и оцифровки пикоамперных  токов в полосе от 0 до 20 МГц. Там по полной программе вылазили и шумы резисторов тоже. Приходилось покупать те, по 50$ и охлаждать и спектры смотреть.        

bwn
Offline
Зарегистрирован: 25.08.2014

rkit пишет:

А тут перепутано разрешение и точность. Прибор может показывать хоть 50 знаков после запятой без колебаний, но это еще не значит, что это значение соответствует реальности.

Согласен, откалиброван до 10В, более высоковольтного источника напряжения нет, на более низких напряжениях отклонения в сотые процента, почему эту тенденцию не распространить и вверх, резисторы в делителе те же. Для поставленной ТС задачи этого достаточно. Если так страшно, то поставить алярм на одну-две десятых выше допустимого, потеряв аж процента три емкости. 
Ну почему у нас на форуме, услышав вопрос, как пройти к электричке, сразу приплетут и паровоз, и Анну Каренину к нему?

rkit
Онлайн
Зарегистрирован: 23.11.2016

nik182 пишет:

 Где я хоть слово сказал про точный измерительный прибор?

0.1 от 58.

nik182
Offline
Зарегистрирован: 04.05.2015

Отлично. Два человека просили у Вас цифрами доказать что на 12 разрядном АЦП и резисторном делителе это невозможно. Как я понимаю цифр не будет? 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Господи. У этого блюпила ошибка 2 бита по даташиту после калибровки. Еще пара бит из других источников это минимум. Это уже +- 0.11 Рассказывать что можно отфильтровать ошибку смещения или фликер-шум, или ошибку нелинейности - не надо.

nik182
Offline
Зарегистрирован: 04.05.2015

rkit пишет:

Господи. У этого блюпила ошибка 2 бита по даташиту после калибровки. Еще пара бит из других источников это минимум. Это уже +- 0.11 Рассказывать что можно отфильтровать ошибку смещения или фликер-шум, или ошибку нелинейности - не надо.

Ну так о чём был разговор? Ваш 0.11 от моего 0.1  очень сильно отличается?