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.
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
- #include <Wire.h>
- #include <INA219.h>
- INA219 ina;
- void checkConfig()
- {
- Serial.print("Mode: ");
- switch (ina.getMode())
- {
- case INA219_MODE_POWER_DOWN: Serial.println("Power-Down"); break;
- case INA219_MODE_SHUNT_TRIG: Serial.println("Shunt Voltage, Triggered"); break;
- case INA219_MODE_BUS_TRIG: Serial.println("Bus Voltage, Triggered"); break;
- case INA219_MODE_SHUNT_BUS_TRIG: Serial.println("Shunt and Bus, Triggered"); break;
- case INA219_MODE_ADC_OFF: Serial.println("ADC Off"); break;
- case INA219_MODE_SHUNT_CONT: Serial.println("Shunt Voltage, Continuous"); break;
- case INA219_MODE_BUS_CONT: Serial.println("Bus Voltage, Continuous"); break;
- case INA219_MODE_SHUNT_BUS_CONT: Serial.println("Shunt and Bus, Continuous"); break;
- default: Serial.println("unknown");
- }
- Serial.print("Range: ");
- switch (ina.getRange())
- {
- case INA219_RANGE_16V: Serial.println("16V"); break;
- case INA219_RANGE_32V: Serial.println("32V"); break;
- default: Serial.println("unknown");
- }
- Serial.print("Gain: ");
- switch (ina.getGain())
- {
- case INA219_GAIN_40MV: Serial.println("+/- 40mV"); break;
- case INA219_GAIN_80MV: Serial.println("+/- 80mV"); break;
- case INA219_GAIN_160MV: Serial.println("+/- 160mV"); break;
- case INA219_GAIN_320MV: Serial.println("+/- 320mV"); break;
- default: Serial.println("unknown");
- }
- Serial.print("Bus resolution: ");
- switch (ina.getBusRes())
- {
- case INA219_BUS_RES_9BIT: Serial.println("9-bit"); break;
- case INA219_BUS_RES_10BIT: Serial.println("10-bit"); break;
- case INA219_BUS_RES_11BIT: Serial.println("11-bit"); break;
- case INA219_BUS_RES_12BIT: Serial.println("12-bit"); break;
- default: Serial.println("unknown");
- }
- Serial.print("Shunt resolution: ");
- switch (ina.getShuntRes())
- {
- case INA219_SHUNT_RES_9BIT_1S: Serial.println("9-bit / 1 sample"); break;
- case INA219_SHUNT_RES_10BIT_1S: Serial.println("10-bit / 1 sample"); break;
- case INA219_SHUNT_RES_11BIT_1S: Serial.println("11-bit / 1 sample"); break;
- case INA219_SHUNT_RES_12BIT_1S: Serial.println("12-bit / 1 sample"); break;
- case INA219_SHUNT_RES_12BIT_2S: Serial.println("12-bit / 2 samples"); break;
- case INA219_SHUNT_RES_12BIT_4S: Serial.println("12-bit / 4 samples"); break;
- case INA219_SHUNT_RES_12BIT_8S: Serial.println("12-bit / 8 samples"); break;
- case INA219_SHUNT_RES_12BIT_16S: Serial.println("12-bit / 16 samples"); break;
- case INA219_SHUNT_RES_12BIT_32S: Serial.println("12-bit / 32 samples"); break;
- case INA219_SHUNT_RES_12BIT_64S: Serial.println("12-bit / 64 samples"); break;
- case INA219_SHUNT_RES_12BIT_128S: Serial.println("12-bit / 128 samples"); break;
- default: Serial.println("unknown");
- }
- Serial.print("Max possible current: ");
- Serial.print(ina.getMaxPossibleCurrent());
- Serial.println(" A");
- Serial.print("Max current: ");
- Serial.print(ina.getMaxCurrent());
- Serial.println(" A");
- Serial.print("Max shunt voltage: ");
- Serial.print(ina.getMaxShuntVoltage());
- Serial.println(" V");
- Serial.print("Max power: ");
- Serial.print(ina.getMaxPower());
- Serial.println(" W");
- }
- void setup()
- {
- Serial.begin(115200);
- Serial.println("Initialize INA219");
- Serial.println("-----------------------------------------------");
- // Default INA219 address is 0x40
- ina.begin();
- // Configure INA219
- ina.configure(INA219_RANGE_32V, INA219_GAIN_320MV, INA219_BUS_RES_12BIT, INA219_SHUNT_RES_12BIT_1S);
- // Calibrate INA219 for Rshunt = 0.1 ohm and max excepted current = 2A
- ina.calibrate(0.1, 2);
- // Display configuration
- checkConfig();
- Serial.println("-----------------------------------------------");
- }
- void loop()
- {
- Serial.print("Bus voltage: ");
- Serial.print(ina.readBusVoltage(), 5);
- Serial.println(" V");
- Serial.print("Bus power: ");
- Serial.print(ina.readBusPower(), 5);
- Serial.println(" W");
- Serial.print("Shunt voltage: ");
- Serial.print(ina.readShuntVoltage(), 5);
- Serial.println(" V");
- Serial.print("Shunt current: ");
- Serial.print(ina.readShuntCurrent(), 5);
- Serial.println(" A");
- Serial.println("");
- delay(1000);
- }
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

Jak zwykle świetnie i profesjonalnie przygotowana biblioteka.
Gratulacje!

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

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

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?

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

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

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.

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

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)?

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.

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

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.