SantyagoSantyago
YouTube RSS Google+ Facebook GitHub

Okazje Allegro

Przycisk wandaloodporny 16mm, LED RGB, C-W-A, 1NO

Przycisk wandaloodporny 16mm, LED RGB, C-W-A, 1NO
Kup teraz: 30,75 zł

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

Sprzęt dostarczają

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Popularne wpisy

Facebook

Google+

Ostatnie fotografie

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

Dwukierunkowy cyfrowy czujnik prądu/mocy INA226

INA226 jest kolejnym, miniaturowym, dwukierunkowym czujnikiem prądu i mocy, współpracujący z zewnętrznym rezystorem bocznikującym. Można go znaleźć w systemach komputerowych, zasilaczach oraz ładowarkach. Jego działanie polega na pomiarze spadku napięcia na rezystorze bocznikującym, napięcia zasilającego bocznik oraz napięcia zasilania szyny. Na podstawie tych trzech wartości wyznaczana jest wartość prądu oraz mocy pobieranej przez obciążenie. Jest to pierwsza różnica w metodzie pomiaru pomiędzy INA226 a poprzednio opisywanym INA219.

Układ w odróżnieniu od INA219 charakteryzuje się zwiększoną dokładnością ±0.1% oraz 16-bitową rozdzielczością wewnętrznego przetwornika A/C. Parametry te pozwalają na uzyskanie znacznie większej dokładności pomiaru bardzo małych spadków napięcia na rezystorze bocznikującym. Zwiększone jest również dopuszczalne napięcie szyny, które  może mieścić się w zakresie od 0V ÷ 36V. Podobnie jak w INA219, 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.

INA226 posiada również dodatkowe specjalne rejestry, za pomocą których możemy sterować pinem ALERT do sygnalizacji przekroczenia (lub niedobori) ustawionych wartości granicznych takich jak: pobierana moc, napięcie na rezystorze bocznikującym oraz napięcie szyny.

W przypadku pracy w otoczeniu o sporych zakłóceniach elektromagnetycznych możliwe jest uśrednianie aż 1024 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.

Zasadniczą różnicą pomiędzy INA219 a INA226 jest sposób wykonywania pomiarów. Jak pamiętamy, INA219 pozwalał na wybór rozdzielczości pomiaru napięcia szyny oraz ilości próbek napięcia na rezystorze bocznikującym. INA226 natomiast pozwala na określenie indywidualnych czasów trwania pomiarów tych wartości w przedziale 140μS ÷ 8.244mS, które wykonuje w żądanej ilości próbek pomiarowych.

INA226 dostępna jest jedynie w obudowie MSOP-10.

Dokumentacja techniczna: http://www.jarzebski.pl/datasheets/INA226.pdf

Dla ułatwienia testowania możemy przylutować układ do przejściówki MSOP-10 na DIP10. Ponieważ INA226 dopuszcza maksymalne napięcie na boczniku do 81.92mV, więc do pomiaru większych wartości prądu musimy skorzystać z nieco mniejszej jego rezystancji. Ja użyłem rezystora bocznikującego o wartości 0.01Ω, tolerancji 1% oraz mocy 3W. W takiej konfiguracji jest możliwy pomiar natężenia prądu do 8A (przy zastosowaniu bocznika 0.1Ω, będzie to 800mA).

Schemat połączeń

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 INA226 będzie posiadała adres 0x40 na szynie I2C. W odróżnieniu od INA219, dodatkowy pin VBUS mostkujemy z VIN-. Opcjonalnie, możemy wykorzystać wyjście ALERT o którym nieco później.

Oczywiście do VIN+ oraz VIN- podłączamy rezystor bocznikujący i przepuszczamy przez niego obciążenie (maksymalnie 36V / 8A dla rezystora bocznikującego 0.01Ω).

Program

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

  1. #include <Wire.h>
  2. #include <INA226.h>
  3.  
  4. INA226 ina;
  5.  
  6. void checkConfig()
  7. {
  8.   Serial.print("Mode:                  ");
  9.   switch (ina.getMode())
  10.   {
  11.     case INA226_MODE_POWER_DOWN:      Serial.println("Power-Down"); break;
  12.     case INA226_MODE_SHUNT_TRIG:      Serial.println("Shunt Voltage, Triggered"); break;
  13.     case INA226_MODE_BUS_TRIG:        Serial.println("Bus Voltage, Triggered"); break;
  14.     case INA226_MODE_SHUNT_BUS_TRIG:  Serial.println("Shunt and Bus, Triggered"); break;
  15.     case INA226_MODE_ADC_OFF:         Serial.println("ADC Off"); break;
  16.     case INA226_MODE_SHUNT_CONT:      Serial.println("Shunt Voltage, Continuous"); break;
  17.     case INA226_MODE_BUS_CONT:        Serial.println("Bus Voltage, Continuous"); break;
  18.     case INA226_MODE_SHUNT_BUS_CONT:  Serial.println("Shunt and Bus, Continuous"); break;
  19.     default: Serial.println("unknown");
  20.   }
  21.  
  22.   Serial.print("Samples average:       ");
  23.   switch (ina.getAverages())
  24.   {
  25.     case INA226_AVERAGES_1:           Serial.println("1 sample"); break;
  26.     case INA226_AVERAGES_4:           Serial.println("4 samples"); break;
  27.     case INA226_AVERAGES_16:          Serial.println("16 samples"); break;
  28.     case INA226_AVERAGES_64:          Serial.println("64 samples"); break;
  29.     case INA226_AVERAGES_128:         Serial.println("128 samples"); break;
  30.     case INA226_AVERAGES_256:         Serial.println("256 samples"); break;
  31.     case INA226_AVERAGES_512:         Serial.println("512 samples"); break;
  32.     case INA226_AVERAGES_1024:        Serial.println("1024 samples"); break;
  33.     default: Serial.println("unknown");
  34.   }
  35.  
  36.   Serial.print("Bus conversion time:   ");
  37.   switch (ina.getBusConversionTime())
  38.   {
  39.     case INA226_BUS_CONV_TIME_140US:  Serial.println("140uS"); break;
  40.     case INA226_BUS_CONV_TIME_204US:  Serial.println("204uS"); break;
  41.     case INA226_BUS_CONV_TIME_332US:  Serial.println("332uS"); break;
  42.     case INA226_BUS_CONV_TIME_588US:  Serial.println("558uS"); break;
  43.     case INA226_BUS_CONV_TIME_1100US: Serial.println("1.100ms"); break;
  44.     case INA226_BUS_CONV_TIME_2116US: Serial.println("2.116ms"); break;
  45.     case INA226_BUS_CONV_TIME_4156US: Serial.println("4.156ms"); break;
  46.     case INA226_BUS_CONV_TIME_8244US: Serial.println("8.244ms"); break;
  47.     default: Serial.println("unknown");
  48.   }
  49.  
  50.   Serial.print("Shunt conversion time: ");
  51.   switch (ina.getShuntConversionTime())
  52.   {
  53.     case INA226_SHUNT_CONV_TIME_140US:  Serial.println("140uS"); break;
  54.     case INA226_SHUNT_CONV_TIME_204US:  Serial.println("204uS"); break;
  55.     case INA226_SHUNT_CONV_TIME_332US:  Serial.println("332uS"); break;
  56.     case INA226_SHUNT_CONV_TIME_588US:  Serial.println("558uS"); break;
  57.     case INA226_SHUNT_CONV_TIME_1100US: Serial.println("1.100ms"); break;
  58.     case INA226_SHUNT_CONV_TIME_2116US: Serial.println("2.116ms"); break;
  59.     case INA226_SHUNT_CONV_TIME_4156US: Serial.println("4.156ms"); break;
  60.     case INA226_SHUNT_CONV_TIME_8244US: Serial.println("8.244ms"); break;
  61.     default: Serial.println("unknown");
  62.   }
  63.  
  64.   Serial.print("Max possible current:  ");
  65.   Serial.print(ina.getMaxPossibleCurrent());
  66.   Serial.println(" A");
  67.  
  68.   Serial.print("Max current:           ");
  69.   Serial.print(ina.getMaxCurrent());
  70.   Serial.println(" A");
  71.  
  72.   Serial.print("Max shunt voltage:     ");
  73.   Serial.print(ina.getMaxShuntVoltage());
  74.   Serial.println(" V");
  75.  
  76.   Serial.print("Max power:             ");
  77.   Serial.print(ina.getMaxPower());
  78.   Serial.println(" W");
  79. }
  80.  
  81. void setup()
  82. {
  83.   Serial.begin(115200);
  84.  
  85.   Serial.println("Initialize INA226");
  86.   Serial.println("-----------------------------------------------");
  87.  
  88.   // Default INA226 address is 0x40
  89.   ina.begin();
  90.  
  91.   // Configure INA226
  92.   ina.configure(INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);
  93.  
  94.   // Calibrate INA226. Rshunt = 0.01 ohm, Max excepted current = 4A
  95.   ina.calibrate(0.01, 4);
  96.  
  97.   // Display configuration
  98.   checkConfig();
  99.  
  100.   Serial.println("-----------------------------------------------");
  101. }
  102.  
  103. void loop()
  104. {
  105.   Serial.print("Bus voltage:   ");
  106.   Serial.print(ina.readBusVoltage(), 5);
  107.   Serial.println(" V");
  108.  
  109.   Serial.print("Bus power:     ");
  110.   Serial.print(ina.readBusPower(), 5);
  111.   Serial.println(" W");
  112.  
  113.  
  114.   Serial.print("Shunt voltage: ");
  115.   Serial.print(ina.readShuntVoltage(), 5);
  116.   Serial.println(" V");
  117.  
  118.   Serial.print("Shunt current: ");
  119.   Serial.print(ina.readShuntCurrent(), 5);
  120.   Serial.println(" A");
  121.  
  122.   Serial.println("");
  123.   delay(1000);
  124. }

Wynik działania programu

Wykorzystanie sygnału ALERT

INA226 posiada jeszcze bardzo przydatną funkcję jaką jest sygnał ALERT. Możemy określić, czy sygnał na tym wyjściu ma być aktywny po przekroczeniu zadanej wartości (lub kiedy znajduje się poniżej tej wartości). Rodzaj badanej wartości wybiera się za pomocą wybranej funkcji:

  • dla napięcia na szynie:
    • enableBusOvertLimitAlert();
    • enableBusUnderLimitAlert();
    • setBusVoltageLimit(v = float);
  • dla napięcia na boczniku:
    • enableShuntOverLimitAlert();
    • enableShuntUnderLimitAlert();
    • setShuntVoltageLimit(v = float);
  • dla poboru mocy:
    • enableOverPowerLimitAlert();
    • setPowerLimit(p = float);

Możliwe jest również określenie, czy aktywnym sygnałem jest stan wysoki, czy niski za pomocą funkcji: setAlertInvertedPolarity(true / false). W domyślnych ustawieniach, sygnał ALERT jest podawany tak długo, jak długo występują podane warunki pomiarowe. W przykładzie jest to przekroczenie 130mW (w momencie podłączenia drugiej diody do obciążenia, zapali się dioda niebieska)

  1. #include <Wire.h>
  2. #include <INA226.h>
  3.  
  4. INA226 ina;
  5.  
  6. void setup()
  7. {
  8.   Serial.begin(115200);
  9.  
  10.   Serial.println("Initialize INA226");
  11.   Serial.println("-----------------------------------------------");
  12.  
  13.   // Default INA226 address is 0x40
  14.   ina.begin();
  15.  
  16.   // Configure INA226
  17.   ina.configure(INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);
  18.  
  19.   // Calibrate INA226. Rshunt = 0.01 ohm, Max excepted current = 4A
  20.   ina.calibrate(0.01, 4);
  21.  
  22.   // Enable Bus Over-Voltage Alert
  23.   // ina.enableBusOvertLimitAlert();
  24.   // ina.enableBusUnderLimitAlert();
  25.   // ina.setBusVoltageLimit(3.33);
  26.  
  27.   // Enable Shunt Over-Voltage Alert
  28.   // ina.enableShuntOverLimitAlert();
  29.   // ina.enableShuntUnderLimitAlert();
  30.   // ina.setShuntVoltageLimit(0.0055);
  31.  
  32.   // Enable Power Over-Limit Alert
  33.   ina.enableOverPowerLimitAlert();
  34.   ina.setPowerLimit(0.130);
  35.  
  36.   // ina.setAlertInvertedPolarity(true)
  37. }
  38.  
  39. void loop()
  40. {
  41.   Serial.print("Bus voltage:   ");
  42.   Serial.print(ina.readBusVoltage(), 5);
  43.   Serial.println(" V");
  44.  
  45.   Serial.print("Bus power:     ");
  46.   Serial.print(ina.readBusPower(), 5);
  47.   Serial.println(" W");
  48.  
  49.   Serial.print("Shunt voltage: ");
  50.   Serial.print(ina.readShuntVoltage(), 5);
  51.   Serial.println(" V");
  52.  
  53.   Serial.print("Shunt current: ");
  54.   Serial.print(ina.readShuntCurrent(), 5);
  55.   Serial.println(" A");
  56.  
  57.   Serial.println("");
  58.   delay(1000);
  59. }

Całości smaku dodaje możliwość ustawienia sygnału ALERT z "zatrzaskiem". Sygnał ALERT będzie tak długo aktywny (nawet po ustaniu warunku pomiarowego), aż do momentu odczytania rejestru za pomocą funkcji isAlert() i ewnetualnego obsłużenia zdarzenia w programie:

  1. #include <Wire.h>
  2. #include <INA226.h>
  3.  
  4. INA226 ina;
  5.  
  6. void setup()
  7. {
  8.   Serial.begin(115200);
  9.  
  10.   Serial.println("Initialize INA226");
  11.   Serial.println("-----------------------------------------------");
  12.  
  13.   // Default INA226 address is 0x40
  14.   ina.begin();
  15.  
  16.   // Configure INA226
  17.   ina.configure(INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);
  18.  
  19.   // Calibrate INA226. Rshunt = 0.01 ohm, Max excepted current = 4A
  20.   ina.calibrate(0.01, 4);
  21.  
  22.   // Enable Power Over-Limit Alert
  23.   ina.enableOverPowerLimitAlert();
  24.   ina.setPowerLimit(0.130);
  25.   ina.setAlertLatch(true);
  26. }
  27.  
  28. void loop()
  29. {
  30.   Serial.print("Bus voltage:   ");
  31.   Serial.print(ina.readBusVoltage(), 5);
  32.   Serial.println(" V");
  33.  
  34.   Serial.print("Bus power:     ");
  35.   Serial.print(ina.readBusPower(), 5);
  36.   Serial.println(" W");
  37.  
  38.  
  39.   Serial.print("Shunt voltage: ");
  40.   Serial.print(ina.readShuntVoltage(), 5);
  41.   Serial.println(" V");
  42.  
  43.   Serial.print("Shunt current: ");
  44.   Serial.print(ina.readShuntCurrent(), 5);
  45.   Serial.println(" A");
  46.  
  47.   if (ina.isAlert())
  48.   {
  49.     // Latch will be removed here
  50.     Serial.println("ALERT");
  51.   }
  52.  
  53.   Serial.println("");
  54.   delay(1000);
  55. }

Materiały dodatkowe

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

Udpstępnij dalej!

http://www.jarzebski.pl/arduino/czujniki-i-sensory/cyfrowy-czujnik-pradu-mocy-ina226.html

Reklama

Komentarze Komentarze
Avatar 1
GreeX Windows XP / Mozilla Firefox 32.0
22 październik 2014 - 02:01 Jaworzno

Wszystko pieknie tylko gdzie mozna nabyc ina226 w naszym kraju ??

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 31.0
22 październik 2014 - 06:06 Bytom

INA226 jedynie chyba na Farnell - ja tam zamawiałem bez problemu: http://pl.farnell.com/texas-instruments/ina226aidgst/current-monitor-10msop/dp/1924807

INA219 znajdziesz na w sklepie ElTy: https://elty.pl/pl/p/INA219AIDR-SOP8-/1010

Avatar 1
GreeX Linux / Mozilla Firefox 33.0
07 listopad 2014 - 06:00 Jaworzno

Dzieki za info ....

Avatar 1
Jarlath Windows 7 / Mozilla Firefox 38.0
21 czerwiec 2015 - 17:56 Zabrze

Cześć,
W ubiegłym tygodniu dotarły do mnie sample INA226 z TI i wszystko ładnie zadziałało. Dzięki za zwrócenie uwagi i opisanie tego scalaka - okazało się, ze jest idealny na potrzeby mojego małego projektu.

Pozdrawiam
Jarlath
http://www.jarlath.net

Avatar 1
Grzegorz Windows 7 / Mozilla Firefox 41.0
21 październik 2015 - 18:25 Gdynia

Cześć.

A czy jest jakiś sposób na pomiar prądu oraz mocy dla wyższczego domowego napięcia 240 V.

Pozdrawiam
Grzegirz

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 41.0
24 październik 2015 - 02:41 Bytom

Nie spotkałem się z takimi układami bezpośredniego napięcia, ale pomocny może okazać się ten wpis: http://forum.arduino.cc/index.php/topic,19287.0.html

Avatar 1
Dzięki za super tutorial Mac OS X / Safari 601.2.7
29 styczeń 2016 - 00:28 Brak informacji

Chętnie bym coś takiego wykonał ale skąd wziąć rezystorki current sense ?
Skąd zamówić INA już wiem z poprzednich komentarzy ale takie rezystory to tez problem

Pozdrawiam

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
04 luty 2016 - 16:32 Bytom

Na http://pl.farnell.com znajdziesz odpowiednie :)

Avatar 1
Sewek Android 4.2 / Safari 537.36
15 luty 2016 - 15:19 Katowice

Z kąd wziąść bibliotekę INA226 do eagle?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
21 luty 2016 - 23:31 Bytom
Avatar 1
Azdek Windows 7 / Mozilla Firefox 48.0
06 wrzesień 2016 - 14:22 Lublin

Hej,
a co z pomiarem prądu przy PWM? Trzeba stosować RC czy będzie działać dobrze bez niego?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 49.0
23 wrzesień 2016 - 19:50 Bytom

Z zastosowaniem filtra RC czemu nie?

Avatar 1
Marcin Android 4.1 / Safari 537.36
20 wrzesień 2016 - 18:14 Warszawa

Przez przypadek kupiłem ina326, czy można go uczuć podobny sposób, chodzi mi o mierzenie aperarzu z pomocą bocznika 60mv 200a, A dzięki arduino zapisywanie tego w jakieś bazie danych

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 49.0
23 wrzesień 2016 - 19:51 Bytom

Pewnie można, ale nota katalogowa INA326 nie da Ci wyników na i2c, tylko wystawi napięcie do pomiaru pinem analogowym

Avatar 1
tstutz Windows / Mozilla Firefox 50.0
21 styczeń 2017 - 04:34 Brak informacji

Thanks for this great Arduino library. This worked on the first try and the data is clearly presented. Great Job.

Avatar 1
Andrejus Windows / Safari 537.36
18 czerwiec 2017 - 16:58 Brak informacji

Hello, thank you for great job. I have question. Can I connect few INA226 to arduino. How to set address in program different from default.
Thank you

Avatar 1
slot Windows 7 / Mozilla 11.0
28 lipiec 2017 - 12:32 Brak informacji

Please open INA226.h - Header file and change the address in line #20. To control more than one device you should add typedef enum with all neded addresses.

Avatar 1
lyli Linux x86_64 / Safari 537.36
09 lipiec 2017 - 11:29 Brak informacji

Czy ktoś próbował obsługi tego w bascomie. Chciał bym go dodać ale nie wiem od czego zacząć.

Skomentuj wpis