Мини-обзор монитора тока INA219 с выходом I2C

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

jeka_tm пишет:

Ток стабилизируется ОУ, регулируется через MCP4727. Также хардварная защита от обрыва (так как ОУ будет пытаться  стабилизировать ток, при обрыве откроет на полную полевик, и при восстановлении контакта будет КЗ с возможно печальными последствиями).

Жека, будь ласка, схемку скинь, как наваял (именно защиту), тоже интересует.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Ласка?))
Да нету схемы, надо печатке рисовать. Нарисую выложу

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

Понятно! Благодарю!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Последний офтоп. R14 на самом деле там подстроечник. А защита очень простая: как только входное напряжение станет меньше чем на делителе R8R10 откроется VT2 и закоротит вход ОУ управляющего VT1. На схеме ошибка

d00m
Offline
Зарегистрирован: 21.02.2013

извиняюсь, что поднимаю эту тему.

заказал INA219 для проверки, подойдет ли модуль в моем проекте.

на приехавшем модуле установлен шунт R010, а не R100.

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

например тут:

https://openhomeautomation.net/power-monitoring-arduino-ina219

есть первый тестовый пример, где выводится результат shuntvoltage = ina219.getShuntVoltage_mV();

подключил вроде все правильно - Vcc и GND взял с ардуино, SDA - A4, SCL - A5

написано, что должен выводиться 0, а у меня выводится совсем другое:

Shunt Voltage: 0.03 mV
 
Shunt Voltage: 0.05 mV
 
Shunt Voltage: 0.03 mV
 
возможно ли это из-за того, что библиотека с https://github.com/adafruit/Adafruit_INA219 использует шунт R100, а у меня стоит другой?
я конечно многое не понимаю еще, и может все ок с моим выводом, но если такой разброс при тестовом запуске, то чтоже будет при реальном измерении..
 

 

 

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

Шунт в схему включен? Ток по нему бежит? Если нет, то может закоротить оба конца на землю и попробовать? 0.03 мВ / 10 Ом = 3 микроампера. Где такому току взяться как не из наводки по воздуху?

rkit
Offline
Зарегистрирован: 23.11.2016

nik182 пишет:

3 микроампера. Где такому току взяться как не из наводки по воздуху?

Может не надо фантазировать, ага? Цифра для наводок на пяток децибелл меньше.

Это просто ошибка измерения, вполне в пределах описанной в даташите.

d00m
Offline
Зарегистрирован: 21.02.2013

что значит "шунт в схему включен" ?

я подключил модуль к ардуино 4 проводниками и все.

пока никакой схемы нету.

я просто не пойму - должно ли в моем случае выводиться 0, или все таки проблема в том, что другой шунт стоит?

вообще - есть ли связь этого номинала шунта и библиотеки? чтото мне подсказывает, что не должно быть связи.

ведь даже тут на форуме есть темы где обсуждают подключение внешнего шунта..

прошу подсказать, в правильном ли направлении я рассуждаю на этом начальном этапе.

может есть другой способ проверки моего модуля?

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

если использовать альтернативную библиотеку, то можно любой шунт, или ручками если, то тоже
 

 ina219.begin(0x44); // (44) i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
  ina219.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
 // monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
 // monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
 // monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms
 // monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms
 // monitor.configure(0, 2, 8, 8, 7);
                           // range, gain, bus_adc, shunt_adc, mode
                           // range = 1 (0-32V bus voltage range)
                           // gain = 3 (1/8 gain - 320mV range)
                           // bus adc = 3 (12-bit, single sample, 532uS conversion time)
                           // shunt adc = 3 (12-bit, single sample, 532uS conversion time)
                           // mode = 7 (continuous conversion)

  ina219.calibrate(0.100, 0.32, 16, 3.2); 
                // R_шунта, напряж_шунта, макcнапряж, максток
 

 

d00m
Offline
Зарегистрирован: 21.02.2013

ua6em пишет:

если использовать альтернативную библиотеку, то можно любой шунт, или ручками если, то тоже
 

 ina219.begin(0x44); // (44) i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
  ina219.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
 // monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
 // monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
 // monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms
 // monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms
 // monitor.configure(0, 2, 8, 8, 7);
                           // range, gain, bus_adc, shunt_adc, mode
                           // range = 1 (0-32V bus voltage range)
                           // gain = 3 (1/8 gain - 320mV range)
                           // bus adc = 3 (12-bit, single sample, 532uS conversion time)
                           // shunt adc = 3 (12-bit, single sample, 532uS conversion time)
                           // mode = 7 (continuous conversion)

  ina219.calibrate(0.100, 0.32, 16, 3.2); 
                // R_шунта, напряж_шунта, макcнапряж, максток
 

 

 

то есть все таки либа от Adafruit "заточена" на R100?

я поиском прошелся по cpp и хедер файлу на слово shunt

ничего внятного не нашел, только закомментированные строки.

 

а что за другая либа, которую можно использовать?

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

d00m пишет:

а что за другая либа, которую можно использовать?

Вот

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

rkit пишет:

nik182 пишет:

3 микроампера. Где такому току взяться как не из наводки по воздуху?

Может не надо фантазировать, ага? Цифра для наводок на пяток децибелл меньше.

Это просто ошибка измерения, вполне в пределах описанной в даташите.

Давай ты будешь отвечать за свои слова? Обоснуй пяток децибелл? Знаешь напряженность электрического поля в месте где лежит плата? 

d00m
Offline
Зарегистрирован: 21.02.2013

ua6em пишет:

d00m пишет:

а что за другая либа, которую можно использовать?

Вот

спасибо. теперь надо понять как ею пользоваться)

 

но меня еще другой вопрос беспокоит все таки - - есть ли связь между номиналом шунта на плате INA219 и либой из https://github.com/adafruit/Adafruit_INA219?
он там как-то захардкоджен или нет?

а то на всех фотках R100, а у меня R010 и какието странные значения получаю для getShuntVoltage_mV();

 

sadman41
Offline
Зарегистрирован: 19.10.2016

d00m пишет:

https://github.com/adafruit/Adafruit_INA219?

он там как-то захардкоджен или нет?

Кофсиенты посчитаны унутре под 100 ом. И написано, как их пересчитать под другой шунт.
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

d00m пишет:

ua6em пишет:

d00m пишет:

а что за другая либа, которую можно использовать?

Вот

спасибо. теперь надо понять как ею пользоваться)

Data_ina219=ina219.shuntCurrent() * 1000; 
Voltage_ina219 = ina219.busVoltage();

 

rkit
Offline
Зарегистрирован: 23.11.2016

d00m пишет:

я просто не пойму - должно ли в моем случае выводиться 0, или все таки проблема в том, что другой шунт стоит?

Не должно. Любой прибор содержит в себе неточности. Цифра в 30мкВ в пределах заявленной производителем ошибки.

d00m
Offline
Зарегистрирован: 21.02.2013

sadman41 пишет:

d00m пишет:

https://github.com/adafruit/Adafruit_INA219?

он там как-то захардкоджен или нет?

Кофсиенты посчитаны унутре под 100 ом. И написано, как их пересчитать под другой шунт.

спасибо, я вижу там куча коментов есть.

но я не пойму - почему там есть НЕСКОЛЬКО функций для калибровки.

как этим нужно пользоваться? нужно вызывать функцию в начале своей программы для инициализации модуля в нужном режиме?

и в моем случае нужно создать новую или подправить существующую функцию под номинал моего шунта?

но все это было бы понятно если бы в этом руководстве, что я нашел:

https://openhomeautomation.net/power-monitoring-arduino-ina219

в примерах кода были такие вызовы функций setCalibration 

но их там нет.. то есть не понятно как выбирается дефолтная калибровка..

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

но почему тогда они не используют их.

ничего не понятно пока..

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

Поэтому я и использовал библиотеки, где всё понятно, у фрута если мне не изменяет память всего три тимплета

да и DIMAX в начале темы пишет:

В инете для этого чипа можно найти 2 библиотеки под ардуино, одна от adafruit -неплохая, но в ней нет возможности что-то настроить под свои нужды, даже элементарно сопротивление шунта не изменить. И вторая, более-менее полноценная http://www.johngineer.com/blog/?p=1178, в ней уже можно почти всё настроить, правда авторы библы поленились все это описать.

Иван_
Offline
Зарегистрирован: 23.02.2018

Робяты уважаемый dimax уже все давно написал читайте внимательно форум. Не нужны здесь библиотеки.

void setup() {
  
 }

void loop()
{

   int busvolt = ina219_read(0x02); 
   int Padenie_V_Synt = ina219_read(0x01);
   busvolt >>=3;// избавится от лишних (вышеописанных) информационных бит. Стр.30 даташита 

  }
}

// функция записи в конфигурационные регистры INA219
 void ina219_write(byte adr, int cfg) {
Wire.beginTransmission(0x40);
Wire.write(adr);
Wire.write((cfg >> 8) & 0xFF);       
Wire.write(cfg & 0xFF);              
Wire.endTransmission();
}  
  
//функция чтения данных из регистров INA219
int ina219_read(byte adr) {  
Wire.beginTransmission(0x40);
Wire.write(adr);
Wire.endTransmission();
Wire.requestFrom(0x40,2);
int value = ((Wire.read() << 8) | Wire.read());
return value;
} 

 

Как-то так код выдернул  из рабочего примера может что и обрезал невзначай. Один попугай падения напряжения на шунте равно 10 микровольт. Но это по памяти все работает четко и точно шунты  можете перепаивать на любые в зависимости от того какие токи измеряете.

d00m
Offline
Зарегистрирован: 21.02.2013

Иван_ пишет:

Робяты уважаемый dimax уже все давно написал читайте внимательно форум. Не нужны здесь библиотеки.

void setup() {
  
 }

void loop()
{

   int busvolt = ina219_read(0x02); 
   int Padenie_V_Synt = ina219_read(0x01);
   busvolt >>=3;// избавится от лишних (вышеописанных) информационных бит. Стр.30 даташита 

  }
}

// функция записи в конфигурационные регистры INA219
 void ina219_write(byte adr, int cfg) {
Wire.beginTransmission(0x40);
Wire.write(adr);
Wire.write((cfg >> 8) & 0xFF);       
Wire.write(cfg & 0xFF);              
Wire.endTransmission();
}  
  
//функция чтения данных из регистров INA219
int ina219_read(byte adr) {  
Wire.beginTransmission(0x40);
Wire.write(adr);
Wire.endTransmission();
Wire.requestFrom(0x40,2);
int value = ((Wire.read() << 8) | Wire.read());
return value;
} 

 

Как-то так код выдернул  из рабочего примера может что и обрезал невзначай. Один попугай падения напряжения на шунте равно 10 микровольт. Но это по памяти все работает четко и точно шунты  можете перепаивать на любые в зависимости от того какие токи измеряете.

 

в первом сообщении от dimax в пр имере кода есть 

02 #include <ina219.h>
 

я вашего примера я не нахожу..

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

какойто тестовый пример..

мне показался удачным вариантом для проверки - функция getShuntVoltage_mV();

из библиотеки Adafruit

я так понял она проверяет напряжение на бортовом шунте.

но в моем случае, при правильном подключении, на вывод поступают странные значения(выше есть)

но в итоге - мне нужно измерять напряжение с шины (4-20mA) с промышленного датчика - анемометра.

вот ссылка на его описание

http://s.campbellsci.com/documents/ca/manuals/05103l_man.pdf

на 4 странице есть схема - вот мне нужно ВМЕСТО Measuring instrument получить данные с датчика в код ардуино.

вот и хочу проверить как их снимать их оттуда через INA219.

но для начала - надо понять, почему такие странные значения получаю на шунте..

 

d00m
Offline
Зарегистрирован: 21.02.2013

ua6em пишет:

Поэтому я и использовал библиотеки, где всё понятно, у фрута если мне не изменяет память всего три тимплета

да и DIMAX в начале темы пишет:

В инете для этого чипа можно найти 2 библиотеки под ардуино, одна от adafruit -неплохая, но в ней нет возможности что-то настроить под свои нужды, даже элементарно сопротивление шунта не изменить. И вторая, более-менее полноценная http://www.johngineer.com/blog/?p=1178, в ней уже можно почти всё настроить, правда авторы библы поленились все это описать.

угу..читал. кстати второй линк дает 404.. не нашел ничего и в гугле.

но основной вопрос у меня - значит можно забить на adafruit либу раз у меня стоит не R100, а R010?

я правильно понял?

если так - буду сразу проверять ваш вариант.

 

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

Можно не забивать. Полученный результат можно помножить на 10 и получить точный ответ.

Иван_
Offline
Зарегистрирован: 23.02.2018

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

Приведенный мной код это в принципе его код приведенный им в 2 темах я в принципе собрал только все в кучу.

Поясняю код если кому то надо int Padenie_V_Synt зная величину падения и сопротивление шунта по закону Ома находим ток протекающий в шунте (одна единица Padenie_V_Synt равна 10 микровольт).

вывод напряжения в цепи dataFile.print("Напряжение   " );  dataFile.print(busvolt*4); dataFile.println("mV"); 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вопрос не в чтении, а в формировании правильного конфигурационного байта. Библиотеки именно этим и занимаются. А так-то да - один раз посчитать и потом оперировать сенсором.

Иван_
Offline
Зарегистрирован: 23.02.2018

Так и не надо ничего формировать код используя значения по умолчанию (а они фактически максимальные из возможных)  все считает сам с максимальным разрешением. Смотрите даташид значения по умолчанию.

d00m
Offline
Зарегистрирован: 21.02.2013

Иван_ пишет:

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

Приведенный мной код это в принципе его код приведенный им в 2 темах я в принципе собрал только все в кучу.

Поясняю код если кому то надо int Padenie_V_Synt зная величину падения и сопротивление шунта по закону Ома находим ток протекающий в шунте (одна единица Padenie_V_Synt равна 10 микровольт).

вывод напряжения в цепи dataFile.print("Напряжение   " );  dataFile.print(busvolt*4); dataFile.println("mV"); 

 

увы, ваш код совем не понятен, даже после этих объяснений..

в лупе у вас вызывается только ina219_read

но сам код содержит объвление ina219_write

когда и зачем ее нужно использовать - не ясно.

но главное это "Wire."

что это за объект? откуда он? видимо прощен какойто include.. #include <OneWire.h> может быть?

хотя врядли, там же I2С 

короче надо читать тему еще раз.

ибо вопрос прежний - "почему у меня такой разброс значений при измерении на шунте?"

или так и должно быть?

 

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

тут далеко не у всех уровень познаний DIMAX, проще с либой, что я привёл, фрутовскую правил под требуемые мне параметры, не одолел )))
Хочется простоты использования и красивостей, а это использование библиотеки

d00m
Offline
Зарегистрирован: 21.02.2013

ua6em пишет:

тут далеко не у всех уровень познаний DIMAX, проще с либой, что я привёл, фрутовскую правил под требуемые мне параметры, не одолел )))
Хочется простоты использования и красивостей, а это использование библиотеки

при использовании вашей библиотеки нужно делать begin, configure как вот тут? :

https://github.com/RG22EM/ua6em/blob/master/mishin.ino#L258

если можете - покажите пример как ее использовать в простейшем случае..

 

upd:

вероятно в моем случае ina219.begin(0x44);

надо менять на ina219.begin(0x40);

так как у меня по идее дефолтный адрес - я никакие перемычки на плате не запаивал для изменения адреса.

но вот что делать с калибровкой..

upd2:

// calibration of equations and device
// shunt_val = value of shunt in Ohms
// v_shunt_max = maximum value of voltage across shunt
// v_bus_max = maximum voltage of bus
// i_max_expected = maximum current draw of bus + shunt
// default values are for a 0.25 Ohm shunt on a 5V bus with max current of 1A

 

void INA219::calibrate(float shunt_val, float v_shunt_max, float v_bus_max, float i_max_expected)

у меня на шунте написано R010 - полагаю это и будет 0.1ом

напряжение, которое подается на датчик - 24 вольта.

но в документации указан только ток на выходе - минимально из моего датчика приходит 4mA, максимально - 20mA

как же калибровать правильно?

Kolev
Offline
Зарегистрирован: 11.12.2019

d00m пишет:

у меня на шунте написано R010 - полагаю это и будет 0.1ом

0,01 Ом

d00m
Offline
Зарегистрирован: 21.02.2013

Kolev пишет:

d00m пишет:

у меня на шунте написано R010 - полагаю это и будет 0.1ом

0,01 Ом

 

дада.. уже понял. для шунта нужно указывать 0.01 

но остальное то как вычислить.

 

 

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

посмотрите мои параметры, Дмитрия, всё же понятно, код закомментирован достаточно

monitor.begin(64); // i2c address 64=0x40
 monitor.configure(0, 2, 11, 11, 7);
// range, gain, bus_adc, shunt_adc, mode
// range = 1 (0-32V bus voltage range)
// gain = 3 (1/8 gain - 320mV range)
// bus adc = 3 (12-bit, single sample, 532uS conversion time)
// shunt adc = 3 (12-bit, single sample, 532uS conversion time)
// mode = 7 (continuous conversion)
  monitor.calibrate(0.065, 0.16, 16, 2); 
 //R_шунта, напряж_шунта, макcнапряж, максток
ina219.begin(0x44); // (44) i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
 ina219.configure(0, 2, 12, 12, 7); // 16S -8.51ms
// monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
// monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
// monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
// monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
// monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms
// monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms
// monitor.configure(0, 2, 8, 8, 7);
                          // range, gain, bus_adc, shunt_adc, mode
                          // range = 1 (0-32V bus voltage range)
                          // gain = 3 (1/8 gain - 320mV range)
                          // bus adc = 3 (12-bit, single sample, 532uS conversion time)
                          // shunt adc = 3 (12-bit, single sample, 532uS conversion time)
                          // mode = 7 (continuous conversion)

 ina219.calibrate(0.100, 0.32, 16, 3.2); 
               // R_шунта, напряж_шунта, макcнапряж, максток

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

d00m
Offline
Зарегистрирован: 21.02.2013

так

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

по идее INA219 это тоже умеет делать.

границы тока от 4 до 20мА

 

Иван_
Offline
Зарегистрирован: 23.02.2018

Измерять такие токи INA219 милое дело перепаяйте шут на 10 Ом  это повысит падение напряжения на нем а стало быть точность измерений так как токи весьма маленькие. Но вроде по памяти падение напряжения не должно превышать 800 мв (дальше плата просто не считает при ваших токах это превышение недолжно произойти). В случае с шунтом 10 Ом  вам даже ничего перещитывать не надо по закону Ома в переменной Padenie_V_Synt = ina219_read(0x01) будет ток который вы хотите измерить. 

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

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

d00m
Offline
Зарегистрирован: 21.02.2013

перепаивать шунт надо обязательно?

я пока проверяю на текущем шунте и с 

  ina219.calibrate(0.0100.32323.2); 

получаю какие-то очень странные значения..

Communication test with with INA219 ...
v_bus_max:	32.00000000
v_shunt_max:	0.31999998
i_max_possible:	32.00000000
i_max_expected: 3.20000004
min_lsb:	0.000097659225
max_lsb:	0.000781250000
current_lsb:	0.000097659988
power_lsb:	0.00195320
  
cal:		41941
r_shunt:	0.01
V = -8.68, A = 12
V = -8.68, A = 12
V = -8.68, A = 12
V = -8.68, A = 13
V = -8.68, A = 11
V = -8.68, A = 12
V = -8.68, A = 11
V = -8.68, A = 9
V = -8.68, A = 11
V = -8.68, A = 11
V = -8.68, A = 11
V = -8.69, A = 12
V = -8.68, A = 11
V = -8.68, A = 12
V = -8.68, A = 12
V = -8.68, A = 9
V = -8.68, A = 12
V = -8.68, A = 9
V = -8.68, A = 12

 

подключено все точно так как на этой картинке (только у меня Arduino, а не Raspberry)

на вход подается 24в с DC-DC бустера XL6009

GND общий у всех.

если измерять обычным мультиметром - то ток в этих точках подключения INA219 - 4mA стабильно.

а код мне пишет какието разные значение.

#include <Arduino.h>

#include <INA219.h>
INA219 ina219;
unsigned int Data_ina219 = 0;
volatile float Voltage_ina219 = 0;

void setup() {
Serial.begin(9600);
  Serial.println("Communication test with with INA219 ...");
  //ina219.begin(0x44); // (44) i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
  ina219.begin(0x40);
 
 //ina219.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
 // monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
 // monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
 // monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms
 // monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms
 // monitor.configure(0, 2, 8, 8, 7);
                           // range, gain, bus_adc, shunt_adc, mode
                           // range = 1 (0-32V bus voltage range)
                           // gain = 3 (1/8 gain - 320mV range)
                           // bus adc = 3 (12-bit, single sample, 532uS conversion time)
                           // shunt adc = 3 (12-bit, single sample, 532uS conversion time)
                           // mode = 7 (continuous conversion)

  //ina219.calibrate(0.010, 0.32, 16, 3.2); 
  ina219.calibrate(0.010, 0.32, 32, 3.2); 
                // R_шунта, напряж_шунта, макcнапряж, максток
//R100 - 0.1 ohm
//R010 - 0.01 ohm

}
void loop() {
  Data_ina219=ina219.shuntCurrent() * 1000;
  Voltage_ina219 = ina219.busVoltage();
   //Serial.println();
   Serial.print("V = "); Serial.print( Voltage_ina219,2);
   Serial.print(", A = "); Serial.println(Data_ina219);
   //Serial.println();
   /**/

}

 

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

ну и напряжение тоже странное.

что я сделал не так. подскажите плиз.

 

Иван_
Offline
Зарегистрирован: 23.02.2018

С библиотеками я не работал так- как так и не понял что там за коэффициенты и за что они отвечают и что там вообще наворочено. Перепайка шунта нужна для более точного измерения проходящего тока INNA219 измеряет разницу напряжений до шунта и после шунта относительно земли. Чем меньше шунт тем меньше разница тем сложней её оценить. Я не совсем понимаю если в чем сложность если у вас цепь собрана залить приведенную мной программу и посмотреть что она покажет. Не хотите перепаивать шунт проверьте на том что есть только пересчитайте значения по закону Ома. Я решал задачу аналогичную вашей только токи еще меньше. Средняя разница с обычным бытовым аперметром состовляла примерно 4-5 микро ампер. У меня качестве шунта припаяно советское военное сопротивление на 10 Ом повышенного класса точности. По схеме вроде все правильно если есть еще одна плата INNA219  проверьте что ана показывает.

d00m
Offline
Зарегистрирован: 21.02.2013

dimax пишет:

jeka_tm,  я уже детали стал подзабывать, но кажется макс. измеряемое напряжение действительно ни на что не влияет. Там 2 варианта допустимы 16 или 32.   Ток и напряжение шунта -да, максимальные. Причём напряжение шунта ставятся не от балды, а  выбирается из нескольких вариантов по даташиту.

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

http://arduino.ru/forum/apparatnye-voprosy/mini-obzor-monitora-toka-ina219-s-vykhodom-i2c?page=3#comment-504311

 

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

>напряжение шунта ставятся не от балды, а  выбирается из нескольких вариантов по даташиту.

 

у меня модуль INA219 должен измерять ток от 4 до 20мА на выходе устройства.

устройство - анемометр, генерит ток в этом диапазоне и мне нужно мониторить его. желательно с шагом в 0.00016А - это 1 м/с

  // 4 - 20 mA
  // 0 - 100 m/s
  // 1 m/s == 0.16 mA == 0.00016 A
  // 0.1 m/s == 0.016 mA == 0.004v

штатный шунт был R010, но я перепаял его на 1% резистор 10ом.

получается что для калибровки надо использовать:

  ina219.calibrate(10, X, Y, Z); 
                      // R_шунта, напряж_шунта, макcнапряж, максток

где 

X - его нужно ВЫЧИСЛИТЬ или все таки выбрать в даташите? я пока не вижу в даташите ничего, что может мне помочь. более того - нумерация страниц ДШ похоже уже не соответствует комментариям в коде на 1 странице темы.

http://www.ti.com/lit/ds/symlink/ina219.pdf

Y - я так понял этот парметр может быть или 16 или 32 и судя по коду в библиотеке https://github.com/RG22EM/ua6em

этот параметр не исльзуется в вычислениях.

Z - это максимальный ток, в моем случае, полагаю это 20мА

и если ВЫЧИСЛЯТЬ X - напряжение шунта, то выходит X === 20mA*10 == 0.02*10 == 0.2v?

и значит:

  ina219.calibrate(10, 0.2, 32, 0.2); 
                      // R_шунта, напряж_шунта, макcнапряж, максток

 

но и тут непонятки - функция вычисления тока, судя по коменту - выводит значение в Амперах.

// returns the shunt current in amps
float INA219::shuntCurrent()
{
  return (read16(I_SHUNT_R) * current_lsb);
}

 

но в 1 сообщении темы:

lcd.print(monitor.shuntCurrent() * 1000,0); lcd.print("mA");
 

значение умножается на 1000 и это почемуто миллиамперы!

у меня же почемуто код в лупе:

unsigned int Data_ina219_A = 0;

void loop() {

  Data_ina219_A = ina219.shuntCurrent() * 1000;
  Serial.print(", A = "); Serial.print( Data_ina219_A, 12 );

выводит:  A = 4

что вероятно похоже на 0м/c так как ветряк анемометра не крутится.

если крутануть сильно получаю  A = 5

поменял тим переменной на volatile float Data_ina219_A = 0;

получаю
 
A = 0.004124249935
A = 0.004124249935
A = 0.004124249935
A = 0.004124249935
A = 0.004118140220
A = 0.004130359649
A = 0.004124249935
 
так все таки - в каких единицах вычисляется ток в это функции?
и какие страницы даташита надо смотреть чтобы использовать код из 6 сообщения темы?

 

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

Посмотри в мануале параметр Full-ScaleSenseVoltage. Это максимальное напряжение между входами +- . Резистор шунта должен быть таким, чтобы при максимальном измеряемом токе падение напряжения на шунте его не превосходило . 

d00m
Offline
Зарегистрирован: 21.02.2013

nik182 пишет:

Посмотри в мануале параметр Full-ScaleSenseVoltage. Это максимальное напряжение между входами +- . Резистор шунта должен быть таким, чтобы при максимальном измеряемом токе падение напряжения на шунте его не превосходило . 

спасибо, но зачем мне это макс напряжение?

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

у меня резистор счас 10ом. макс измеряемый ток должен быть не больеш 20мА.

по закону ома напряжение на шунте при этом будет 0.2в

и эти 0.2в не должны быть больше чем Full-ScaleSenseVoltage? это как-то можно настроить в коде?

если все так и я все правильно понимаю до этого момента то:

0.2в == 200мв

судя по коду библиотеки:

https://github.com/RG22EM/ua6em/blob/master/INA219.cpp#L97

в дефолтной конфигурации этот параметр у меня 320мв, что удовлетворяет условию.

так?

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

откуда напряжение шунта 0,2? оно может быть только 40, 80, 160 или 320 милливольт, это напряжение задаёт режим работы (усиление) операционника

d00m
Offline
Зарегистрирован: 21.02.2013

ua6em пишет:

откуда напряжение шунта 0,2? оно может быть только 40, 80, 160 или 320 милливольт, это напряжение задаёт режим работы (усиление) операционника

 

спасибо, но где это указано?

вот старая pdf с даташитом:

https://cdn-shop.adafruit.com/datasheets/ina219.pdf

я думал, что значения 40, 80 и т.д. - это значения с 26 страницы - параметр RANGE - для функции void INA219::configure

https://github.com/RG22EM/ua6em/blob/master/INA219.cpp#L94

 

но выходит и в функцию калибровки надо задавать (ВЫБИРАТЬ) эти значения тоже?

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

 

а 0.2 у меня получилось просто же - макс ток у меня 20мА, шунт - 10ом

вот и макс. напряжение на шунте == 20мА*10 == 0.02*10 == 0.2в

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
  INA-219      
U_шунт 0,04 0,08 0,16 0,32
R_шунт 10 10 10 10
I_max 0,004 0,008 0,016 0,032
         
U_шунт 0,04 0,08 0,16 0,32
R_шунт 1 1 1 1
I_max 0,04 0,08 0,16 0,32
         
U_шунт 0,04 0,08 0,16 0,32
R_шунт 0,1 0,1 0,1 0,1
I_max 0,4 0,8 1,6 3,2
         
U_шунт 0,04 0,08 0,16 0,32
R_шунт 0,01 0,01 0,01 0,01
I_max 4 8 16 32
         
U_шунт 0,04 0,08 0,16 0,32
R_шунт 2 4 8 16
I_max 0,02 0,02 0,02 0,02
         

 

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

Следующий шаг. 0.2 вольта. Т.е. работать можем только на пределе 320 мВ. , т.е максимальный ток 32 мА. Т.е максимальное выходное значение соответствует 32 мА. Простой пропорций можете посчитать, какое выходное значение  в цифре будет для любого друго тока и наооборот. Зачем калибровка? Прямой расчёт. 

d00m
Offline
Зарегистрирован: 21.02.2013

nik182 пишет:

Следующий шаг. 0.2 вольта. Т.е. работать можем только на пределе 320 мВ. , т.е максимальный ток 32 мА. Т.е максимальное выходное значение соответствует 32 мА. Простой пропорций можете посчитать, какое выходное значение  в цифре будет для любого друго тока и наооборот. Зачем калибровка? Прямой расчёт. 

совсем я запутался.. 

значит и калибровку не нужно вызывать в коде?

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

или я не понимаю как они связаны.

 

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

nik182 пишет:

Следующий шаг. 0.2 вольта. Т.е. работать можем только на пределе 320 мВ. , т.е максимальный ток 32 мА. Т.е максимальное выходное значение соответствует 32 мА. Простой пропорций можете посчитать, какое выходное значение  в цифре будет для любого друго тока и наооборот. Зачем калибровка? Прямой расчёт. 

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

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

откуда напряжение шунта 0,2? оно может быть только 40, 80, 160 или 320 милливольт

Нет там такого. Если сами не понимаете - не путайте человека.

 

2 ALL - не ясно, что вы вообще обсуждаете в теме. Принцип измерения максимально прост - операционник измеряет падение напряжения на шунте. Какой там стоит шунт - для самой микросхемы не имеет ни малейшего значения, его сопротивление можно вообще нигде не указывать, получаете с чипа напряжение и вычисляете ток сами по закону Ома.

d00m
Offline
Зарегистрирован: 21.02.2013

ua6em пишет:

nik182 пишет:

Следующий шаг. 0.2 вольта. Т.е. работать можем только на пределе 320 мВ. , т.е максимальный ток 32 мА. Т.е максимальное выходное значение соответствует 32 мА. Простой пропорций можете посчитать, какое выходное значение  в цифре будет для любого друго тока и наооборот. Зачем калибровка? Прямой расчёт. 

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

 

ну вот нижняя табличка мне понятна. 

например если использовать шунт в 2ома - то для калибровки нужно указывать 

 
  ina219.calibrate(2, 0.04, 32, 0.02); 
                // R_шунта, напряж_шунта, макcнапряж, максток
 
так?
 
b707
Offline
Зарегистрирован: 26.05.2017

d00m пишет:

совсем я запутался.. 

значит и калибровку не нужно вызывать в коде?

 

все очень просто. Можно получать от ИНА только напряжение, а ток считать самому. Тогда сопротивление шунта не важно и калибровка не нужна.

Если вы хотите получать от ИНА219 готовое значение тока - то тогда нужно перенастраивать библиотеку на свой шунт и проводить калибровку.

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

b707 пишет:

ua6em пишет:

откуда напряжение шунта 0,2? оно может быть только 40, 80, 160 или 320 милливольт

Нет там такого. Если сами не понимаете - не путайте человека.

страница 19 даташита, в табличке выше я привёл значения максимального тока при выбранном им сопротивлении шунта и сопротивление шунта для тока в 20 миллиампер при любом допустимом значении усиления

b707
Offline
Зарегистрирован: 26.05.2017

ua6em - я имею в виду, что напряжение на шунте может быть любым, а не "только 40, 80, 160 или 320 милливольт". как это по ошибке написано у вас

d00m
Offline
Зарегистрирован: 21.02.2013

b707 пишет:

d00m пишет:

совсем я запутался.. 

значит и калибровку не нужно вызывать в коде?

 

все очень просто. Можно получать от ИНА только напряжение, а ток считать самому. Тогда сопротивление шунта не важно и калибровка не нужна.

Если вы хотите получать от ИНА219 готовое значение тока - то тогда нужно перенастраивать библиотеку на свой шунт и проводить калибровку.

 

мне нужно получать ток, как как устройство мое - анемометр, гарантированно дает на выход измерительного блока только ток в диапазоне 4-20мА (это какойто индустриальный стандарт)

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

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

но зачем менять код в самой библиотеке?

ведь есть функция калибровки и конфигурирования, разве ими нельзя указать мои диапазоны измерения?

именно в этом мой вопрос. я читал тему с самого начала и даже Dimax указывал:

http://arduino.ru/forum/apparatnye-voprosy/mini-obzor-monitora-toka-ina219-s-vykhodom-i2c#comment-208810

что для функции калибровки, второй параметр - напряж_шунта 

по идее - ВЫЧИСЛЯЕТСЯ, а не ВЫБИРАЕТСЯ из даташита, тем более из этих 4 вариантов - 40, 80, 160 и 320..

но тут камрад говорит иное.. и это меня сбивет с толку.

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

10ом взял для проверки, так как штатный шунт R010 - 10мОм - вообще был неподходящий.