SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Dwukierunkowy cyfrowy czujnik prądu/mocy INA219

INA219 jest miniaturowym, dwukierunkowym czujnikiem prądu i mocy, współpracujący z zewnętrznym rezystorem bocznikującym. Można go znaleźć między innymi w systemach komputerowych, zasilaczach oraz ładowarkach. Jego działanie polega na pomiarze spadku napięcia na rezystorze bocznikującym oraz napięcia zasilającego bocznik. Na podstawie tych dwóch wartości wyznaczana jest wartość prądu oraz mocy pobieranej przez obciążenie.

Układ charakteryzują się dokładnością ±1% oraz 12-bitową rozdzielczością wewnętrznego przetwornika A/C. Takie parametry pozwalają na uzyskanie dużej dokładności pomiaru nawet przy znikomym spadku napięcia na rezystorze bocznikującym. Napięcie szyny może mieć wartość z zakresu od 0V ÷ 26V, natomiast rejestry pozwalają na odczyt natężenia prądu i mocy bezpośrednio w amperach i watach. Napięcie zasilania może mieścić się w zakresie 3V ÷ 5V.

W przypadku pracy w otoczeniu o sporych zakłóceniach elektromagnetycznych możliwe jest uśrednianie 128 próbek pomiarowych. Konfiguracja parametrów oraz odczyt wyników odbywa się za pośrednictwem szyny I2C mogącej pracować z zegarem do 3,4 MHz.

INA219 dostępna jest w dwóch wersjach obudowy, które różnią się wyprowadzeniami.

Dokumentacja techniczna: https://www.jarzebski.pl/datasheets/INA219.pdf

Poniższy wpis będzie dotyczył układu INA219 w wariancie obudowy SOT23-8. Aby ułatwić sobie prototypowanie, możemy przylutować go do przejściówki SOT23-8 na DIP8. Zalecane jest również wykorzystanie rezystora bocznikującego o wartości 0.1Ω, tolerancji 1% oraz mocy 2W ÷ 3W. Ja wykorzystałem rezystor SMD firmy Bourns z dolutowanymi nóżkami.

 

Schemat połączeń

Podłączenie układu jest bardzo proste. Układ zasilamy napięciem 5V z kondensatorem filtrującym 0.1μF. Linie sterujące SCL oraz SDA podłączamy do Arduino, podciągając rezystorami 10kΩ do zasilania. Piny A0 i A1 podłączamy do masy, dzięki czemu INA219 będzie posiadał adres 0x40 na szynie I2C. Stosując różne kombinacje połączeń A0 i A1, możemy uzyskać 16 różnych adresów.

Konfiguracja połączeń A0 i A1

Wreszcie na koniec, do VIN+ oraz VIN- podłączamy rezystor bocznikujący i przepuszczamy przez niego obciążenie (maksymalnie 26V / 3.5A dla rezystora bocznikującego 0.1Ω).

Jeśli chcemy mierzyć większe prądy, wystarczy zmienić rezystor bocznikujący, powiedzmy na 0.01Ω. Pozwoli nam to na mierzenie prądu do 35A w rozdzielczości 0.8mA.

 

Program

Do obsługi modułów z układami INA219 przygotowałem bibliotekę dla Arduino, którą można pobrać z repozytorium Git: https://github.com/jarzebski/Arduino-INA219

  1. #include <Wire.h>
  2. #include <INA219.h>
  3.  
  4. INA219 ina;
  5.  
  6. void checkConfig()
  7. {
  8.   Serial.print("Mode:                 ");
  9.   switch (ina.getMode())
  10.   {
  11.     case INA219_MODE_POWER_DOWN:      Serial.println("Power-Down"); break;
  12.     case INA219_MODE_SHUNT_TRIG:      Serial.println("Shunt Voltage, Triggered"); break;
  13.     case INA219_MODE_BUS_TRIG:        Serial.println("Bus Voltage, Triggered"); break;
  14.     case INA219_MODE_SHUNT_BUS_TRIG:  Serial.println("Shunt and Bus, Triggered"); break;
  15.     case INA219_MODE_ADC_OFF:         Serial.println("ADC Off"); break;
  16.     case INA219_MODE_SHUNT_CONT:      Serial.println("Shunt Voltage, Continuous"); break;
  17.     case INA219_MODE_BUS_CONT:        Serial.println("Bus Voltage, Continuous"); break;
  18.     case INA219_MODE_SHUNT_BUS_CONT:  Serial.println("Shunt and Bus, Continuous"); break;
  19.     default: Serial.println("unknown");
  20.   }
  21.  
  22.   Serial.print("Range:                ");
  23.   switch (ina.getRange())
  24.   {
  25.     case INA219_RANGE_16V:            Serial.println("16V"); break;
  26.     case INA219_RANGE_32V:            Serial.println("32V"); break;
  27.     default: Serial.println("unknown");
  28.   }
  29.  
  30.   Serial.print("Gain:                 ");
  31.   switch (ina.getGain())
  32.   {
  33.     case INA219_GAIN_40MV:            Serial.println("+/- 40mV"); break;
  34.     case INA219_GAIN_80MV:            Serial.println("+/- 80mV"); break;
  35.     case INA219_GAIN_160MV:           Serial.println("+/- 160mV"); break;
  36.     case INA219_GAIN_320MV:           Serial.println("+/- 320mV"); break;
  37.     default: Serial.println("unknown");
  38.   }
  39.  
  40.   Serial.print("Bus resolution:       ");
  41.   switch (ina.getBusRes())
  42.   {
  43.     case INA219_BUS_RES_9BIT:         Serial.println("9-bit"); break;
  44.     case INA219_BUS_RES_10BIT:        Serial.println("10-bit"); break;
  45.     case INA219_BUS_RES_11BIT:        Serial.println("11-bit"); break;
  46.     case INA219_BUS_RES_12BIT:        Serial.println("12-bit"); break;
  47.     default: Serial.println("unknown");
  48.   }
  49.  
  50.   Serial.print("Shunt resolution:     ");
  51.   switch (ina.getShuntRes())
  52.   {
  53.     case INA219_SHUNT_RES_9BIT_1S:    Serial.println("9-bit / 1 sample"); break;
  54.     case INA219_SHUNT_RES_10BIT_1S:   Serial.println("10-bit / 1 sample"); break;
  55.     case INA219_SHUNT_RES_11BIT_1S:   Serial.println("11-bit / 1 sample"); break;
  56.     case INA219_SHUNT_RES_12BIT_1S:   Serial.println("12-bit / 1 sample"); break;
  57.     case INA219_SHUNT_RES_12BIT_2S:   Serial.println("12-bit / 2 samples"); break;
  58.     case INA219_SHUNT_RES_12BIT_4S:   Serial.println("12-bit / 4 samples"); break;
  59.     case INA219_SHUNT_RES_12BIT_8S:   Serial.println("12-bit / 8 samples"); break;
  60.     case INA219_SHUNT_RES_12BIT_16S:  Serial.println("12-bit / 16 samples"); break;
  61.     case INA219_SHUNT_RES_12BIT_32S:  Serial.println("12-bit / 32 samples"); break;
  62.     case INA219_SHUNT_RES_12BIT_64S:  Serial.println("12-bit / 64 samples"); break;
  63.     case INA219_SHUNT_RES_12BIT_128S: Serial.println("12-bit / 128 samples"); break;
  64.     default: Serial.println("unknown");
  65.   }
  66.  
  67.   Serial.print("Max possible current: ");
  68.   Serial.print(ina.getMaxPossibleCurrent());
  69.   Serial.println(" A");
  70.  
  71.   Serial.print("Max current:          ");
  72.   Serial.print(ina.getMaxCurrent());
  73.   Serial.println(" A");
  74.  
  75.   Serial.print("Max shunt voltage:    ");
  76.   Serial.print(ina.getMaxShuntVoltage());
  77.   Serial.println(" V");
  78.  
  79.   Serial.print("Max power:            ");
  80.   Serial.print(ina.getMaxPower());
  81.   Serial.println(" W");
  82. }
  83.  
  84. void setup()
  85. {
  86.   Serial.begin(115200);
  87.  
  88.   Serial.println("Initialize INA219");
  89.   Serial.println("-----------------------------------------------");
  90.  
  91.   // Default INA219 address is 0x40
  92.   ina.begin();
  93.  
  94.   // Configure INA219
  95.   ina.configure(INA219_RANGE_32V, INA219_GAIN_320MV, INA219_BUS_RES_12BIT, INA219_SHUNT_RES_12BIT_1S);
  96.  
  97.   // Calibrate INA219 for Rshunt = 0.1 ohm and max excepted current = 2A
  98.   ina.calibrate(0.1, 2);
  99.  
  100.   // Display configuration
  101.   checkConfig();
  102.  
  103.   Serial.println("-----------------------------------------------");
  104. }
  105.  
  106. void loop()
  107. {
  108.   Serial.print("Bus voltage:   ");
  109.   Serial.print(ina.readBusVoltage(), 5);
  110.   Serial.println(" V");
  111.  
  112.   Serial.print("Bus power:     ");
  113.   Serial.print(ina.readBusPower(), 5);
  114.   Serial.println(" W");
  115.  
  116.  
  117.   Serial.print("Shunt voltage: ");
  118.   Serial.print(ina.readShuntVoltage(), 5);
  119.   Serial.println(" V");
  120.  
  121.   Serial.print("Shunt current: ");
  122.   Serial.print(ina.readShuntCurrent(), 5);
  123.   Serial.println(" A");
  124.  
  125.   Serial.println("");
  126.   delay(1000);
  127. }

Wynik działania programu

Materiały dodatkowe

Biblioteka INA219: https://github.com/jarzebski/Arduino-INA219
Dokumentacja techniczna: https://www.jarzebski.pl/datasheets/INA219.pdf

Reklama

Komentarze Komentarze
Avatar 2
reaper7 Windows / Mozilla Firefox 29.0
04 April 2014 - 09:00 Warszawa

Jak zwykle świetnie i profesjonalnie przygotowana biblioteka.
Gratulacje!

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 28.0
05 April 2014 - 03:37 Bytom

Wielkie dzięki :)

Avatar 1
Kamil Maciejewski Windows 7 / Safari 537.36
04 April 2014 - 13:50 Łódź

Bardzo fajny tekst. Szkoda, że nie obsługuje 230V.

Avatar 1
ja Windows 7 / Mozilla Firefox 39.0
31 July 2015 - 21:10 Brak informacji

Wszystko super, ale gdzie kupić ten układzik??

Avatar 2
Korneliusz Windows / Safari 537.36
02 August 2015 - 12:37 Bytom
Avatar 1
Arch Windows / Safari 537.36
23 September 2016 - 21:09 Warszawa

Cześć,
Aktualnie walczę z tymi czujnikami i mam dziwny problem. Podłączyłem bocznik za obciążeniem (12V -> load-> shunt -> mosfet -> GND) i INA219 się spalił (zaczął pobierać 100mA prądu, dopiero jego wylutowanie pomogło).
Z innym czujnikiem nic się nie stało oprócz tego, że gdy mosfet jest zablokowany, pobór prądu całego układu wynosi 150mA (normalnie bez obciążenia 60mA), dodatkowo INA zwraca dziwne wartości prądu. Przy otwartym mosfecie wartości zwracane przez INA219 są sensowne. I teraz zastanawiam się czy położenie czujnika (przed czy po obciążeniu) ma aż takie znaczenie, czy może to kwestia wadliwej serii czujników?

Avatar 2
Korneliusz Android 6.0 / Safari 537.36
24 September 2016 - 22:05 Brak informacji

Pokaż schemat , jaka wartość bocznika, jaki prąd pobiera obciążenie? Jaki mosfet?

Avatar 1
pat_i_mat Linux x86_64 / Safari 537.36
20 July 2017 - 15:07 Katowice

Hej. Poszukując informacji na temat INA219 trafiłem na ten opis-jest super opisany :)
Mam pytanie odnośnie INA219... Buduję sobie urządzenie na AVR i teraz tak, jeden zasilacz dla: AVR, INA219 i odbiornik. Nie wiem czy dobrze zrozumiałem opis połączenia-zrobiłem schemat bo jak to mówią "jeden obraz, tysiąc słów" :)

Oryginalny obraz posiada rozmiar 1218x401

Avatar 1
Stefan Windows 7 / Safari 537.36
26 October 2017 - 19:24 Warszawa

Czy na pewno z rezystorem 0,01 om będzie można mierzyć prąd 35A. Może się mylę, ale musiałby mieć moc 12,25W i SMD to raczej nie będzie.

Avatar 1
Tomasz Windows 7 / Safari 537.36
13 July 2019 - 02:49 Brak informacji

Czy podana wartość mocy rezystora jest prawidłowa?

Avatar 1
Yuri Windows XP / Safari 537.36
10 April 2018 - 19:18 Brak informacji

Dzień dobry! Powiedz mi, jak możesz zmierzyć napięcie na baterii (nie na boczniku!) 14 woltów, w trybie pomiaru napięcia 12 bit 32 samples (17.02 ms)?

Avatar 1
Boczek Mac OS X / Safari 604.1
31 May 2018 - 06:08 Brak informacji

Mam pytanie, posiadam nodemcu i chciałbym go zasilać z baterii, czy za pomocą tego układu INA219 mogę sam sobie zmierzyć napięcie? Mam na myśli pomiar napięcia którym zasilany jest esp oraz ina.ADC mam już zajęty.

Avatar 1
friderico Windows / Safari 537.36
05 November 2018 - 15:05 Brak informacji

Witam
To jest najlepszy opis układu INA219 jaki znalazłem więc jak tu nie znajdę pomocy to pewnie nigdzie indziej...
Mam pytanie, chcę mierzyć TYLKO napięcie - czy mogę w ogóle nie podłączać rezystora bocznikującego? Chcę podać tylko mierzone napięcie (BEZ REZYSTORA) na końcówki VIN+ i VIN- (VIN- oczywiście bezpośrednio do masy) - jaki będzie efekt? czy nie spalę układu i czy w ten sposób da się mierzyć napięcie na VIN+ ?
dziękuję i pozdrawiam

Avatar 1
fedar Windows / Mozilla Firefox 63.0
13 December 2018 - 09:26 Brak informacji

Dzień dobry
Maks. napięcie róznicowe to +/- 26V. Układ nie powinien się uszkodzić pod warunkiem, że napięcie odniesione do masy na żadnym z tych pinów nie wyjdzie poza zakres -0.3V .. 26V. Zdrowiej jednak byłoby połączyć Vin+ i Vin- z sobą i tak połączone dołączyć do punktu pomiaru napięcia. Rezystor bocznikujący pominąć.
pozdrawiam.