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

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

sadman41 пишет:

Если точно указание адреса в бегин не работает, то сделайте в INA219.h так:

void begin(uint8_t addr);

Вместо

void begin(uint8_t addr = D_I2C_ADDRESS);

или -

void begin(uint8_t D_I2C_ADDRESS = addr);

???
мы жеж на дефолтный адрес должны присваивать а передаваемый???
Как сложно с энтим СИ )))

 

ЗЫ пытаюсь понять, чтио не так
 

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

Не знаю, что вас там путает, но я скачал вашу библиотеку, воткнул в INA219::write16(uint8_t a, uint16_t d) вот такое:

  Serial.print(" (**I2C Address: "); 
  Serial.print(i2c_address);
  Serial.print("**)");

В ina219_test.ino заменил monitor.begin(64); на  monitor.begin(68); и получил в сериал мониторе это:

******************<
raw shunt voltage:  (**I2C Address: 68**)-1
raw bus voltage:    (**I2C Address: 68**)-1
--
shunt voltage:  (**I2C Address: 68**)-0.0100 mV
shunt current:  (**I2C Address: 68**)-0.0076 mA
bus voltage:    (**I2C Address: 68**)-0.0040 V
bus power:      (**I2C Address: 68**)-0.1526 mW

Так что всё там срабатывает вполне успешно - I2C-трансмиссия работает с адресом из begin();

 

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

sadman41 пишет:

Не знаю, что вас там путает, но я скачал вашу библиотеку, воткнул в INA219::write16(uint8_t a, uint16_t d) вот такое:

  Serial.print(" (**I2C Address: "); 
  Serial.print(i2c_address);
  Serial.print("**)");

В ina219_test.ino заменил monitor.begin(64); на  monitor.begin(68); и получил в сериал мониторе это:

******************<
raw shunt voltage:  (**I2C Address: 68**)-1
raw bus voltage:    (**I2C Address: 68**)-1
--
shunt voltage:  (**I2C Address: 68**)-0.0100 mV
shunt current:  (**I2C Address: 68**)-0.0076 mA
bus voltage:    (**I2C Address: 68**)-0.0040 V
bus power:      (**I2C Address: 68**)-0.1526 mW

Так что всё там срабатывает вполне успешно - I2C-трансмиссия работает с адресом из begin();

 

у меня как раз 68 и не срабатывал, есть подозрение на неисправность в самой ina219, буду проверять

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

Хочу испросить у экспериментаторов - если сказать сенсору, что его ждет 16V, а дать 32V - это только к установке определенного бита и искажению значения приведет, ничего не воспылает синим пламенем? Датчик один на руках, сжечь не хочу, а десяток покупать нет надобности...

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

До 26В, не стоит больше давать

step64
Offline
Зарегистрирован: 01.04.2013

Кто подскажет до какой максимальной частоты ток инка219 может мерить, до 0,5 МГц осилит без плясок с бубном?

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

step64 пишет:

Кто подскажет до какой максимальной частоты ток инка219 может мерить, до 0,5 МГц осилит без плясок с бубном?

Что имеется в виду - частота опроса? - 7 КГц максимум

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

step64 пишет:

Кто подскажет до какой максимальной частоты ток инка219 может мерить, до 0,5 МГц осилит без плясок с бубном?

осилит и больше если в диагональ моста поставить

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

step64 пишет:

Кто подскажет до какой максимальной частоты ток инка219 может мерить, до 0,5 МГц осилит без плясок с бубном?

Если нужно TrueRMS то не осилит. А если среднее, то хоть 100Мгц.

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

asam пишет:

step64 пишет:

Кто подскажет до какой максимальной частоты ток инка219 может мерить, до 0,5 МГц осилит без плясок с бубном?

Если нужно TrueRMS то не осилит. А если среднее, то хоть 100Мгц.

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

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

а усреднять-то кто будет?

мужики, вы так уверенно рассуждаете...

Посмотрите Figure 1 в даташите.

Как раз на сотнях мегагерц она может и будет выдавать средний, а вот на сотнях КГц,  про которые спрашивает step64 - может получится полная фигня

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

b707 пишет:

а усреднять-то кто будет?

мужики, вы так уверенно рассуждаете...

Посмотрите Figure 1 в даташите.

Как раз на сотнях мегагерц она может и будет выдавать средний, а вот на сотнях КГц,  про которые спрашивает step64 - может получится полная фигня

  monitor.begin(0x44); // i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
 // 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)
   monitor.calibrate(0.100, 0.32, 16, 3.2); 
                           // R_шунта, напряж_шунта, макcнапряж, максток

 

step64
Offline
Зарегистрирован: 01.04.2013

Ещё пару вопрос,

1) В даташите написано что это Zerø-Drift, Bi-Directional CURRENT/POWER MONITOR with I 2 C Interface. Получается она переменку может мерить как acs712, только выход в цифре? 

2) По схеме ниже можно на +Vin подать 310, напряжение естественно не мерить ей и ток больше 3А не давать, по идее напряг на ней будет равен только падению на шунте - миллиВольты?

 

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

step64 пишет:

Ещё пару вопрос,

1) В даташите написано что это Zerø-Drift, Bi-Directional CURRENT/POWER MONITOR with I 2 C Interface. Получается она переменку может мерить как acs712, только выход в цифре? 

2) По схеме ниже можно на +Vin подать 310, напряжение естественно не мерить ей и ток больше 3А не давать, по идее напряг на ней будет равен только падению на шунте - миллиВольты?

 

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

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

step64, на входах  этих чипов не должно быть более 26 вольт относительно их земли. Можно обойтись без земли,  поскольку тут trueDiff  вход, при условии гальванически развязанной земли питания чипа и земли нагрузки можно подать более 26 вольт, но такое подключение недокументировано и опасно, если речь идёт о многократном превышении.

PS: Для измерения тока сетевого напряжения нет ничего лучше обычного трансформатора тока.

grafalex
Offline
Зарегистрирован: 18.11.2018

Ребята, 

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

А если за время между измерениями случился всплеск потребления и я его проворонил? Как в таком случае быть?

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

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

У msp430 серии fg есть контроллеры заточенные под счётчик электроэнергии. Со всеми входными усилителями и сигма-дельта АЦП. На них строят цифровые счётчики. Можно с них считывать ардуиной. Вот только зачем. 

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

grafalex пишет:

А если за время между измерениями случился всплеск потребления и я его проворонил? Как в таком случае быть?

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

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

b707 пишет:

grafalex пишет:

А если за время между измерениями случился всплеск потребления и я его проворонил? Как в таком случае быть?

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

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

/ monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms

 

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

dimax вот дошли руки, но что то какая то проблема: 3 из 4 библиотек не хотят измерять напряжение выше 16В, показывают отрицательные значения. Только от адафрут нормально измеряет, но нет нужных настроек. Может у тебя есть нормальная библиотека с возможностью измерения выше 16В?

Вот например при 16В:

******************
raw shunt voltage: 1
raw bus voltage:   32026
--
shunt voltage: 0.030 mV
shunt current: 2.442 mA
bus voltage:   16.0120 V
bus power:     18.311 mW

А вот 17В

******************
raw shunt voltage: 2
raw bus voltage:   -31478
--
shunt voltage: 0.030 mV
shunt current: 2.442 mA
bus voltage:   -15.7400 V
bus power:     61.038 mW

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Обратите внимание, что -31478 в бинаре 1000010100001010 ,  также это 34026, что соответствует 17 вольтам :) Вы raw bus voltage в переменную какой размерности грузите ?

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

сейчас найду ту либу. я уже удалил

подшаманил адафрут либу, хоть работать стало, но как то коряво. по расчетам ina219_currentDivider_mA = 25; а должно быть 2.5. Но 2.5 нельзя передать, поэтому передаю 25, а потом домножаю при выводе.

А вот эти манипуляции с током привели что мощность неправильно считается. ina219_powerMultiplier_mW = 8; это максимально близко к реальному. потом проверю на больших мощностях, если что мощность сам буду считать

Bus Voltage:   25.02 V
Shunt Voltage: 3.29 mV
Load Voltage:  25.02 V
Current:       263.20 mA
Power:         6576.00 mW

 

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

brokly пишет:

Обратите внимание, что -31478 в бинаре 1000010100001010 ,  также это 34026, что соответствует 17 вольтам :) Вы raw bus voltage в переменную какой размерности грузите ?

должна быть флоат

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
Serial.print(ina.readBusVoltage(), 3);

запись подобная. да там флоат. и кстати при выводе на дисплей, я флоат домножаю на 1000 записывают в unsigned long и вывожу по цифрами. а там 17 выводится как 51))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

В адафрутовской либе 

int16_t Adafruit_INA219::getPower_raw() {
  uint16_t value;
  wireReadRegister(INA219_REG_POWER, &value);
  return (int16_t)value;
}

Ошибка в том, что данные INA отдает в беззнаковом формате, а потом, зачем то пропихивает его в INT, а дальше еще хуже во флот. В первой и четвертой строке нужно int16_t заменить на uint16_t. И так видимо во всех процедурах. Тогда все должно быть ок. Но это догадки. И они, похоже не верны, поскольку в даташите говорят о знаке, а значит в библиотеке все правильно.

А вот настройки наводят на размышление:

  void setCalibration_32V_2A(void);
  void setCalibration_32V_1A(void);
  void setCalibration_16V_400mA(void);

Вы каким диапазоном пользуетесь ?

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

Спасибо. Завтра попробую. Я пользуюсь 32_10. переделал из 32_1

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А как вы переделали ? Уменьшили сопротивление шунта в 10 раз ? Или как то по другому ?

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

шунт у меня 0,0125. пересчитывал, там в либе инструкция есть как считать

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Очень похоже что ошиблись, отсюда и переполнение инта. Напишите что у вас получилось ?

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

Завтра напишу. Уже спать лег. Я только сейчас вспомнил у меня шунт 0.002, хз откуда я взял эти 0.0125. Завтра проверю

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

INA либы все, похоже, кривые. Причем дело именно размерности переменных. Я в либе для INA226 столкнулся с тем, что авторы не предполагали измерение токов выше 20А. Как выяснилось, если задать сопротивления шунта для диапазона 20А и выше - в процедуре калиброки происходит переполнение переменной типа uint16t и данные считаются неверно. Поменял тип на uint32 - ошибка, как и ожидалось, пропала.

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

b707 пишет:

INA либы все, похоже, кривые. Причем дело именно размерности переменных. Я в либе для INA226 столкнулся с тем, что авторы не предполагали измерение токов выше 20А. Как выяснилось, если задать сопротивления шунта для диапазона 20А и выше - в процедуре калиброки происходит переполнение переменной типа uint16t и данные считаются неверно. Поменял тип на uint32 - ошибка, как и ожидалось, пропала.

Взялся кто-нибудь из знающих переписать библиотеку исправив все косяки

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

jeka_tm пишет:

dimax вот дошли руки, но что то какая то проблема: 3 из 4 библиотек не хотят измерять напряжение выше 16В, показывают отрицательные значения.

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

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

Я мне одна либа понравилась. Ее наверно допилю, а если не получится то тогда без либы

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

dimax пишет:

jeka_tm пишет:

dimax вот дошли руки, но что то какая то проблема: 3 из 4 библиотек не хотят измерять напряжение выше 16В, показывают отрицательные значения.

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

Дима, не все тут настолько продвинутые, у меня к примеру используется режим 16S )))

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

Я 32S использую

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Кстати, для 10А шунт 0,002 маловат. Точность никакая будет. Вчера посчитал ради эксперимента.

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

Про шунт: я случайно сломал тестер usb до 30в 5а. И там стоял этот шунт. Оттуда его взял. А вчера ошибся. Делаю электронную нагрузку. И там 2 шунта: один для самой нагрузки 0.002 ом в цепи для обратной связи и 0.0125ом (из 7шт 0.1 ом 1206 и 1шт 0.1 ом 2512, который уже на пластике стоял. По мощности считал нормально должно быть) для ina219. Так что все правильно 0.0125ом. там с точностью более менее. Очень высокая и не нужна

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну 0.0125 поточнее будет. Только вот конфигурацию вы не правильно рассчитали. Оттуда и переполнения.

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

Считал в Экселе чтобы не ошибиться. Да и совпадают значения по току, но с костылями конечно, это заодно поправить, а переполнение думаю корректировкой типов переменных лечится
Да и вообще отказаться от float, а выводить мА мВ мВт. А дальше уже делать что хочется

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

Ну напряжение как оказалось легко исправляется. brokly был прав. int16_t заменил на uint16_t

Bus voltage:   24.996 V
Bus power:     6.224 W
Shunt voltage: 0.003 V
Shunt current: 0.246 A

Вот тут если что библиотека которая больше всего понравилась. Уже исправленная

https://yadi.sk/d/E_6RZdv6MM5FVw

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

Вопрос ко всем участникам форума а в особенности к dimax как прочесть состояние регистра (адрес = 01h) определяющего падение напряжение на шунте. И перевести его в состояние понятное обычным пользователям тоесть в миливольты. И вобще как считывать значения по умолчанию которых для моих задачь вполне достаточно. Я так так понимаю что для считывания значений по умолчанию никакие библиотеки не нужны.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Иван_ , библиотеки нафик не нужны.  Примеры чтения есть в этой теме (#6)  и тут     в 01h регистре лежит уже готовое напряжение, 1 попугай =10 микровольт. В скетче зарядника я как раз читаю напрямую этот регистр.

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

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

Alex178
Offline
Зарегистрирован: 06.03.2018

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

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

Да можно. Шунт по идее закоротить и все, просто подключать. Но есть ли смысл если просто делитель можно сделать? Точность выше?

Alex178
Offline
Зарегистрирован: 06.03.2018

Спасибо, попробую. Ног не хватает, и дребезга такого нет.

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

jeka_tm пишет:
Про шунт: я случайно сломал тестер usb до 30в 5а. И там стоял этот шунт. Оттуда его взял. А вчера ошибся. Делаю электронную нагрузку.

Так что там с элетронной нагрузкой, мне тоже для сына надо сделать, одолел?

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

ua6em пишет:

Так что там с элетронной нагрузкой, мне тоже для сына надо сделать, одолел?

Да давно. Прикольно получилось. Там 3 в одном: управление светом рабочего стола, контроллер паяльника и электронная нагрузка. Управление сенсорное + энкодер + дисплей 1202. Ток стабилизируется ОУ, регулируется через MCP4727. Также хардварная защита от обрыва (так как ОУ будет пытаться  стабилизировать ток, при обрыве откроет на полную полевик, и при восстановлении контакта будет КЗ с возможно печальными последствиями). А еще в контроллере паяльника сделал автоотключение, в паяльник кое как впихнул датчик с шариком и по нему паяльник переходит через 10минут в режим ожидания, 100 градусов, а через 30 минут совсем отключается.

Также пока помню расскажу по тестам полевиков в линейном режиме:

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

IRF840 - неплохой вариант если есть в наличии для небольших мощностей. Максимальный ток будет конечно ограничен из-за высокого RdsON, но до 45Вт на корпус держит

IRF540 - очень неплохой, RdsON ниже, 50Вт с корпуса легко рассеивается

IRFP260 - лучшее из того что я пробовал, не зря его используют в электронных нагрузках, хоть и относительно высоковольтный, но в районе 8-9А при 5В питания (точно не помню сколько был ток) снял. Максимальную мощность что он может рассеить я не проверял.

Вообще любой полевик без буквы N в конце (например IRF540 и IRF540N) будет лучше рассеивать и больше подходит для линейного режима. С N это другое поколение полевиков, более "оптимизированных" для ключевых режимов, меньше площадь кристалла, меньше мощность могут рассеять.

А еще сделал контроллер паяльника и фена портативный из зарядного от ноубука, размер немного больше зарядника, управление сенсорное + дисплей 1202, от плавной регулировки отказался, переключаюсь между заданными температурами (это удобство еще на первом контроллере ощутил). Фен готовый китайский. 

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

Вот ещё: лучше купить ina226, она поддерживает подключение шунта и со стороны плюса, и со страны минуса, ina219 только со стороны плюса. Поэтому с 219 нужно 2 шунта, а с 226 1. В Китае был куплен 226 с шунтом 0.01 в комплекте.
Вообще была мысль сделать i2c модуль электронной нагрузки: INA226+MCP4725+LM358+IRFP260+ step up с 5/12в,