Тест группы батарей - Нужна помощь в реализации
- Войдите на сайт для отправки комментариев
Ср, 06/11/2019 - 08:15
Доброго времени суток!!!
Нужна помощь в реализации одной моей задумки:
- имеется группа аккумуляторных батарей на 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; }
Ну так вы с идеологией сначала определитесь. С питанием Ардуин, с развязкой, с тем что будет если одна батарея хуже другой и т.д.
Мне другое интересно, под линиями с вопросительными знаками что подразумевается, опторазвязка? ;)
Эта схема сгорит, как только будет собрана, ибо для связи нужна общая земля. Тут нужно использовать линейные оптроны для гальванической развязки напряжения.
Делал модуль для точно такой же задачи на один аккумулятор, вам нужно 4 таких, и все подключить прямо к уно.
Напряжение считать, исходя из того, что v_sens / R2 = acc+ / R9.
да
это схема готового модуля? или сами собирали?
Эта схема сгорит, как только будет собрана, ибо для связи нужна общая земля. Тут нужно использовать линейные оптроны для гальванической развязки напряжения.
Делал модуль для точно такой же задачи на один аккумулятор, вам нужно 4 таких, и все подключить прямо к уно.
Напряжение считать, исходя из того, что v_sens / R2 = acc+ / R9.
ТС не говорит о ёмкости батарей, о целях и применении самого ус-ва. Ничто не мешает питать Ардуино каждую от своей батареи и через опторазвязку передавать данные мастеру - как изображено на схеме.
ТС не говорит о ёмкости батарей, о целях и применении самого ус-ва. Ничто не мешает питать Ардуино каждую от своей батареи и через опторазвязку передавать данные мастеру - как изображено на схеме.
Сам
Ну и передавайте данные по последовательному интерфейсу. На приёмной стороне организуйте 4 программных uart-а и принимайте по очереди.
Тут даже 5-я Ардуино лишняя. Только 3 оптрона и резисторы.)
Тут даже 5-я Ардуино лишняя. Только 3 оптрона и резисторы.)
Ну и передавайте данные по последовательному интерфейсу. На приёмной стороне организуйте 4 программных uart-а и принимайте по очереди.
htpicc@gmail.com. Или платный раздел.
Гонять UART по дешевым оптронам я бы не рекомендовал, у них очень низкая пропусканая способность и несимметрично заваленные фронты. Бывают быстрые оптроны, но гораздо дешевле цифровые изоляторы на трансформаторах, по типу adum1201
Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)
Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)
Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)
Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)
А почему не 4 делителя? Что нужно милливольты ловить?
А просто делителями с каждой банки не обойтись? На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. Для батареи вполне достаточно.
Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)
А почему не 4 делителя? Что нужно милливольты ловить?
Впрочем, это вопрос к ТС: "а чё надо-то"?
А просто делителями с каждой банки не обойтись? На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. Для батареи вполне достаточно.
Осталось только продать почку за резисторы с точностью 0.005% и потратить пару месяцев работы на механизм температурной компенсации.
Ещё вариант:
Если нам нужно только "каждая батарея не должна просаживаться ниже 10.8В", то цепляем на эти батареи tl431 + оптрон. Дешево и развязано.
А просто делителями с каждой банки не обойтись? На блюпиле даже для верхней банки точность будет лучше 0.1 вольта.
А просто делителями с каждой банки не обойтись? На блюпиле даже для верхней банки точность будет лучше 0.1 вольта. Для батареи вполне достаточно.
Осталось только продать почку за резисторы с точностью 0.005% и потратить пару месяцев работы на механизм температурной компенсации.
Зачем все эти тонкости и месяцы? Изделие единичное. На любых резисторах можно каждый делитель прокалибровать и в процессор ввести поправочные коэффициенты. Температурная компенсация тоже может быть общитана, но сердце вещует что точность измерения нужна меньше чем изменение температуры может внести в измерительную цепь. Ваш комментарий говорит о том что Вы далеки от инженерных решений. Цифра 0.005 % очень убедительно об этом говорит. Лучше молчать, чем выставлять себя википедиком.
Ну да, скорость важна при разряде 100А аккумулятора.) По большому счёту тут и одной Ардуино достаточно.)
тоже об этом подумал, единственное не знаю из INA есть что с напряжением в 60 вольт
Для даже-не-википедиков расскажу секрет: резисторы малой точности шумят. Не по гауссу. Калибровать бессмысленно. Если бы всё было так просто, никто бы 0.005% резисторов не производил, и не покупал по 50 долларов за штуку.
Для даже-не-википедиков расскажу секрет: резисторы малой точности шумят. Не по гауссу. Калибровать бессмысленно. Если бы всё было так просто, никто бы 0.005% резисторов не производил, и не покупал по 50 долларов за штуку.
ищем константан и мотаем?
Даже в гараже шум резисторов из стандартного ряда при измерении напряжения аккумуляторной батареи поддаётся фильтрованию. Задача чисто инженерная. Высокие материи привлекать не требуется. 1% абсолютная погрешность измерения напряжения при слежении за состоянием свинцового аккумулятора вполне достаточна. Все температурные, шумовые и прочие наводочные погрешности цепей измерения укладываются в эту погрешность. Все разговоры про 0.005% точность в рамках данной темы вызывают улыбку. Если это необходимо - докажите на конкретных расчётах. Иначе это выглядит как слышал звон, да не знаю где он. Для 0.005% резисторов есть свои области применения и к измерению напряжения свинцовых аккумуляторов не имеющие ни какого отношения. Надеюсь читающие топик примут к сведению, что здесь задача не научных исследований. Личные желания иметь большую точность измерений говорит только о низком уровне образования по данной теме.
Даже в гараже шум резисторов из стандартного ряда при измерении напряжения аккумуляторной батареи поддаётся фильтрованию.
Для особо доходчивых повторю еще раз: Не по гауссу. ФНЧ подавляет только гауссов шум. Фликкер шум подавляют непростыми схемами с чоппингом. Не понял, что написали - молчи, иначе еще сильнее опозоришься.
Не спорю с тем, что померить напряжение можно дешево и легко, и даже привел пример чуть выше. Но 0.1 от 58 вольт на копеечной китайской платке -- нет. И чтобы опять не начинал, у свинцовых аккумуляторов максимальное напряжение не 12, а 14.4.
rkit, мне кажется никто не спорит, что все детали шумят, у всего свой ткс и.т.п и.т.д. Но всё познаётся в сравнении . Какой уровень шума будет у резисторного делителя, сможете озвучить конкретные цифры? Учитывая, что на опорном того же блюпилла(stm32f103) собственный шум в пике до 100мВ (!), будет ли шум резисторов как то выделяться из общего фона? Может ли вообще АЦП зафиксировать это шум?
Для особо доходчивых повторю еще раз: Не по гауссу. ФНЧ подавляет только гауссов шум. Фликкер шум подавляют непростыми схемами с чоппингом....
А интернет говорит что по гауссу https://www.compel.ru/lib/97388
И хочу заметить, что плотность шума для резисторов используемых в делителях - сотни кОм - из той же статьи доли микровольт. При ступени АЦП 5 мВ как шум резистора без усилителя может повлиять на результат оцифровки? Ответ с цифрами, пожалуйста. Ваши не подкреплённые расчётами заявления показывают отсутствие понимания проблемы. Вы своими безответственными заявлениями вводите заблуждениями участников дискуссии.
Может и глупость скажу, но на атмеге328, в электронной нагрузке, никаких шумов не наблюдаю, вяло шевелится младший разряд (0,059В для 60В). В лупе 500 измерений и среднее. Референс от TL431. Свинец, он тяжелый и крепкий, зачем плодить сущности?
rkit, мне кажется никто не спорит, что все детали шумят, у всего свой ткс и.т.п и.т.д. Но всё познаётся в сравнении . Какой уровень шума будет у резисторного делителя, сможете озвучить конкретные цифры? Учитывая, что на опорном того же блюпилла(stm32f103) собственный шум в пике до 100мВ (!), будет ли шум резисторов как то выделяться из общего фона? Может ли вообще АЦП зафиксировать это шум?
Может. И речь тут уже не столько об этой задаче, сколько о заявлении "инженера" о том, что резисторы можно просто откалибровать, и это волшебно из подобранной в лесу палки сделает точный измерительный прибор.
А интернет говорит что по гауссу https://www.compel.ru/lib/97388
А если прочитать что написано в интернете, а не просто не думая что-то нагуглить, то можно понять, что речь не идет о фликкер-шуме и постоянном токе.
"Среднеквадратичное (RMS) напряжение переменного шума (AC)"
"без DC-составляющих"
Может и глупость скажу, но на атмеге328, в электронной нагрузке, никаких шумов не наблюдаю, вяло шевелится младший разряд (0,059В для 60В). В лупе 500 измерений и среднее. Референс от TL431. Свинец, он тяжелый и крепкий, зачем плодить сущности?
А тут перепутано разрешение и точность. Прибор может показывать хоть 50 знаков после запятой без колебаний, но это еще не значит, что это значение соответствует реальности.
Может. И речь тут уже не столько об этой задаче, сколько о заявлении "инженера" о том, что резисторы можно просто откалибровать, и это волшебно из подобранной в лесу палки сделает точный измерительный прибор.
Простите, может быть я что то пропустил? Где я хоть слово сказал про точный измерительный прибор? Я с самого начала говорю что для поставленной задачи, с инженерной точки зрения, достаточно поставить любые резисторы и один раз откалибровать пересчётные коэффициенты для программы обработки. Минимум трудо и деньго затрат. Этого достаточно, что бы даже 328 МК справился с поставленной ТС задачей. Совершенно согласен, что не надо множить сущности.
P.S. Про шум я знаю достаточно. Мне приходилось, по основной специальности, строить усилители для усиления и оцифровки пикоамперных токов в полосе от 0 до 20 МГц. Там по полной программе вылазили и шумы резисторов тоже. Приходилось покупать те, по 50$ и охлаждать и спектры смотреть.
А тут перепутано разрешение и точность. Прибор может показывать хоть 50 знаков после запятой без колебаний, но это еще не значит, что это значение соответствует реальности.
Согласен, откалиброван до 10В, более высоковольтного источника напряжения нет, на более низких напряжениях отклонения в сотые процента, почему эту тенденцию не распространить и вверх, резисторы в делителе те же. Для поставленной ТС задачи этого достаточно. Если так страшно, то поставить алярм на одну-две десятых выше допустимого, потеряв аж процента три емкости.
Ну почему у нас на форуме, услышав вопрос, как пройти к электричке, сразу приплетут и паровоз, и Анну Каренину к нему?
Где я хоть слово сказал про точный измерительный прибор?
0.1 от 58.
Отлично. Два человека просили у Вас цифрами доказать что на 12 разрядном АЦП и резисторном делителе это невозможно. Как я понимаю цифр не будет?
Господи. У этого блюпила ошибка 2 бита по даташиту после калибровки. Еще пара бит из других источников это минимум. Это уже +- 0.11 Рассказывать что можно отфильтровать ошибку смещения или фликер-шум, или ошибку нелинейности - не надо.
Господи. У этого блюпила ошибка 2 бита по даташиту после калибровки. Еще пара бит из других источников это минимум. Это уже +- 0.11 Рассказывать что можно отфильтровать ошибку смещения или фликер-шум, или ошибку нелинейности - не надо.
Ну так о чём был разговор? Ваш 0.11 от моего 0.1 очень сильно отличается?