INA219例程

INA219

简介

26V、双向、零漂移、低侧/高侧、I2C 输出电流/功率监控器,可以用来检测电流,电压,功率。

INA219例程_第1张图片
INA219例程_第2张图片
这款芯片有两种封装,这些是引脚定义:

IN+和IN_:分别是接检测分流电阻的两端。

GND:接电源负极

Vs:电源正极(电压范围:3-5.5V)

SCL:通讯时钟线

SDA:通讯数据线

A0和A1:地址选择引脚(接到不一样的地方对应的地址不一样,地址对应表如下图)

INA219例程_第3张图片

电路图:

INA219例程_第4张图片

这是简易的电路图,主要是一个分流电阻的接法,负载是跟分流电阻串联的。

寄存器:

INA219例程_第5张图片
通讯协议使用的是IIC通讯协议。INA219一共有6个寄存器,分别功能为:

00:配置寄存器,主要是用来配置INA219的工作方式和参数    

01:分流电阻电压

02:总线电压

03:功率

04:电流

05:基准值寄存器,用于设置基准值

00寄存器:配置寄存器

INA219例程_第6张图片

bit15:复位位,用于复位整个INA219,将改为设为1则复位。

bit14:保留位

bit13:设置检测最大检测电压    0=16V,1=32V;

bit11,12:设置总线分流电阻最大的电压,后面用于计算最大检测电流。参数如下表(灰色为默认值)

INA219例程_第7张图片

bit7-10:这些位设置总线电压ADC分辨率(9,10,11,或12位)(02寄存器)

bit3-6:这些位调整分路ADC分辨率(9,10,11,或12位)

INA219例程_第8张图片

bit0-2:设置工作模式:(灰色为默认工作模式:连续检测模式)

INA219例程_第9张图片

02寄存器:总线电压寄存器,用于存储检测到当前总线的电压

bit0:转换完成标志位(个人理解)

bit1:溢出标志位:当电流超出设置的功率或电流的范围

bit2:保留位

bit3-15:保持总线电压位。

03寄存器:功率寄存器,用于存储当前检测的消耗功率


04寄存器:电流寄存器,用于存储当前检测的电流

05寄存器:基准值存放寄存器,用于计算功率和电流


基准值的计算:

首先确定硬件参数: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例程_第10张图片

因为INA219寄存器是16为的,但是iic发送一次为8位,所有需要分开发送。

start->发送INA219地址->发送需要操作的寄存器地址->发送高8位->发送低8位->stop

这就是操作寄存器的步骤了。

读取寄存器部分:

INA219例程_第11张图片

同样我们读取也需要分开两次读取。

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的心得。不保证完全正确,如有错误望各位大神们指出。写出来为了方便给各位跟我一样刚学的朋友们一点参考,同时也记录一下我自己的成长,以后忘记了,自己也可以回来看看。

你可能感兴趣的:(项目)