IN+和IN_:分别是接检测分流电阻的两端。
GND:接电源负极
Vs:电源正极(电压范围:3-5.5V)
SCL:通讯时钟线
SDA:通讯数据线
A0和A1:地址选择引脚(接到不一样的地方对应的地址不一样,地址对应表如下图)
这是简易的电路图,主要是一个分流电阻的接法,负载是跟分流电阻串联的。
00:配置寄存器,主要是用来配置INA219的工作方式和参数
01:分流电阻电压
02:总线电压
03:功率
04:电流
05:基准值寄存器,用于设置基准值
bit15:复位位,用于复位整个INA219,将改为设为1则复位。
bit14:保留位
bit13:设置检测最大检测电压 0=16V,1=32V;
bit11,12:设置总线分流电阻最大的电压,后面用于计算最大检测电流。参数如下表(灰色为默认值)
bit7-10:这些位设置总线电压ADC分辨率(9,10,11,或12位)(02寄存器)
bit3-6:这些位调整分路ADC分辨率(9,10,11,或12位)
bit0-2:设置工作模式:(灰色为默认工作模式:连续检测模式)
bit0:转换完成标志位(个人理解)
bit1:溢出标志位:当电流超出设置的功率或电流的范围
bit2:保留位
bit3-15:保持总线电压位。
首先确定硬件参数:R(检测电阻的阻值)=0.1R,设置最大检测电压为:32V,设置电阻电压范围为320mV
I_MAX(最大能检测的电流)=0.32V/0.1R=3.2A
I_LSB_MIN=I_MAX/(2^15)=3.2/32767=97*10^-6
I_LSB_MAX=I_MAX/(2^12)=3.2/4096=0.00078125
I_LSB的选值范围为 I_LSB_MIN和I_LSB_MAX之间,选择靠近I_LSB_MIN
这里选择100*10^-6
I_LSB=100*10^-6=100uA=0.0001A(每位对应的电流大小)
计算基准值:Cal=0.04096/(I_LSB/R)=0.04096/(0.0001A*0.1)=4096=0x1000
当配置时05寄存器的值为:0x1000
计算功率LSB
P_LSB=20*I_LSB=20*0.0001A=0.002W
标准的iic部分我就放出来了 ,只放出操作INA219部分。本人使用的是基于stm32,io模拟iic
操作寄存器部分:
因为INA219寄存器是16为的,但是iic发送一次为8位,所有需要分开发送。
start->发送INA219地址->发送需要操作的寄存器地址->发送高8位->发送低8位->stop
这就是操作寄存器的步骤了。
读取寄存器部分:
同样我们读取也需要分开两次读取。
start->发送INA219地址->发送需读取的寄存器地址->start->发送INA219地址+0x01(让从机知道我需要读取数据)->
读取出高8位->发送应答->读取低8位->不应答->stop
这就是INA219读取寄存器的步骤了。
初始化INA219:
1、先配置00寄存器,参数是根据上面表格和自己所需的工作模式得出的。
2、配置05寄存器,4096为上面计算所得。
就这样INA219就配置完成了 。
获取电压函数(单位:mv):
首先发送0x02寄存器地址,然后读取出16位的数据,因为刚刚也介绍了。0x02寄存器最低三位是有功能的,不是存储转换的电压值,所以我们需要去掉这三位,“data_temp[0]<<8)+data_temp[1]) >> 3”这里先合并高8位和低8位,然后右移三位就去掉了最低三位,最后根据官方文档说明,读出来的数据需要乘以上4MV所以就得到:“(data_temp[0]<<8)+data_temp[1]) >> 3)*4”计算所得出来的就是检测到当前的电压,单位为:mv,需要转换为V就再除以1000就可以了。
获取电流函数(单位:mv):
首先,有时候防止外在原因导致寄存器配置丢失,我们可以重新配置一下0x00寄存器,然后一样,读取书0x04寄存器的值,
合并两位数据,“(data_temp[0]<<8)+data_temp[1])”再乘以0.1MV(0.0001uV)根据上面计算所得,个人理解为,每一位数据对应就是电压0.1mV。然后就得到当前总线的电压。
获得功率函数(单位:mw):
首先,读取书0x04寄存器的值,合并两位数据,再乘以2MV根据上面计算所得。个人理解为,每一位数据对应就是功率2mw。然后就得到当前的功率。
程序源码
这些都是我本人学习INA219的心得。不保证完全正确,如有错误望各位大神们指出。写出来为了方便给各位跟我一样刚学的朋友们一点参考,同时也记录一下我自己的成长,以后忘记了,自己也可以回来看看。