【STM32-INA219微电流检测】
概述
本篇采用INA219实时监测4mA内的电流值,电流精确到uA。
设计
1.原理
INA219检测电流的原理是计算电流经过采样电阻两端的压差,进行计算得到,整个过程由芯片自动计算,因此只需要确定好采样电阻、设置好寄存器即可获取到电流值。
根据芯片手册,经过分流电阻\(N\)(采样电阻)后,能够采集到的最低有效电压\(LSB\)为10uV。
最小电流参数 \(I_{LSB} = Current\_LSB\) 非常重要,有两种计算方法:
1. 电流公式(1)
\(LSB = 10\mu V\)
\(R = N\Omega\) (采样电阻阻值)
INA219 | 计算公式 |
---|---|
最小电流(分辨率) | \(I_{LSB} = \frac{LSB}{R} = \frac{10\mu V}{N\Omega} (\mu A)\) |
最大电流 | \(I_{MAX} = I_{LSB} \times 2^{12}(\mu A)\) |
最大电流(x8倍) | \(I_{8} = I_{MAX} \times 8\) |
INA219为12位分辨率,即 \(2^{12}=4096\)
由于芯片内置放大器,可将电流值由1倍增益放大2、4、8倍,最大可测电流为\(I_{8}\)。
2. 电流公式(2)
首先,找到需要检测的最大电流所对应的电阻两端最大电压。如果需要8倍增益,则查表得,PGA=/8 代表最大电流(x8倍),其对应320mV。
\(R_{VMAX} = 320mV\) (查表得)
\(R = N\Omega\) (采样电阻阻值)
INA219 | 计算公式 |
---|---|
最大电流 | \(I_{MAX} = \frac{R_{VMAX} (mV)}{R(\Omega)}(mA)\) |
最小电流(分辨率) | \(I_{LSB} = \frac{I_{MAX}}{2^{15}}(mA)\) |
2.计算采样电阻阻值
检测4mA内电流,需要精度越高越好,分辨率最好在uA级别。
这里使用电流公式(1)计算:
若 \(R = 5\Omega\) :
最小分辨率 \(I_{LSB} = \frac{10\mu V}{5\Omega} = 2\mu A\)
最大检测电流 \(I_{MAX} = 2\mu A \times 4096 = 8.192mA\)
8倍增益后最大检测电流 \(I_{8} = 8.192mA \times 8 = 65.536mA\)
若 \(R = 10\Omega\) :
最小分辨率 \(I_{LSB} = \frac{10\mu V}{10\Omega} = 1\mu A\)
最大检测电流 \(I_{MAX} = 1\mu A \times 4096 = 4.096mA\)
2倍增益后最大检测电流 \(I_{2} = 4.096mA \times 2 = 8.192mA\)
8倍增益后最大检测电流 \(I_{8} = 4.096mA \times 8 = 32.768mA\)
选用 \(10\Omega\) 精度更高,但需要注意若超过4mA会超过量程(可能烧坏芯片),可配置寄存器设置为2倍或更高。
【此处我选择了5Ω,增益为1倍】
原理图
注:采样电阻更换为计算得到的阻值
根据手册,采样率大于1MHz时会出现高频噪声,可以在输入引脚串联低电阻和电容,形成滤波器过滤杂波
A1 A0下拉,查表得前7位:1000000,第0位读写位0或1,IIC地址为0x80、0x81
寄存器配置
INA219按要求正常工作的话,需要将校准值、模式配置写入寄存器;获取电压、电流等参数,也需要读取寄存器。
寄存器 | 地址 | 功能 |
---|---|---|
模式配置寄存器(读/写) | 0x00 | 设置量程、分辨率、工作模式等 |
分流电阻电压寄存器(只读) | 0x01 | 存储分流电阻上的压降测量值 |
总线电压寄存器(只读) | 0x02 | 存储总线电压测量值 |
功率寄存器(只读) | 0x03 | 存储计算出的功率值 |
电流寄存器(只读) | 0x04 | 存储计算出的电流值 |
基准(校准)寄存器(读/写) | 0x05 | 设置校准值,用于电流 / 功率计算 |
1.基准(校准)寄存器 0x05
功能: 通过设置校准值,定义电流测量的分辨率(LSB),间接决定电流和功率的测量范围与精度。
格式: 16 位寄存器,无固定位定义,值需通过公式计算。
- 校准参数 \(Cal\) 由公式(1)得出,其中 \(Current\_LSB\) 由公式(2)得出
-
\(Current\_LSB\) 为最小分辨率,即 \(I_{LSB}\) ,在这个公式中其单位要转成 \(A\)
-
\(R_{SHUNT}\) 为采样电阻 \(R = N\Omega\)
-
\(trunc()\) 为取整函数
我们使用 \(5\Omega\) 采样电阻时,可通过以上公式计算出校准参数:
\(R_{SHUNT} = 5\Omega\)
\(Current\_LSB\) $ = $ \(I_{LSB} = 2\mu A\) $ = 0.000002 A $
\(Cal = trunc(\frac{0.04096}{Current\_LSB \times R_{SHUNT}})\)
\(Cal = trunc(\frac{0.04096}{0.000002 \times 5}) = 4096\)
4096 = 0x1000
INA219_WriteReg(0x05, 0x1000); // 写入校准值
2.模式配置寄存器 0x00
功能: 配置芯片的电压量程、增益、ADC 分辨率、工作模式等核心参数,复位后需重新配置。
格式: 16 位寄存器,位定义如下(从高位到低位):
位序号 | 位名称 | 功能描述 |
---|---|---|
15 | RESET | 复位控制:1 = 芯片复位(所有寄存器恢复默认值),0 = 正常工作(写 1 后自动清零) |
14-13 | BRNG | 总线电压量程选择: 00=16V(最大测量 16V,分辨率 4mV/LSB) 01=32V(最大测量 32V,分辨率 8mV/LSB) (注:实际总线电压需≤36V 绝对最大值) |
12-11 | PGA | 分流电压增益(PGA)选择(决定分流电压量程): 00=±40mV(增益 ×1) 01=±80mV(增益 ×2) 10=±160mV(增益 ×4) 11=±320mV(增益 ×8) |
10-7 | BADC | 总线电压 ADC 分辨率 / 采样时间: 0000=9 位分辨率(单次采样,无滤波,84μs) 0001=10 位分辨率(单次采样,无滤波,148μs) 0010=11 位分辨率(单次采样,无滤波,276μs) 0011=12 位分辨率(单次采样,无滤波,532μs) 0100=12 位分辨率(2 次采样平均,弱滤波,1.06ms) 0101=12 位分辨率(4 次采样平均,中弱滤波,2.13ms) 0110=12 位分辨率(8 次采样平均,中滤波,4.26ms) 0111=12 位分辨率(16 次采样平均,中强滤波,8.51ms) 1000=12 位分辨率(32 次采样平均,强滤波,17.02ms) 1001=12 位分辨率(64 次采样平均,超强滤波,34.05ms) 1010=12 位分辨率(128 次采样平均,最强滤波,68.10ms) |
6-3 | SADC | 分流电压 ADC 分辨率 / 采样时间: 【同上】 BADC(位 10-7),用于设置分流电压的 ADC 参数 |
2-0 | MODE | 工作模式选择(决定测量对象和频率): 000 = 断电模式(省电) 001 = 分流电压单次测量 010 = 总线电压单次测量 011 = 分流 + 总线电压单次测量 100 = 仅分流电压连续测量 101 = 仅总线电压连续测量 110 = 保留 111 = 分流 + 总线电压连续测量 |
RESET | BRNG | PGA | BADC | SADC | MODE |
---|---|---|---|---|---|
0 | 01 | 00 | 0000 | 1010 | 111 |
0010 0000 0101 0111 = 0x2057
// 写入带滤波功能的配置值
INA219_WriteReg(0x00, 0x2057);
3.只读寄存器 0x01-0x04
这些寄存器存储测量结果,无需配置,但需理解其数据格式以正确转换为物理量。
1. 分流电压寄存器(0x01)
- 格式:16 位有符号补码,分辨率 10μV/LSB(固定)。
- 转换公式: $ V_{\text{SHUNT}} = \text{寄存器值} \times 10\mu\text{V} $
- 示例:若寄存器值为 0x0080(十进制 128),则 $ V_{\text{SHUNT}} = 128 \times 10\mu\text{V} = 1.28\text{mV} $
2. 总线电压寄存器(0x02)
- 格式:16 位,高 13 位有效(低 3 位为状态位,需忽略)。
- 分辨率:
- 当 BRNG=00(16V 量程):4mV/LSB;
- 当 BRNG=01(32V 量程):8mV/LSB。
- 转换公式: $ V_{\text{BUS}} = (\text{寄存器值} >> 3) \times \text{分辨率} $
- 示例:16V 量程下,寄存器值为 0x1000(二进制 0001 0000 0000 0000),则 $ V_{\text{BUS}} = (0x1000 >> 3) \times 4\text{mV} = 0x200 \times 4\text{mV} = 512 \times 4\text{mV} = 2.048\text{V} $
3. 电流寄存器(0x04)
- 格式:16 位有符号补码,单位为 Current_LSB(由校准寄存器决定)。
- 转换公式:$ I = \text{寄存器值} \times \text{Current_LSB} $
- 示例:若 Current_LSB=1mA/LSB,寄存器值为 0x0064(十进制 100),则 $ I = 100 \times 1\text{mA} = 100\text{mA} $。
4. 功率寄存器(0x03)
- 格式:16 位有符号补码,单位为 Power_LSB(固定为 20×Current_LSB)。
- 转换公式:$ P = \text{寄存器值} \times \text{Power_LSB} $
- 示例:若 Power_LSB=20mA(对应 Current_LSB=1mA),寄存器值为 0x000A(十进制 10),则 $ P = 10 \times 20\text{mA} = 200\text{mW} $
五、配置流程总结
- 复位芯片:向配置寄存器写入 0x8000,确保寄存器初始化为默认值。
- 配置工作参数:设置配置寄存器(量程、增益、ADC 分辨率、工作模式)。
- 写入校准值:根据采样电阻和目标分辨率计算校准值,写入校准寄存器。
- 读取测量值:从 0x01-0x04 寄存器读取数据,按公式转换为物理量。
关键注意事项
- 校准值直接决定测量精度,需根据实际采样电阻精确计算。
- 分流电压量程(PGA 设置)需与采样电阻、最大电流匹配,避免超量程(建议实际最大压降 < 量程的 90%)。
- 高分辨率(如 12 位 + 多次平均)可提高精度,但会增加测量时间;快速测量需牺牲分辨率。
通过以上配置,INA219 可实现高精度的电流、电压、功率监测,适用于电池管理、电源监控等场景。