INA3221 board

118 views
Skip to first unread message

Bill Beek

unread,
Aug 8, 2025, 2:21:08 PMAug 8
to jallib
Hi all, is there anyone who has made a library for the INA3221 Three-Channel Shunt Current and Supply Voltage Monitor module (I2C)? I've been looking at the arduino lib to convert it to a JAL lib, but it's a bit too complicated for me. Greetings, Bill




Rob CJ

unread,
Aug 9, 2025, 1:01:01 PMAug 9
to jallib
Hi Bill,

Let's hope that somebody created something for JAL that can be turned into a JAL library.

I had a quick look at the Arduino library and it seems to be a number of small but readable functions and 'only' about 500 lines of source code so it seems douable to make a JAL library out of it. How far did you get porting it?

Kind regards,

Rob




Van: jal...@googlegroups.com <jal...@googlegroups.com> namens Bill Beek <bill...@gmail.com>
Verzonden: vrijdag 8 augustus 2025 20:21
Aan: jallib <jal...@googlegroups.com>
Onderwerp: [jallib] INA3221 board
 
Hi all, is there anyone who has made a library for the INA3221 Three-Channel Shunt Current and Supply Voltage Monitor module (I2C)? I've been looking at the arduino lib to convert it to a JAL lib, but it's a bit too complicated for me. Greetings, Bill




--
You received this message because you are subscribed to the Google Groups "jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jallib+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/jallib/d1457069-00f6-4edf-9e52-2ca8078b25b5n%40googlegroups.com.

Bill Beek

unread,
Aug 9, 2025, 1:49:50 PMAug 9
to jallib
Hi Rob,
TNX for your replay, 
I looked at it and found it too complicated to implement all the functions. By the way, I only use the Volt and Amp functions. So far I use an Arduino Nano and the INA3221 in a triple output power supply . But I like JAL much more.

Rob CJ

unread,
Aug 9, 2025, 2:05:05 PMAug 9
to jallib
Hi Bill,

What I could do is only implement the functions you are using instead of porting all functions. That would save time.  I do not have such a device so I cannot test it so if I have something you become the tester 🙂.

Can you tell me which Arduino functions you use from this library?

Kind regards,

Rob




Verzonden: zaterdag 9 augustus 2025 19:49
Aan: jallib <jal...@googlegroups.com>
Onderwerp: Re: [jallib] INA3221 board
 

Bill Beek

unread,
Aug 10, 2025, 5:45:44 AMAug 10
to jallib
Hi Rob, thank you for your quick response.
 Currently I have 1 INA3221 board left so I can still test.
 I now use the library of Rob Tillaart "INA3221_RT" 
#include "INA3221.h" INA3221
 INA(0x40);
 And the commands for initialization and default setup.
 INA.begin(); 
ch = 0 to 2
 U = INA.getBusVoltage(ch);
 I = INA.getCurrent_mA(ch);
 I hope this is enough info, 
Thank you very much for the effort. kind regards, Bill.

Bill Beek

unread,
Aug 10, 2025, 6:08:48 AMAug 10
to jallib

Sorry Rob I can't get the text to be organized properly. 

I'll try again.

Hi Rob, thank you for your quick response.

Currently I have 1 INA3221 board left so I can still test.

I now use the library of Rob Tillaart "INA3221_RT"

#include "INA3221.h"

INA3221 INA(0x40);

 And the commands for initialization and default setup.

INA.begin();

ch = 0 to 2

U = INA.getBusVoltage(ch);

 I = INA.getCurrent_mA(ch);

 I hope this is enough info,

Thank you very much for the effort.

kind regards, Bill.



Rob CJ

unread,
Aug 12, 2025, 1:29:02 PMAug 12
to jallib
Hi Bill,

Attached my first attempt of the library for the INA3321. I only implemented the functions you called.

I might add more functions later.

You find the libary and a sample program for a PIC16F1825 so you may need to swich to a PIC that you normally use. I only compiled it since I could not test it.

Can you give it a try.

Thanks.

Kind regards,

Rob



Verzonden: zondag 10 augustus 2025 12:08
16f1825_ina3321.jal
ina3321.jal

Rob CJ

unread,
Aug 12, 2025, 2:16:54 PMAug 12
to jallib
Hi Bill,

Small - but important - fix of the library.

Use this version.

Thanks

Kind regards,

Rob


Van: jal...@googlegroups.com <jal...@googlegroups.com> namens Rob CJ <rob...@hotmail.com>
Verzonden: dinsdag 12 augustus 2025 19:28
16f1825_ina3321.jal
ina3321.jal

Bill Beek

unread,
Aug 12, 2025, 2:33:39 PMAug 12
to jallib
Thank you Rob,
I will look at it later, this week is very hot in the shack in my attic.

thanks again,
kind regards Bill.

Bill Beek

unread,
Aug 16, 2025, 6:18:50 AMAug 16
to jallib

Hello Rob,

I tested the program, but unfortunately, I didn't get good results.

The current shows 1.6447997E1 with and without current.

The voltage shows 8.223999E0 with and without voltage.

So, nothing changes.

I looked at the datasheet and the library and made some adjustments, also without success.

 I also tried reading the config, ID, and manufacturer registers, all of which returned 4040h.

But I’m not sure if I dit that right.

Here is my version with a litle typo.

ina3221_bill.jal

Rob CJ

unread,
Aug 16, 2025, 7:05:52 AMAug 16
to jallib
Hi Bill,

I made a small mistake in the default IIC address 🙁. I fixed that.

Some other remarks. I saw in a video that the Arduino Library you mentioned is not correct. I saw in your update that you corrected that. I saw the same fix in an Arduino Library from Adafruit. I also saw you added a function to read the register values which is handy.

I added the changes to the attached library but I also added a timeout function. When the IIC communication is not working this function will return TRUE after you called it (after which it will be reset). I changed the call to the IIC routines so that it keep track of any timeout. I updated the samle program.

Next to that I changed the array with shunt resistor values by floats and set them by defaul to 0.1 Ohm which seems to be the commonly used value and I saw that was also the case in your update.

I think I will extend the library further and I am thinking of ordering a module to test. The library needs functions to change for example the shunt resistor value, etc.

So see if you still get non-changing values and check the timeout and if so, change the IIC address.

Kind regards,

Rob




Verzonden: zaterdag 16 augustus 2025 12:18
16f1825_ina3321.jal
ina3321.jal

Bill Beek

unread,
Aug 17, 2025, 2:32:44 PMAug 17
to jallib

Hi Rob, I have the program working.

When i looked at the registers it was very clear that I make some mistakes.

I changed the last version of the lib again because the shifting of the 3 lsb's turned out to be incorrect and the multiplication in the voltages was also incorrect.

The 3 LSBs do not participate, bit 4 is 8 mV, respectively 40 uV.

So just read the registers in the main program.

I no longer use a floating point for this, only word format.

The calculations, and the display format are done in the main program.

Finally, extending the lib would be nice, especially some configurations of the functions.

 The time out function is very useful.

I'll leave it up to you whether you go along with my solution, see the changed library.

kind regards, Bill.

ina3221_test.jal

Rob CJ

unread,
Aug 18, 2025, 7:00:08 AMAug 18
to jal...@googlegroups.com
Hi Bill,

I agree with you not to use floats and do the calculation in the main program. Yesterday I completed the library with all functions. I will first remove the floats and include your fix and will then send you the update. I also ordered the module so I can test all functions.

Met vriendelijke groet,
Rob Jansen

From: jal...@googlegroups.com <jal...@googlegroups.com> on behalf of Bill Beek <bill...@gmail.com>
Sent: Sunday, August 17, 2025 8:32:44 PM
To: jallib <jal...@googlegroups.com>
Subject: Re: [jallib] INA3221 board
 

Bill Beek

unread,
Aug 18, 2025, 9:42:22 AMAug 18
to jallib
Hi Rob, 
I look forward to the final version, thank you for your effort.
BTW the current function is not used, the calculation and calibrations
of the real resistance I do in the main program. 
By max current and dividing by 0.1 you need a dword in the present function.
I don't know how to handle the sign bit when there is negative current, I dont
use it at the moment , others will do maybe.

kind regards Bill. 

Rob CJ

unread,
Aug 18, 2025, 12:53:20 PMAug 18
to jallib
Hi Bill,

I was looking at changing all values from float to word and dword but because of that you need to define the shunt restors in uOhm, the shunt value in uV, the current in uA and the bus value in V. This makes it - I think - less logical for the user. When using floats it is all logical everything in Ohm, Amper and Volt.

So for know I kept the floats.

Attached the full library and a sample program. I did not change the calulations you mentioned since I do not know what you changed.

Can you give this version a try?

Once I have the module I will test all functions and if OK add this library and a sample program to Jallib.

Thanks.

Kind regards,

Rob


Verzonden: maandag 18 augustus 2025 15:42
16f1825_ina3221.jal
ina3221.jal

vsurducan

unread,
Aug 19, 2025, 12:34:16 AMAug 19
to jal...@googlegroups.com
Hi Rob, 
Perhaps using float will limit de usability of the library in fast processes or for small memory microcontroller size. 

Constant multiplication seems much faster assuring the precision you need. It has the disadvantage of an external computation using cmul executable and translation to jal code. ( btw, cmul.exe it should be included in the jal package if it is not already).

INA3221 seems to be very handy IC for energy measurement applications, except perhaps the limited common mode voltage, this might be a valuable library.

best wishes,
Vasile


Bill Beek

unread,
Aug 19, 2025, 9:24:15 AMAug 19
to jallib

Hi Rob,

 I tested the bus voltage, shunt_voltage and current functions, unfortunately it didn't work.

So I looked at the lib and saw that the 3 lsb's shift were still present.

The multiplication was also incorrect, the whole word value must be used.

The 3 lsb's simply don't participate, so the multiply factor for the bus_voltage is 1 mV and for the shunt_voltage 5 uV, however, the resolution is then 8 mV and 40 uV respectively.

Bits 15 to 3 contain the measured values. After the change, those functions worked properly.

Btw Vasile the common mode I chose an inverting opamp in case of negative voltages and the ADC of the PIC.

The current is measured by INA3221 on the common side.

Kind regards, Bill.

ina3221_b.jal

Rob CJ

unread,
Aug 19, 2025, 1:41:11 PMAug 19
to jallib
Hi Bill,

Ah, now I understand. What I do not understand is that this is also incorrect in other - Arduino - Libraries. I applied your corrections. Thanks for that.

BTW. I did not yet address negative voltages, will do that when testing the module to see if that works at all.

I made a second version without floats. This means:
-) Shunt resistor must be in mOhm
-) Shunt voltage is in uV
-) Current is in uA
-) Bus voltage is in mV

When compiling these are the differences.

Version without floats:
Code area: 1485 of 8192 used (words)
Data area: 111 of 1024 used
Software stack available: 80 bytes
Hardware stack depth 4 of 16

Version with floats:
Code area: 2427 of 8192 used (words)
Data area: 139 of 1024 used
Software stack available: 80 bytes
Hardware stack depth 4 of 16

I attached both version and called the new one 'no_float'. So the question is which one should be in Jallib?

Kind regards,

Rob




Verzonden: dinsdag 19 augustus 2025 15:24
16f1825_ina3221_no_float.jal
ina3221_no_float.jal
16f1825_ina3221.jal
ina3221.jal

pinhe...@gmail.com

unread,
Aug 19, 2025, 1:44:39 PMAug 19
to jallib
Sorry to break in, i followed this subject from far away....

My opinion is that botj version should go to the lib.

Maybe one file with "define" to choose between float or integer?

Just my 2 cents....

Rob CJ

unread,
Aug 19, 2025, 1:52:24 PMAug 19
to jallib
Hi David,

Yes I can make one version and use a define "INA3221_USE_FLOAT". 

The default is then that it uses words and dwords.

Thanks for the suggestion.

Kind regards,

Rob


Van: jal...@googlegroups.com <jal...@googlegroups.com> namens pinhe...@gmail.com <pinhe...@gmail.com>
Verzonden: dinsdag 19 augustus 2025 19:44

Bill Beek

unread,
Aug 20, 2025, 5:01:36 AMAug 20
to jallib
Hi Rob,
Both versions working fine.
I will wait for the final version with float and integers and test again

BTW when somebody needs higher resolution for voltage the ADS1115 board offers
4 channels 16 bits or 2 channels differential measurements maybe project for the future.

Thanks for the good work, Bill 

Rob CJ

unread,
Aug 20, 2025, 1:04:24 PMAug 20
to jallib
Hi Bill,

That is good to hear and thanks for testing it.

I combined it in one library and one sample program. Default is the use of word/dword. If you want to use the float version then define the following before including the library (also shown in the sample program):
-) INA3221_USE_FLOAT = TRUE

Attached the update.

Kind regards,

Rob


Verzonden: woensdag 20 augustus 2025 11:01
16f1825_ina3221.jal
ina3221.jal

Bill Beek

unread,
Aug 21, 2025, 2:37:20 PMAug 21
to jallib
Hi Rob,
I tested the combined lib, and i found 1 bug in the integer part.
In case of current >  ~ 43 mA the value was not correct, I think overload of the dword.
In the shunt voltage was 2 times multiplied by 1000 when I correct that the measurements
are okay.
Kind regards, Bill.
ina3221_c.jal

Rob CJ

unread,
Aug 21, 2025, 3:25:54 PMAug 21
to jallib
Hi Bill,

Yes, strange that I multiplied it twice. Good that you found it.

I am still waiting for the module to arrive so that I can test all library functions.

I will let you know when I added the library and the sample to Jallib. It will then be in the next bee-package.

Kind regards,

Rob

Verzonden: donderdag 21 augustus 2025 20:37

rob...@hotmail.com

unread,
Aug 30, 2025, 6:13:32 AM (9 days ago) Aug 30
to jallib
Hi Bill,

I completed the library, tested all functions with a module I purchased. It should be using floats and not using floats.

Attached the library and a simple sample program.

I will add it later to Jallib.

If you find something strange or you are missing something, let me know.

Kind regards,

Rob



Op donderdag 21 augustus 2025 om 21:25:54 UTC+2 schreef rob...@hotmail.com:
ina3221.jal
16f1825_ina3221.jal

Bill Beek

unread,
Aug 31, 2025, 9:32:33 AM (8 days ago) Aug 31
to jallib
Hi Rob,
I have tried to test but nothing happens, no serial output too, I think my 16F1825 is broken.
Now I will port it to another PIC and try out the lib.
I post my findings later.

Kind regards, Bill.

Bill Beek

unread,
Aug 31, 2025, 2:25:23 PM (8 days ago) Aug 31
to jallib

Hi Rob, during testing I ran into a problem.

If the current becomes negative, you lose the sign (bit 15).

If bit 15 becomes high, the measured value increases by 32760, (the 3 LSB's don't count).

That was also the reason that I limited myself to using int "words" in the library.

I have Adapted the library and delete some floats to test the phenomenon.

In the main program I use "swords".

I send my versions for checking.

Kind regards, Bill.
ina3221_s.jal
18F2520_INA3221_S.jal

Rob CJ

unread,
Sep 1, 2025, 12:51:25 PM (7 days ago) Sep 1
to jal...@googlegroups.com
Hi Bill,

Ah, I forgot to take negative voltages (and currents) into account. In the documentation - when the voltage is negative and the sign bit is set - yo need to take the two's complement not only the sign.

Will fix it both for sword/sdword and floats.

BTW. You use word for the voltage in your sample program but if the current becomes negative, the voltage should also be negative. So why not use sword for the voltage too?

Kind regards,

Rob




Verzonden: zondag 31 augustus 2025 20:25

Bill Beek

unread,
Sep 1, 2025, 1:27:02 PM (7 days ago) Sep 1
to jallib
I had no need for negative voltages, because of common mode limitations. I blow up one INA3221 board when I connect negative and positive voltages.
I look forward for the changed lib
Kind regards, Bill

Rob CJ

unread,
Sep 1, 2025, 1:52:30 PM (7 days ago) Sep 1
to jal...@googlegroups.com
Hi Bill,

I read the following.

No, the INA3221 cannot measure voltages on a negative rail where the rail voltage is below the INA3221's own ground (GND) reference
, because its common-mode voltage (VCM) range is limited. To measure current on a negative voltage rail, you would need to use an alternative device like the INA296A/B, or design a circuit to float the INA3221's ground with the negative rail and use a digital isolator to communicate with the microcontroller, as detailed in reference designs from TI E2E

How do you get negative currents?

Kind regards,

Rob


Verzonden: maandag 1 september 2025 19:27

vsurducan

unread,
Sep 1, 2025, 2:04:11 PM (7 days ago) Sep 1
to jal...@googlegroups.com
Hi all,
You can do it without digital isolator if you use an AD8479 as analog level shifter.
It's a bit expensive but it's spectacular.
best wishes,
Vasile

Bill Beek

unread,
Sep 1, 2025, 2:15:15 PM (7 days ago) Sep 1
to jallib
Hi Rob, i use a circuit for testing batteries (charging and de charging) without switching the connections.
Something like your project with  the 16F1765 but less advanced. 

Kind regards, Bill.

Bill Beek

unread,
Sep 1, 2025, 2:27:12 PM (7 days ago) Sep 1
to jallib
Hi Rob and Vasile,
Now I use a opamp to reverse the voltage and measure it with the PIC , the current of the negative voltage is
measured in the common connection witch is high side of the negative output of a triple voltage power supply. 
BTW this is not the battery circuit.

Rob CJ

unread,
Sep 2, 2025, 3:09:47 AM (7 days ago) Sep 2
to jal...@googlegroups.com
Hi Bill,
So when discharging the current becomes negative because the flow is from the load (instead of to the load)? What is the bus voltage in that case, zero Volt?

If the Ina3221 cannot handle negative voltages why do they mention negative voltages in the data sheet for the bus voltage?

Btw. This ic was indeed a nice ic for the project that I did some time ago.

Met vriendelijke groet,
Rob Jansen

Sent: Monday, September 1, 2025 8:27:12 PM
You received this message because you are subscribed to a topic in the Google Groups "jallib" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/jallib/vQ2yGwjildU/unsubscribe.
To unsubscribe from this group and all its topics, send an email to jallib+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/jallib/79ef541d-439c-401a-80ee-52a583a2ec98n%40googlegroups.com.

Bill Beek

unread,
Sep 2, 2025, 6:40:02 AM (6 days ago) Sep 2
to jallib
Hi Rob,

I also didn't understand why the bus voltage has a - sign. Perhaps because of the uniformity of the data. 

The (LiPo) battery is charged or discharged, so the voltage remains positive.

The handy thing about the IC is that you can set various limits.

Met vriendelijke groet,
Bill

Rob CJ

unread,
Sep 4, 2025, 3:07:22 PM (4 days ago) Sep 4
to jallib
Hi Bill,

Reading is an art. I saw that the negative voltages are only mentioned for the shunt voltage not the bus voltage. Missed that.

I got it working - I think - for word an sdword but not yet for floats. As you mentioned I connected a battery and a load that discharges the battery and so the bus voltage shows the battery voltage and the shunt voltage and current are both negative. 

Before I ordered the module I saw in the reviews that you need the correct module. Apparently for many modules the V- is not free on the module but connected to ground.  Luckily I ordered the module where both the V- and V- are free otherwise I could not have created the set-up for the negative current.

I also found strange behaviour in de compiler when using float.
The construction -5.0 * float(value) does not work while 5.0 * -float(value) does (found it out by trial an error). Value is a word in this case.

Still need to fix the float version and do some tests since the critical alerts and warning alerts should also work for negative shunt voltages.

Kind regards,

Rob


Verzonden: dinsdag 2 september 2025 12:40

Rob CJ

unread,
Sep 5, 2025, 4:36:52 AM (4 days ago) Sep 5
to jallib
Hi Bill,

Fixed the negative current issue for sdword and and floats. Uploaded it to Github and attached to this e-mail.

Can you let me know if it works for you?

Thanks.

Kind regards,

Rob



Van: jal...@googlegroups.com <jal...@googlegroups.com> namens Rob CJ <rob...@hotmail.com>
Verzonden: donderdag 4 september 2025 21:07
16f1825_ina3221.jal
ina3221.jal

rob...@hotmail.com

unread,
Sep 6, 2025, 12:37:29 PM (2 days ago) Sep 6
to jallib
Hi all,

I made a video for the ina3221.jal library using the sample program in the demo.

Kind regards,

Rob


Op vrijdag 5 september 2025 om 10:36:52 UTC+2 schreef rob...@hotmail.com:

rob...@hotmail.com

unread,
Sep 6, 2025, 12:38:14 PM (2 days ago) Sep 6
to jallib
Hi all,

Maybe good to have the link: https://youtu.be/DnbKhWO-eWY

Kind regards,

Rob


Op zaterdag 6 september 2025 om 18:37:29 UTC+2 schreef rob...@hotmail.com:

Bill Beek

unread,
Sep 6, 2025, 2:24:48 PM (2 days ago) Sep 6
to jallib
Hi Rob, 

Everything works well for me now.

You got lucky, my first board was not suitable for my application, I have to cut some PCB tracks. 

I hope you can fix the problems with the compiler.

Thanks for all the effort.

Kind regards,

Bill.



Rob CJ

unread,
Sep 7, 2025, 3:58:36 AM (yesterday) Sep 7
to jallib
Hi Bil,

Good to hear that it works. About the module.  By chance I saw a video on Youtube from somebody who did the same thing as you to cut the tracks. When I was looking for the module on Aliexpress there where comments about the same issue - initially I did not undertand what they were talking about - so I looked for a board that did not have the connections to ground. The other board is of course usable as long as you do not have negative currents.

Keep in mind that the last update of the library is in the latetest bee-package (available on the JAL website) including an updated sample program that also shows the operatioin of the alerts that I used in the video. 

Good luck with your project and glad that I got you off the Arduino 🙂.

Kind regards,

Rob




Verzonden: zaterdag 6 september 2025 20:24

Bill Beek

unread,
6:48 AM (11 hours ago) 6:48 AM
to jallib

Hi Rob, 

Nice video of the INA3221 and well documented.

Now and I'm working on an Oled display SSD1306 with 6x8 font,

because I found the letters a bit too small, I tried larger fonts,

 (12x16) or (8x12). Unfortunately this gives a mess on the screen.

Do you know if there are special settings to set larger characters?

Kind regards,

Bill.

Rob CJ

unread,
1:20 PM (5 hours ago) 1:20 PM
to jallib
Hi Bill,

Thanks. I do not script the video so that's why you sometimes hear 'ah, uh' ...

I ran into the same issue when making the Adjustable current source and current sink. I initially thought that it might be because some fonts are vertical oriented and not horizontal but did not check that at that time. The fonts you mentioned are not vertical oriented so their might be an issue with one of the libraries, not specific the SSD1306 library but another library that handels the fonts. 

Since I finished the ina3221 library I can have a look at it but it will not be within the coming 2 weeks since I will be away. If you find something in the meantime let me know.

Note that the SSD1306 does not fully comply with the style guide of JAL since I was not aware of the guide when I created that library. The issue is that the import and initialization of the IIC library should be done by the main program, not by the library (which it currently does) and that need fixing (not much work) but this will be a breaking change for anybody who has used this library before.  Because of that I did not change it but if the SSD1306 library needs a fix, I might fix the IIC issue too.

Kind regards,

Rob





Verzonden: maandag 8 september 2025 12:48
Reply all
Reply to author
Forward
0 new messages