avatar_X

Самодельный миллиомметр на arduino nano и ina226 c OLED дисплеем, до 5вольт

Автор X, 05 Март 2021 в 16:35

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

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

илс

Спойлер
Автор темы [user]Х[/user], удаленные сообщения восстановил по жалобе от коллеги [user]TRO[/user]
===============================
Вашему вниманию представляется простой прибор, способный нагружая источник питания напряжением от 0.8 до 5В, измерять его напряжение и внутреннее сопротивление.


Закон Ома для полной цепи можно определить исходя из того, что ЭДС источника цепи равняется сумме падений напряжения на источнике и на внешней цепи:

E = I*r + I*R = U(r) + U(R), где

r, R — внутреннее и внешнее сопротивления;
I — сила тока;
U(r) — напряжение на источнике;
U(R) — напряжение на внешней цепи.


Соответственно имеем следующую зависимость:
r = (E - U) / I, применимо к нашему случаю имеем: r = dU/dI
где dU есть усреднённое значение падения напряжения, в результате нагружения источника ЭДС током, усреднённое значение, которого есть dI


Для пущей важности делаем измерения методом сэмплирования, с интервалом в 0.7 секунды и по 100 штук, далее усредняем и считаем. В скетче есть поправка +5мА, это примерный ток, который потребляет DC-DC преобразователь питающий сам тестер. Для пущей объективности в схему введён резистор на 380-400 Ом, создающий дополнительный ток при измерении ЭДС.



Алгоритм работы прибора следующий:
При подключении прибора к источнику питания запускается внутренний DC-DC преобразователь и запитывает микроконтроллер в Arduino Nano V3 это может быть как AtMega 328 так и AtMega 168, памяти достаточно для любого. Далее происходит инициализация OLED дисплея и измерительного модуля, выводится первая надпись на экран, потребляемый ток прибором уменьшается до 5мА. Далее производится циклическое измерение напряжения на источнике питания, те самые тонкие проводочки на щупах. Вычисляется среднее арифметическое за несколько измерений и выводится на экран. Так же это значение в дальнейших расчетах используется как ЭДС источника питания, и сохраняется в оперативной памяти прибора. Далее выдерживается пауза примерно 2 секунды и при помощи реле подключается в токоизмерительную цепь нагрузка, в качестве которой применён резистор мощностью 5 ватт и  сопротивлением 4.7Ом. Резистор подобран таким образом чтоб рассеиваемая им мощность была менее 5 ватт, но нагрузка для источника тока была существенной. Далее спустя некоторое время происходит циклическое измерение тока цепи, напряжения и рассеиваемой мощности, если напряжение падает ниже допустимого происходит аварийный выход из измерительного цикла. Далее вычисляются значения среднего тока нагрузки и среднего напряжения в нагруженном состоянии и по этим данным с использованием закона Ома для полной цепи рассчитывается внутреннее сопротивления источника тока.



Для сборки устройства понадобятся следующие компоненты:
-реле с напряжением обмотки 5В и током коммутации 3-5А
-резистор нагрузочный 4.7-6.8Ом мощностью 5Вт
-резистор токоограничивающий 1к 0.125Вт
-транзистор кремниевый n-p-n проводимости средней мощности типа кт315, кт3102, или импортный аналог
-измерительный модуль с шунтом на ток до 4А на базе ina226
-OLED дисплей с I2C интерфейсом на базе контроллера SD1306
-отладочная плата Arduino nano V3, или её клонУ
-DC-DС преобразователь с 0.5В до 5В на ток 500ма
- корпус примерно размером 50х40х25мм
-провода для измерительного щупа сечением не менее 2.5мм2
-макетная платка или навесной монтаж по вкусу
Очень важно правильно указать точное сопротивление шунта и максимальный его ток. У меня измеряет напряжение ровно так же как и настольный прибор с точностью до 3 знака после запятой, а вот ток немного отличался. Ну и если вы делаете прибор с питанием от измеряемого источника не потрудитесь измерить ток потребления и учесть его в скетче, я поставил 5мА, но если честно до 100мА ни на что не повлияет. Успехов в повторении! Всё получится!






Один из этапов макетирования:





Характеристики:

  • Питание от тестируемого источника
  • Допустимый диапазон напряжений источника 0.85-5В
  • Защита от переполюсовки по желанию, я не делал. Можно поставить по входу преобразователя диодный мост к примеру, или ограничиться выпрямительным диодом...



Удалил лишние комментарии, добавил описание прибора. Работу прибора проверял по акб с известными характеристиками и по лабораторным приборам. Точность прибора составляет 8 знаков после запятой (именно точность, разрядность АЦП 16 бит - это примерно 30мВ на разряд), но выводится на дисплей лишь 2, потому как это избыточно и жрёт ресурсы, округление происходит лишь при выводе.



Схема устройства и архив с необходимыми файлами для повторения:




Перед тем как задать глупый вопрос, или высказать голословное утверждение, либо выдумать историю, которая противоречит метафизике нашей вселенной, настоятельно рекомендую ознакомиться со следующими материалами:




А теперь прошу к обсуждению, и вопросозадаванию! Всё не по теме и противоречещее логике и здравому смыслу, а так же нарушающее законы мироздания и физики в частности будет удаляться! Троли сразу могут идти лесом!

Surf_el

А можете описать алгоритм вашего устройства? Как нагружает, что при этом замеряет и какие выводы на основе измерений делает?
MAC 8t, 16ач Li-on, 5ач LiPo, Mark II от e4bike, 2 шт. NinebotOne E+ и S2, Ninebot ES2, Inmotion V10F

Metamorf

Ну выложи скетч, хоть понять по какой формуле и что ты считаешь, основываясь на просадке напряжения под нагрузкой.
Koogo S3 plus, полный привод, 8.5", 48В, 41км/ч. ODO-3800km
Мастер берет деньги не за перемычку, а за то, что понял, куда ее впаять.

X

Цитата: Metamorf от 05 Март 2021 в 21:03
Ну выложи скетч, хоть понять по какой формуле и что ты считаешь, основываясь на просадке напряжения под нагрузкой.
закон ома для полной цепи.
в нашей вселенной другой формулы нету.

можно найти полное комплексное сопротивление переменному току, но оно как сферический конь в вакууме.

считай аналог прибора кулон начала нулевых

---------------------------------------------------
Цитата: Surf_el от 05 Март 2021 в 20:06
А можете описать алгоритм вашего устройства? Как нагружает, что при этом замеряет и какие выводы на основе измерений делает?
Да всё просто, закон ома для полной цепи. Сначала измеряем напряжение холостого хода, измеряем в цикле несколько раз и находим среднее арифметическое.
далее подключаем нагрузочный резистор, для напряжения меньше 8 вольт у меня 4.7Ом, ждём пару секунд и измеряем в цикле большими фреймами ток цепи и напряжение на полюсах источника тока. Усредняем по 50 выборкам значения тока и напряжения, далее просто расчитываем полное сопротивление источника  r=(E-Ul)/In всё измеряем и считаем в миллиамперах и милливольтах с точностью в дохреналион знаков после запятой, выводим в удобоваримом виде с точностью до сотых.

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

Всё это с некоторыми допущениями, но в 2-3% отклонение укладывается.
я ещё принебрёг внутренним питанием, и прибор питаю от самого измеряемого источника, потому нижний предел 0.75В верхний около 9, ну на самом деле зависит от нагрузочного резистора, у меня на 5 ватт. ну и процесс измерения и тепловые потери пишет на экране.

писал просто, чтоб племянник мог понять, чистый виринг.




/*
    INA226 Bi-directional Current/Power Monitor. Alert Example.
    Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/cyfrowy-czujnik-pradu-mocy-ina226.html
    GIT: https://github.com/jarzebski/Arduino-INA226
    Web: http://www.jarzebski.pl
    (c) 2014 by Korneliusz Jarzebski
*/

#include <Wire.h>
#include <INA226.h>
INA226 ina;

#include <Tiny4kOLED.h>
uint8_t width = 128;
uint8_t height = 32;

void setup()
{
  oled.begin(width, height, sizeof(tiny4koled_init_128x32br), tiny4koled_init_128x32br);
  oled.setRotation(1);
  oled.setFont(FONT6X8);
  oled.clear();
  oled.on();
  oled.setCursor(20, 0); //top left
  oled.print("MilliOhmMeter");
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  // Default INA226 address is 0x40
  ina.begin();
  // Configure INA226
  ina.configure(INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);

  // Calibrate INA226. Rshunt = 0.01 ohm, Max excepted current = 4A
  ina.calibrate(0.01, 4);
  // Enable Bus Over-Voltage Alert
  // ina.enableBusOvertLimitAlert();
  // ina.enableBusUnderLimitAlert();
  // ina.setBusVoltageLimit(3.33);
  // Enable Shunt Over-Voltage Alert
  // ina.enableShuntOverLimitAlert();
  // ina.enableShuntUnderLimitAlert();
  // ina.setShuntVoltageLimit(0.0055);
  // Enable Power Over-Limit Alert
  ina.enableOverPowerLimitAlert();
  ina.setPowerLimit(0.130);
  // ina.setAlertInvertedPolarity(true)
}


void clear(int x, int y)
{
  oled.setCursor(x, y);
  oled.print("                     ");
  oled.setCursor(x, y);
}
void loop()
{
//  digitalWrite(13, LOW);
  float shuntVoltage_mV = 0.0;
  float loadVoltage_V = 0.0;
  float busVoltage_V = 0.0;
  float current_mA = 0.0;
  float busVoltage_uV = 0.0;
  float loadVoltage = 0.0;
  float current = 0.0; 
  float dU = 0.0;
  float r = 0.0;
  float power_mW = 0.0;
  int count = 0;
  clear(1,3);
  oled.print("Status: unLoad mode!");
  busVoltage_uV = 0;
  for (int t=0; t<20; t++ ){
    busVoltage_uV = busVoltage_uV + (1000 * ina.readBusVoltage());
    count = t;
   delay(250);
  }
  count = count + 1;
  busVoltage_uV = busVoltage_uV / count;
  clear(1,1);
  oled.setCursor(8, 1);
  oled.print("UnLoad U = ");
  oled.print(busVoltage_uV/1000);
  oled.print("V");
if (busVoltage_uV > 850){
  clear(0,2);
  oled.setCursor(6, 2);
  oled.print("Unload U > 0.85V");
clear(1,3);
  oled.print("Status: please wait!");
  delay(2000);
  clear(1,3);
  oled.print("Status: Load mode!");
  delay(200);
  digitalWrite(13, HIGH); 
  clear(1,1);
  oled.print("I=");
  oled.setCursor(1, 2);
  oled.print("U=");
  delay(200);
  for (int t=0; t<50; t++ ){
    shuntVoltage_mV = ina.readShuntVoltage();
    busVoltage_V = 1000 * ina.readBusVoltage();
    current_mA = ina.readShuntCurrent();
    power_mW = 1000 * ina.readBusPower();   
    loadVoltage_V  = busVoltage_V + shuntVoltage_mV;
    loadVoltage = loadVoltage + busVoltage_V;
    current = current + current_mA;
    oled.setCursor(15, 1);
    oled.print(current_mA*1000);
    oled.print("mA t=");
    oled.print(t);     
    oled.setCursor(15, 2);
    oled.print(loadVoltage_V/1000);
    oled.print("V P=");   
    oled.print(power_mW);
    oled.print("mW");
    delay(200);
    if (loadVoltage_V < 750){
    t=53;
    }
   count = t;
  }
  digitalWrite(13, LOW);
  if (count == 49){
      count = count + 1;
  current_mA = current / count;
  loadVoltage_V = loadVoltage / count;
  dU = busVoltage_uV - loadVoltage_V;
  r = dU / current_mA;
  clear(0,1);
  oled.setCursor(8, 1); 
  oled.print("r = ");
  oled.print(r);
  oled.print(" mOhm");   
  clear(0,2);
  clear(0,3);
  oled.print("Done"); 
  delay(5000);
  }
else {
  clear(0,1);
  oled.setCursor(2, 1);
  oled.print("Stop! Load = ");
  oled.print(current_mA*1000);
  oled.print("mA");
 
     clear(0,2);
     oled.setCursor(8, 2);
     oled.print("Load U < 0.75V ");
     clear(0,3);
     oled.print("Done, battery BAD!"); 
     delay(5000);
}
}
else {
  clear(0,2);
  oled.setCursor(8, 2);
  oled.print("unLoad U < 0.85V ");
}
}




Добавлено 05 Март 2021 в 21:23

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

Metamorf

А что по госту не сделал? Правильнее мерить напряжение под маленькой нагрузкой, потом под бОльшей. Полюбому надо усовершенствовать, добавить два мосфета, которыми будеу включаться разные нагрузки.
Сколько времени занимает 50 измерений? Чем дольше действие нагрузки, тем больше просаживается батарея и разнятся результаты измерений. Хз, через какое время нужно мерить под второй нагрузкой. Думаю его нужно подобрать, сравнивая результат измерения со специализированными приборами.

Добавлено 05 Март 2021 в 21:32

Цитата: X от 05 Март 2021 в 21:18дифицитный
Digispark с али экспесс очень даже доступный.
Koogo S3 plus, полный привод, 8.5", 48В, 41км/ч. ODO-3800km
Мастер берет деньги не за перемычку, а за то, что понял, куда ее впаять.

Metamorf

[user]X[/user], Ну наверное потому, что первая нагрузка уже есть, это питание от измеряемого аккума. Маленькая нагрузка нужна, чтоб убрать эффект емкости (ту самую просадку, которая при самом маленьком токе уже влияет на напряжение).
Вообще вещь нужная. Оформляй шапку. Схему, скетч и библиотеку для ina. Думаю у кого желание появится, захотят сделать. Я уже задумался)))
Блин, ну минуту мерить это долго. Так захочешь 80 банок померить и засядешь на 2 часа :-)
Koogo S3 plus, полный привод, 8.5", 48В, 41км/ч. ODO-3800km
Мастер берет деньги не за перемычку, а за то, что понял, куда ее впаять.

UriBas

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

UriBas

Цитата: X от 06 Март 2021 в 11:05родешварц на колёсиках, флюк какой-то, и не знаю что у дядьки было, я у него аккумы лифановские брал, он распечатку присылал, в общем математика и физика одна потому и показания одни
[user]Х[/user] все таки хорошо бы знать, что за прибор используется в качестве эталона.. но в принципе, главное чтобы были стабильные показания у данного экземпляра.  Попробую собрать и проверить. Можно сделать вариант с встроенным аккумулятором на литии, тогда диапазон можно поднять (без переделки схемы и скетча) до 36 В, а если с делителем то и до 72 или выше, можно будет мерить сборки.. думаю, точность упадет не слишком критично, можно уменьшить фреймы (паузы между замерами) и увеличить число выборок. Полезным дополнением было бы выводить данные в порт юсб, на комп. тогда можно было бы делать дополнительный анализ и сохранение данных типа как тут https://electrotransport.ru/index.php?msg=1892492...
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

X

Цитата: UriBas от 07 Март 2021 в 12:28
[user]Х[/user] все таки хорошо бы знать, что за прибор используется в качестве эталона.. но в принципе, главное чтобы были стабильные показания у данного экземпляра.  Попробую собрать и проверить. Можно сделать вариант с встроенным аккумулятором на литии, тогда диапазон можно поднять (без переделки схемы и скетча) до 36 В, а если с делителем то и до 72 или выше, можно будет мерить сборки.. думаю, точность упадет не слишком критично, можно уменьшить фреймы (паузы между замерами) и увеличить число выборок. Полезным дополнением было бы выводить данные в порт юсб, на комп. тогда можно было бы делать дополнительный анализ и сохранение данных типа как тут https://electrotransport.ru/index.php?msg=1892492...
Да мне не нужно было для сборок.
Вывод в компот легко. Дописать или переписать логику тож без проблем. Ина 226 может в лоб измерять 26 вольт. С делителем сколько угодно. Делайте как вам удобно. Если нужно я перепишу программу под ваш вариант минут за 5. Можно вообще без экрана сделать, в виде юсб щупа.
Мне для отбраковки батареек и аккумуляторов сотовых и тп. Потому так собрал. А вы делайте как вам нужно. Или пишите сюда чего хотите.
Принцип измерения - косвенный. Закон Ома полной цепи. Все измерения на постоянном токе. Нагружать током больше 2А не вижу смысла. Для работы со сборками до 26 вольт нужно поставить нагрузочный резистор примерно на 16Ом соответствующей мощностью.
Реле можно смело заменить мосфетом.

UriBas

Цитата: X от 08 Март 2021 в 23:20..Ина 226 может в лоб измерять 26 вольт. ..Нагружать током больше 2А не вижу смысла.   
Ина 226 по даташиту может без внешнего делителя измерять до 36 вольт, к тому же есть дисплей, есть полноценная Ардуина и хочется всю эту музыку" использовать по полной..  сборку тоже полезно измерять, это покажет на сколько качественны соединения между банками, да и чтобы лишний раз не возится и смотреть состояние банок по общему вн. сопр.   

Что касается тока.. есть у меня прибор YR1035 все отлично мерит, но оказывается этого недостаточно.. зачастую емкость, отдача оказываются ни к черту при хороших показателях Rвн.. причем это относится к аккумам разной химии, в том числе и к свинцовым АКБ.  Кстати китайцы зачастую этим пользуются, запихивая в корпус аккумулятора аккумулятор с гораздо меньшей емкостью, тестер Rвн не может определить подделку или не исправный аккумулятор. Поэтому, приходится использовать как нагрузочную вилку, так и тестер  Rвн, что не удобно, затратно и в целом усложняет диагностику.   Кратковременная нагрузка токами 1С-10С дает выявить скрытые болячки, более менее оценить емкость..  и тут на первый план выходят такие параметры как поляризационное сопротивление, скорость падения напряжения, отскок при отключении нагрузки и т.д. 

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

X

ничего оптимизировать не надо, там датчик программируется и сам всё измеряет и отдаёт по требованию, если выкинуть олед то программа будет в 10 строк кода, можно сделать режим полного теста, на выходе будет начальное напряжение, конечное напряжение, внутреннее сопротивление и ёмкость

UriBas

Цитата: X от 09 Март 2021 в 14:18ничего оптимизировать не надо, там датчик программируется и сам всё измеряет и отдаёт по требованию, если выкинуть олед то программа будет в 10 строк кода, можно сделать режим полного теста, на выходе будет начальное напряжение, конечное напряжение, внутреннее сопротивление и ёмкость 
[user]X[/user], дисплей необходимая вещь для универсальности, но можно вариант и без.. я уже пробовал, как настольный вариант вполне сойдет, собирать такую схему намного легче и дешевле, габариты меньше.  Интересен Ваш вариант, я тут сегодня еще буду занят сборкой схемы (хочу на мосфетах с комбинацией на разные токи) может к концу дня что-то уже будет и с кодом (дай Бог).   

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

UriBas

Цитата: X от 09 Март 2021 в 14:54не, чета не в кассу, а че на карту писать, и зачем. да и емкость измерять карманным тестером с трудом представляется.  это уже не тестер будет, а какой то другой прибор 
Память необходима для учета, для заказчика, когда делаются тесты и надо сделать отчет о проделанной работе, для себя тоже самое (у меня более 200 шт разных акков). 

Что касается разряда для измерения емкости, то не вижу проблемы.. внешний (или встроенный ) резистор ватт на 10-20 и все дела. Давно присматриваюсь к модулю https://mysku.ru/blog/china-stores/58857.html   https://aliexpress.ru/w/wholesale-Zb2l3.html малый размер и в принципе может разрядить любой аккум,  но там простая отсечка по напряжению.. алгоритм не совсем подходит.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

UriBas

Цитата: X от 09 Март 2021 в 17:55только разряжать для достоверности нужно существенным током, хотя бы (0.1-03)С а это для 30АЧ минимум 1 -3А, для 36 вольт это больше 100ватт выходит 
Цепляется к разъему внешний резистор (нагрузка) и можно гнать до 300Вт, один мощный мосфет, чтобы выдерживал нужный ток, или реле. Можно и несколько мосфетов..   Мой эл. вел на 350 Вт 36В, то есть берет 10А максимум , значит 10А хватит.. мосфет в ключевом режиме справится легко, на нем упадет не более 2 Вт.   Для более мощной версии у меня еще есть несколько реле на 100А каждое (реально долговременно до 30А).. конечно, это уже будет не карманная коробочка, а версия мощной эл. вилки для испытания емких аккумуляторов и их сборок разного типа, основа заложена в теме https://electrotransport.ru/index.php?msg=1892492
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

X

Продолжу второй версией прибора.
делитель с коэфф 3,861, но лучше наверное переменник на 100К и подобрать точно на 3 или 4 раза


Пока только схема:

tmiaer

Цитата: X от 05 Март 2021 в 16:35Точность прибора составляет 8 знаков после запятой
Точность 8 знаков выглядит примерно вот так https://www.chipdip.ru/product/3458a

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

UriBas

Цитата: X от 11 Март 2021 в 22:11Продолжу второй версией прибора. делитель с коэфф 3,861, но лучше наверное переменник на 100К и подобрать точно на 3 или 4 раза
Спойлер


Пока только схема:
А почему не поставить делитель на 2 (по 10к к примеру) ? Максимальное входное у Ина226 36 В ..  72 В делим пополам и все дела. 
Вариант два в одном не рассматривали?..  Ну чтобы один прибор был, поставить три релюшки, питание от встроенного источника.
Спойлер
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

X

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