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

 

Хочешь стать куратором любимой темы?

* Комментарии к новостям

Не нравится реклама? Пройдите простую регистрацию на форуме и не будете видеть рекламу.

Прочитано 1485 раз

grean2007 и 1 Гость просматривают эту тему.

05 Мар 2021 в 16:35
Прочитано 1485 раз
Оффлайн

X

Сообщений: 26
Вашему вниманию представляется простой прибор, способный нагружая источник питания напряжением от 0.8 до 5В, измерять его напряжение и внутреннее сопротивление.


Алгоритм работы прибора следующий:
При подключении прибора к источнику питания запускается внутренний DC-DC преобразователь и запитывает микроконтроллер в Arduino Nano V3 это может быть как AtMega 328 так и AtMega 168, памяти достаточно для любого. Далее происходит инициализация OLED дисплея и измерительного модуля, выводится первая надпись на экран, потребляемый ток прибором уменьшается до 25мА. Далее производится циклическое измерение напряжения на источнике питанияБ те самые тонкие проводочки на щупах. Вычисляется среднее арифметическое за несколько измерений и выводится на экран. Так же это значение в дальнейших расчетах используется как ЭДС источника питания, и сохраняется в оперативной памяти прибора. Далее выдерживается пауза примерно 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
-макетная платка или навесной монтаж по вкусу




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




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


Удалил лишние комментарии, добавил описание прибора. Работу прибора проверял по акб с известными характеристиками и по лабораторным приборам. Точность прибора составляет 8 знаков после запятой, но выводится на дисплей лишь 2, потому как это избыточно, но округление происходит лишь при выводе, расчеты происходят в формате float
ниже под спойлером скетч прошивки:
 
Скрытый текст
/*
    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 ");
 }
 }


Схема устройства и архив с необходимыми файлами для повторения:
« Последнее редактирование: 12 Мар 2021 в 11:46 от X »


11 Мар 2021 в 22:11
Ответ #1
Оффлайн

X

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

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


12 Мар 2021 в 01:05
Ответ #2
Оффлайн

tmiaer

Москва и около Сообщений: 9308
Точность прибора составляет 8 знаков после запятой
Точность 8 знаков выглядит примерно вот так ссылка

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


12 Мар 2021 в 01:46
Ответ #3
Оффлайн

UriBas

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

Пока только схема:
А почему не поставить делитель на 2 (по 10к к примеру) ? Максимальное входное у Ина226 36 В ..  72 В делим пополам и все дела. 
Вариант два в одном не рассматривали?..  Ну чтобы один прибор был, поставить три релюшки, питание от встроенного источника.
Скрытый текст


12 Мар 2021 в 10:22
Ответ #4
Оффлайн

X

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


12 Мар 2021 в 10:28
Ответ #5
Оффлайн

X

Сообщений: 26
Точность 8 знаков выглядит примерно вот так ссылка

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

Обоснуй!
Хотя нет. Не выйдет, вы ведь не имеете представления о том что есть прибор имеющий аттестацию средства измерения с поверочным свидетельством и и точность измерения в рамках технических свойств АЦП.

8 знаков относятся к точности не самого датчика ina226 и его измерениям. Хотя и сам датчик никто в госреестр не внесёт пока он не будет оформлен как средство измерения и документация о нём не попадёт во все метрологические инстанции государства, так же как и методики поверки, настройки и обслуживания. А именно к работе с данными, усреднения и вычисления. Именно выбирая статистическим методом ошибку можно добиться повторяемости измерения. Кстати тот прибор работает точно так же, и он дерьмовый. Не давно избавился от частотомера из той же серии. Я лучше буду пользоваться дешёвым китайцем или родешварцем за пару миллионов у знакомых, но не этим тормозом.
Будьте любезны не публикуйте ответы такого рода в этой теме.
« Последнее редактирование: 12 Мар 2021 в 10:57 от X »


12 Мар 2021 в 10:36
Ответ #6
Оффлайн

UriBas

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


12 Мар 2021 в 10:52
Ответ #7
Оффлайн

X

Сообщений: 26
Поясню метод косвенных измерений и как добиться точности используя относительно не точные датчики.

А всё очень просто, нужно соблюдать несколько правил
  • Устранить шум датчика статистическим методом (накапливание и усреднение результата измерения)
  • Для парных измерений использовать один и тот же датчик
  • Для вычисления зависимостей использовать лишь линейные законы (не использовать поправочные коэффициенты,  и работать с максимальной разрядностью)
  • При отображении полученных данных отображать лишь ту часть хвоста после запятой, которая гарантируется производителем датчика (разрядностью ацп)

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

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


Добавлено 12 Мар 2021 в 10:55
Интересно, надо бы проверить на практике.. на сколько будут отличатся показания при полном диапазоне и на среднем.
в даташите почитай, на практике не более двух бит, хотя у ардуинки и больше. Всё зависит от опорного напряжения ацп. У меня была задача не получить переполнение ацп, это потеря целой минуты времени.


12 Мар 2021 в 11:28
Ответ #8
Оффлайн

X

Сообщений: 26
А почему не поставить делитель на 2 (по 10к к примеру) ? Максимальное входное у Ина226 36 В ..  72 В делим пополам и все дела. 
Вариант два в одном не рассматривали?..  Ну чтобы один прибор был, поставить три релюшки, питание от встроенного источника.
Скрытый текст

Гирька класса точности Ф1, думаю достаточно чтоб получить оценочный вес устройства в варианте 1S



Примерный макет устройства всё в одном:


На карманный вариант не тянет, потому второй вариант будет именно 12-72 вольта, его вес не более 130-135г, и размер с адаптер 12В 2А




12 Мар 2021 в 13:03
Ответ #9
Оффлайн

i

Администратор Иваново Сообщений: 4024
Устранить шум датчика статистическим методом (накапливание и усреднение результата измерения)
Для белого шума это отлично работает, но для смещения (например температурного дрейфа или переменного контактного сопротивления) нет.


12 Мар 2021 в 14:59
Ответ #10
Оффлайн

X

Сообщений: 26
Для белого шума это отлично работает, но для смещения (например температурного дрейфа или переменного контактного сопротивления) нет.
всё верно, потому и оставил два знака после запятой и сделал иголки на контактах.
а так если контакт плохой то выпадет по ошибке и измерение не состоится. Хотя когда только разрабатывал устройство щуп был луженый и пытался измерить лифовскую ячейку с сопротивлением 11мОм, у меня получилось 860мОм, паника на сутки была обеспечена. потому надёжность контакта проверять необходимо, и использовать контакты лучше из латуни или покрытые нитритом титана или золотом.
 


04 Апр 2021 в 09:35
Ответ #11
Онлайн

grean2007

Новосибирская область - Россия Сообщений: 127
-измерительный модуль с шунтом на ток до 4А на базе ina226
Какое сопротивление шунта нужно ставить? У меня на модуле стоит R100.


04 Апр 2021 в 12:43
Ответ #12
Оффлайн

X

Сообщений: 26

Много, должно быть в 10 раз меньше.
Фотку приложи.
R010 оптимально. Я токи до 5 ампер просчитывал. При шунте в 0.01 ом можно по идее батареи от 0.5В до 150В легко анализировать.
« Последнее редактирование: 05 Апр 2021 в 01:14 от X »


04 Апр 2021 в 16:39
Ответ #13
Оффлайн

TRO

Украина, г. Запорожье. Сообщений: 8195
Когда мне надо измерять ток на шунте, я младшие ардуинки не беру, так как у них нет предусилителя АЦП, а старшие (в которых есть) уже слегка кусаются по цене. Идеальна в этом плане Attiny44, при включении предусилителя и повышении разрядности замеров путем введения шума (пила, этим же процессором) в паре с усреднением множества измерений дают точность выше разрядности АЦП.
Кстати, если количество ножек пугают, то то же самое можно сделать на Attiny25 (всего 8 ног), я делал простенький ваттметр на экране от нокии 5110 для зарядного устройства.
« Последнее редактирование: 04 Апр 2021 в 16:49 от TRO »


04 Апр 2021 в 19:14
Ответ #14
Онлайн

grean2007

Новосибирская область - Россия Сообщений: 127
Фотку приложи.
Платка такая же только R100. Собрал на макетке. Status unload и ничего больше не меряет. Соединения, контакт проверил несколько раз. Запаял R010, но без изменений.

Добавлено 04 Апр 2021 в 19:16



05 Апр 2021 в 01:07
Ответ #15
Оффлайн

X

Сообщений: 26
А измерительные ноги подключил?
Чем напряжение измерять? Внимательно схему посмотри.
Землю к минусу, а vsb к плюсу. Желательно отдельными проводками, чтоб не учитывать падение напряжения на нагрузочных проводах.

Добавлено 05 Апр 2021 в 01:10
Когда мне надо измерять ток на шунте, я младшие ардуинки не беру, так как у них нет предусилителя АЦП, а старшие (в которых есть) уже слегка кусаются по цене. Идеальна в этом плане Attiny44, при включении предусилителя и повышении разрядности замеров путем введения шума (пила, этим же процессором) в паре с усреднением множества измерений дают точность выше разрядности АЦП.
Кстати, если количество ножек пугают, то то же самое можно сделать на Attiny25 (всего 8 ног), я делал простенький ваттметр на экране от нокии 5110 для зарядного устройства.
там точность мизерная. Не умеет ни сэмплировать ни усреднять. Проще использовать техасовские сенсоры. Там и разрядность достойная и функционал хороший.


05 Апр 2021 в 06:54
Ответ #16
Оффлайн

TRO

Украина, г. Запорожье. Сообщений: 8195
там точность мизерная.
Ну вы же потом сами пишите что
всё верно, потому и оставил два знака после запятой....
Т.е. зачем эта оверточность если она не используется.

Не умеет ни сэмплировать ни усреднять.
Что значит не умеет? Это микроконтроллер, что напишите то и умеет...
А если программист не умеет, то это уже не к микроконтроллеру претензия (но судя по вашему описанию вы умеете и именно это программно и делаете, так что суть ответа мне несколько непонятна).

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

Ну а в целом, хорошее полезное дело делаете, так что плюс в карму
« Последнее редактирование: 05 Апр 2021 в 08:05 от TRO »


05 Апр 2021 в 13:24
Ответ #17
Онлайн

grean2007

Новосибирская область - Россия Сообщений: 127
А измерительные ноги подключил?
Да все подключено. Собрал Авометр, для проверки Ina226, пишет что не найдена. Видно дохлая, шла 110 дней испортилась!


 

Самодельный навигатор на arduino

Автор GrendelРаздел Микроэлектроника

Ответов: 10
Просмотров: 2591
Последний ответ 13 Мар 2021 в 21:30
от X
Самодельный свинцово-кислотный аккумулятор (теория)

Автор Влад МакРаздел Свинцовые аккумуляторы

Ответов: 197
Просмотров: 75296
Последний ответ 18 Дек 2019 в 17:12
от slav
Самодельный шкив на зубчатый ремень. Нужна помощь.

Автор mr.DreamРаздел Механика

Ответов: 93
Просмотров: 14331
Последний ответ 04 Июн 2020 в 13:14
от Уштоукшук
Самодельный пауэрбанк

Автор АгапитРаздел Источники питания

Ответов: 14
Просмотров: 810
Последний ответ 23 Янв 2021 в 18:36
от Новик
Самодельный электровел от mr.Dream

Автор mr.DreamРаздел Наше творчество

Ответов: 103
Просмотров: 38892
Последний ответ 16 Апр 2015 в 10:21
от Slider