INA226 czy ktoś z Was ma działający kod w Bascom avr?

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: Michał6201 » 09 maja 2026, 1:30

Cześć

Zrobiłem sobie prosty układ do pomiaru poboru prądu przez światła DRL w samochodzie.

Chciałem zaoszczędzić miejsce na pcb i zamiast użyć wzmacniacza operacyjnego i przetwornika ADS1110 do pomiaru prądu na boczniku, to ja bezmyślnie użyłem INA226.
Okazuje się, że nie potrafię tego ogarnąć w Bascomie, a mało tego to jeszcze zasugerowałem się jednym schematem z internetu i pin VBUS tego scalaka podłączyłem do rezystora pomiarowego od strony zasilania czyli IN+, a nie od strony odbiornika IN- jak sugeruje w dalszej części nota tego układu scalonego. Nie wiem czy da się to uratować, bo mam już płytkę złożoną.
Nie zależy mi tutaj na pomiarze napięcia przez ten wynalazek, chodzi mi tylko o pobór prądu.

Użyłem bocznika o wartości 10mOhm. Próbowałem się wczytać w notę tego scalaka, ale kompletnie nie rozumiem jak autor wyliczył wartość kalibracji, z podanych wzorów mi zupełnie coś innego wychodzi.

Jeśli miałby ktoś z Was działający kod, to byłbym wdzięczny.

Znalazłem taki kod w internecie, ale nie bardzo rozumiem jak została w nim wyliczona ta wartość kalibracji z wartości bocznika. W ogóle nie rozumiem tego kodu, może jakby były komentarze, ale ich nie ma.
Niby jest podany wzór w nocie, ale w żaden sposób nie wychodzi nawet taki wynik jak obliczony w tej nocie. Skąd w tej nocie wzięła się wartość 2560?
  1.  
  2. $regfile = "M16def.dat"
  3.  
  4. Const Ina226_adr_w = &H80                                   ' Adres zapisu INA226
  5. Const Ina226_adr_r = &H81                                   ' Adres odczytu INA226
  6.  
  7. Dim Ina226_reg As Byte , W_high As Byte , W_low As Byte
  8. Dim U_high As Byte , U_low As Byte , I_high As Byte , I_low As Byte
  9. Dim 24vdc As Single , I As Single
  10.  
  11. '------------ konfiguracja I2C
  12. $lib "i2c_twi.lbx"
  13. Config Scl = Portc.0
  14. Config Sda = Portc.1
  15. Config Twi = 100000
  16. I2cinit
  17.  
  18. '------------- inicjalizacja INA226
  19.  
  20. W_high = &B01000101                                         ' 16 pomiarów do uśredniania, 1,1 ms czas pomiaru prądu i napięcia
  21. W_low = &B00100111                                          ' ciągły pomiar napięcia i prądu
  22. Ina226_reg = &H00
  23. Gosub Ina226_reg_write
  24.  
  25. W_high = &B00001000                                         ' zapisuje rejestr kalibracyjny
  26. W_low = &B00000000                                          ' żeby można było czytać od razu prąd w amperach
  27. Ina226_reg = &H05                                          
  28. Gosub Ina226_reg_write
  29.  
  30. '------------- odczyt INA226
  31. Gosub Ina226_reg_read_u
  32.    24vdc = U_high
  33.    Shift 24vdc , Left , 8
  34.    24vdc = 24vdc + U_low
  35.    24vdc = 24vdc * 0.00125                               ' voltage_LSB = 0,00125 V
  36.  
  37. Gosub Ina226_reg_read_i
  38.    I = I_high
  39.    Shift I , Left , 8
  40.    I = I + I_low
  41.    I = I * 0.00005                                       ' current_LSB = 0.00005 A
  42.  
  43.  
  44.  
  45. '------------- procedury
  46. Ina226_reg_read_u:
  47.    I2cstart
  48.    I2cwbyte Ina226_adr_w
  49.    I2cwbyte &H02
  50.    I2cstart
  51.    I2cwbyte Ina226_adr_r
  52.    I2crbyte U_high , Ack
  53.    I2crbyte U_low , Nack
  54.    I2cstop
  55. Return
  56.  
  57. Ina226_reg_read_i:
  58.    I2cstart
  59.    I2cwbyte Ina226_adr_w
  60.    I2cwbyte &H04
  61.    I2cstart
  62.    I2cwbyte Ina226_adr_r
  63.    I2crbyte I_high , Ack
  64.    I2crbyte I_low , Nack
  65.    I2cstop
  66. Return
  67.  
  68. Ina226_reg_write:
  69.    I2cstart
  70.    I2cwbyte Ina226_adr_w
  71.    I2cwbyte Ina226_reg
  72.    I2cwbyte W_high
  73.    I2cwbyte W_low
  74.    I2cstop
  75. Return
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: niveasoft » 12 maja 2026, 17:51

Jakoś mi ten drugi temat umknął bo klikałem po prawej w temat a nie w folder :D
Popatrze do tego, ale nie dziś bo mam dużo roboty a tam jest przynajmniej 30 stron do przeczytania i pomyślenia.
To nie powinno być skomplikowane jak sie to zrozumie. Może się napisze jakiś kalkulatorek do tego :D

Do tego rejestru kalibracyjnego wpisano 2048, to dość popularna wartość...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: niveasoft » 12 maja 2026, 21:07

Dobra, inzynierią wsteczną przy kawie doszedłem mniej więcej jak to wyliczyli w tym przykładzie w nocie.

Najpierw piszą, że dla nominalnej wartości pomiaru 10A dają rezystor 2mOhm
Potem piszą, że jeśli spodziewamy się maksymalnego prądu 15A to Current_LSB zostanie wyliczona na 457.7
Rozdzielczośc jest 16 bit ale tam jest to ze znakiem który zawsze jest najstarszym bitem dlatego rozdzielczość to 15 bitów.
Normalnie 16bit= 65535, połowa z tego to 32768.
Jako że nie mogli tego napisać normalnie to napisali 2^15 a to znaczy 32768.
Teraz drugi myk... ampery do wzoru wstawiamy w mikroamperach :lol:
Jak podzielisz 15 000 000 / 32768 to wyjdzie 457,763671875 ;)
Teraz w tym przykładzie dalej piszą, że lepiej by było zaokrąglić do 500uA albo nawet 1mA i wybrali to drugie.
Te 2mOhm to jest wartość 0.002 natomiast pamiętaj o mikroamperach :lol: i ten 1mA to tu trzeba chyba /1000 co da na końcu 0.001
Teraz mnożymy sobie najpierw ten dzielnik z drugiego wzoru 0.001 x 0.002 = 0.000002
Teraz sobie podziel zgodnie ze wzorem 0.00512 / 0.000002 i dostaniesz to co oni w nocie katalogowej czyli 2560 ;)

Przy tym wybraniu rozdzielczości 1mA to chyba w tym kodzie tam gdzie masz mnożenie 0.00005 i opis że to current_LSB to chyba trzeba skrócić o jedno zero i dać jedynke na końcu 0.0001.
A może na opak - kawa mi się skończyła :lol:

Na końcu chyba trzeba to skalibrowac dokładniej z jakimś miernikiem. Czyli jak będzie zaniżał lub zawyżał względem miernika to sobie pozmieniaj ten faktor 2600 - 2400 lub bardziej ;)

Lubie takie zagadki i tylko dlatego sie tym pobawiłem.
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: Michał6201 » 13 maja 2026, 23:02

Dziękuję Ci.

Moduł INA226 już w drodze do mnie z ali, także jak tylko dojdzie, to będę testował ten kod i napiszę co i jak.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: niveasoft » 13 maja 2026, 23:15

Nie wiem który moduł zamówiłeś albo czy moze tylko na cześci bo te najpopularniejsze to mają bocznik 0.1R i wtedy on mierzy do 0.8A bo one sa używane w balanserach baterii.
Twn w nocie ma 2mOhm i mierzy do 15A.
Ile tam zamierzasz mierzyć max z tym Twoim 10mOhm?
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: Michał6201 » 19 maja 2026, 22:56

Beznadziejna jest ta nota i z tego fragmentu o tym rejestrze kalibracji nic nie zrozumiałem. Masło maślane...
Myślę że max 2A będę mierzył, może nawet mniej.
Ten moduł zamówiłem z załączonego obrazka. Myślę że do wytestowania działającego oprogramowania wystarczy z tym rezystorem pomiarowym.
On ma bocznik 0,1ohm Ale to nie problem, bo na nim chciałbym tylko uruchomić działający program, a w moim układzie ot sobie wszystko mogę pozmieniać włącznie z wartością rezystora pomiarowego.

Widzę na tej płytce, ze obydwa piny do ustawienia adresu A0 i A1 są podciągnięte przez rezystory 10k do GND
Podłączyłem go do mojej płytki testowej i załadowałem program do czytani adresów na I2C. Odczytało: &H80 (128) oraz &H00 (0). Tylko skąd to (0)?

Następnie załadowałem ten program, ale pokazuje się wartość 3.2766, więc jakieś głupoty, bo nie podłączyłem żadnego obciążenia do tego układu.
  1.  
  2.       $regfile = "m644pdef.dat"
  3.       $crystal = 11059200
  4.       $hwstack=40
  5.       $swstack=16
  6.       $framesize=32
  7.  
  8.  ' KONFIGURACJA WYŚWIETLACZA LCD 2 X 16
  9.   Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
  10.   Config Lcd = 16x2
  11.   Cursor Off
  12.  
  13.   ' KONFIGURACJA INA226 - UKŁAD DO POMIARU POBORU PRĄDU PRZEZ DRL
  14.      Const Ina226_adr_w = &H80  ' Adres zapisu INA226 ; {system dziesiętny 128}
  15.      Const Ina226_adr_r = &H81  ' Adres odczytu INA226 ; {system dziesiętny 129}
  16.  
  17.      Dim Ina226_reg As Byte , W_high As Byte , W_low As Byte
  18.      Dim U_high As Byte , U_low As Byte , I_high As Byte , I_low As Byte
  19.      Dim 12vdc As Single , I As Single
  20.  
  21.      Dim Voltage As String * 10
  22.      Dim Current As String * 10
  23.  
  24.   $lib "i2c_twi.lbx" ' Konfiguracja I2C
  25.     Config Scl = Portc.0
  26.     Config Sda = Portc.1
  27.     I2cinit
  28.     Config Twi = 100000
  29.  
  30.   Do
  31.  
  32.  'Locate 1 , 1
  33.  'Lcd "INA226 TEST"
  34.  
  35.   '------------- inicjalizacja INA226
  36. W_high = &B01000101          ' 16 pomiarów do uśredniania, 1,1 ms czas pomiaru prądu i napięcia
  37. W_low = &B00100111           ' ciągły pomiar napięcia i prądu
  38. Ina226_reg = &H00
  39. Gosub Ina226_reg_write
  40.  
  41. W_high = &B00001000          ' zapisuje rejestr kalibracyjny
  42. W_low = &B00000000           ' żeby można było czytać od razu prąd w amperach
  43. Ina226_reg = &H05
  44. Gosub Ina226_reg_write
  45.  
  46. '------------- odczyt INA226
  47. Gosub Ina226_reg_read_u
  48.    12vdc = U_high
  49.    Shift 12vdc , Left , 8
  50.    12vdc = 12vdc + U_low
  51.    12vdc = 12vdc * 0.00125   ' voltage_LSB = 0,00125 V
  52.  
  53. Gosub Ina226_reg_read_i
  54.    I = I_high
  55.    Shift I , Left , 8
  56.    I = I + I_low
  57.    I = I * 0.00005           ' current_LSB = 0.00005 A
  58.  
  59.  
  60.    Current = Fusing(I , "&&.&&&")
  61.    Locate 2 , 1
  62.    Lcd "I=" ; Current
  63.  
  64.    Voltage = Fusing(12vdc , "&&.&&&")
  65.    Locate 1 , 1
  66.    Lcd "U=" ; Voltage
  67.   Loop
  68.   end
  69.  
  70.  
  71.  
  72.      '------------- PROCEDURY DLA INA226
  73. Ina226_reg_read_u:
  74.    I2cstart
  75.    I2cwbyte Ina226_adr_w
  76.    I2cwbyte &H02
  77.    I2cstart
  78.    I2cwbyte Ina226_adr_r
  79.    I2crbyte U_high , Ack
  80.    I2crbyte U_low , Nack
  81.    I2cstop
  82. Return
  83.  
  84. Ina226_reg_read_i:
  85.    I2cstart
  86.    I2cwbyte Ina226_adr_w
  87.    I2cwbyte &H04
  88.    I2cstart
  89.    I2cwbyte Ina226_adr_r
  90.    I2crbyte I_high , Ack
  91.    I2crbyte I_low , Nack
  92.    I2cstop
  93. Return
  94.  
  95. Ina226_reg_write:
  96.    I2cstart
  97.    I2cwbyte Ina226_adr_w
  98.    I2cwbyte Ina226_reg
  99.    I2cwbyte W_high
  100.    I2cwbyte W_low
  101.    I2cstop
  102. Return

Podłączyłem w HIgh SIDE do IN+ rezystora pomiarowego +12V, do IN- podłączyłem obciążenie w postaci rezystora 100 Ohm i druga noga tego rezystora do GND.
Na wyświetlaczu po zresetowaniu mikrokontrolera pojawiła się wartość 0,247. Ale licząc ręcznie jaki powinien być pobór prądu przez rezystor 100 Ohm przy 12V, to prąd powinien wynosić 120mA.
Przypuszczam, że w tym rejestrze kalibracyjnym zapisana jest wartość tego rezystora pomiarowego. Tylko jak mam zapisać wartość 100mOhm?
Napięcie zmierzone pokazuje 0,000V

I ten program nie odświeża wyniku na wyświetlaczu, trzeba resetować mikrokontroler żeby zmieniła się wartość na wyświetlaczu.
Jak odłączę zasilanie +12V od IN+, to wartość prądu na wyświetlaczu pokazuje się 3,276. A powinno być 0,00

Zmieniłem wartość tego rejestru kalibracji:
z: W_high = &B00001000 ' zapisuje rejestr kalibracyjny na:W_high = &B00000100 ' zapisuje rejestr kalibracyjny i teraz pokazuje pomiar prądu poprawnie.
Ale nadal nie wiem dlaczego nie pokazuje napięcia i nie odświeża pomiaru co najważniejsze. I ta wartość 3,276A po odłączeniu zasilania od IN+.

Tylko dlaczego nie odświeża wyniku pomiaru? Wygląda to tak, jakby tylko raz dokonał pomiaru i koniec.

EDIT :D

Już odkryłem dlaczego nie odświeża pomiaru. - Rejestr konfiguracyjny &H00 odpowiada za tryb pracy układu - ciągły lub wyzwalany. Tryb pracy ciągły to wartość 111. I tutaj był błąd w tym kodzie. Był zapis: 'W_low = &B00100111 , a powinien być W_low = &B00000111 dla ciągłej pracy. I teraz na bieżąco odświeża się wynik :)
Po podłączeniu VBUS do zasilania odbiornika czyli IN+ napięcie również wyświetla poprawnie na wyświetlaczu :)

Tylko dlaczego po odłączeniu zasilania od IN+, Wartość prądu wyświetla się 3,276A? Podłączenie IN+ do GND też nic nie zmienia. Przy zwarciu IN+ z IN- również wyświetla się ta wartość 3,276A.
Gdyby tak wartość 3,276 / 0,00005 = 65520, ale to zły trop.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: Michał6201 » 21 maja 2026, 0:38

Niestety nie dam rady tego kodu poprawić, żeby bez dołączonego obciążenia na wyświetlaczu pokazała się wartość prądu 0,00A

Albo ten program jest zwalony i do niczego się nie nadaje, albo ten INA226 nie potrafi poprawnie działać bez obciążenia. Nie znalazłem w internecie żadnych informacji na ten temat. A datascheet jest dla mnie niezrozumiały.

Obstawiam, że raczej zwalony jest ten program tutaj załączony. Połasiłem się na to badziewie i teraz jest problem. Mogłem zrobić pomiar prądu z użyciem wzmacniacza instrumentalnego i przetwornika ADC i nie byłoby takich cudów.
Teraz już za późno.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: niveasoft » 21 maja 2026, 0:58

Wyślij mi ten Twój moduł, albo zamów, na przykład ten LINK ALLEGRO na mój paczkomat , albo wyślij 25zł BLIK`iem to go sam zamówie i Ci to w weekend oprogramuje :lol:

Po prostu nie mam interesu w tym żeby go samemu kupić :P

Co do pomiaru prądu przez ADC to były jeszcze układy ACS712 ACS713. To tez mały układzik i nie potrzeba OP-AMP`a i ADC`ka
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: Michał6201 » 21 maja 2026, 19:20

Bardzo Ci dziękuję
Mam w domu dwa takie moduły. Wyślę Ci jeden fabrycznie zapakowany. Mi nie będzie potrzebny. Podaj tylko paczkomat.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: INA226 czy ktoś z Was ma działający kod w Bascom avr?

Post autor: niveasoft » 29 maja 2026, 5:42

Moduł dotarł, ale w tygodniu nie znalazłem czasu bo mnie zawalili robotą :D
Wymodzimy coś w weekend albo przed :D
ODPOWIEDZ