This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] INA219:INA219电流计算

Guru**** 1109750 points
Other Parts Discussed in Thread: INA219
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/1275345/ina219-ina219-current-calculations

器件型号:INA219

您好、专家!

我尝试从 INA219器件读取电流。 我已成功读取总线电压、表明 I2C 驱动器工作正常。 但是、当我读取电流时、接收到的值大约比预期高2.2倍(我通过与 Fluke 测量进行比较来验证了这一点)。 根据 Fluke 的测量结果、我正在使用的电流大约400 -500 mA、因此这种差异很明显。

以下是我设置的默认值:

#define INA219_SHUNT_RESISTOR_Ohm 0.004f
#define INA219_CURRENT_LSB_A 0.0004f
#define INA219_CALIB_VALUE (((uint16_t)(0.04096f / (INA219_CURRENT_LSB_mA * INA219_SHUNT_RESISTOR_Ohm))) << 1)
#define INA219_POWER_LSB_W (INA219_CURRENT_LSB_A * 20.0f)

寄存器值为:

0x00 配置 0x0443 增益= 1;范围= 40mV、BADC = 1 (总线过采样)、SADC = 1 (分流过采样)、分流和总线、触发
0x05 校准 0xC800

ina219.bus_voltage = (float)(bus_voltage_raw >> 3) * 4.0;               // mV
ina219.shunt_voltage = (float)((int16_t)shunt_voltage_raw) / 100.0;     // mV
ina219.current = (float)current_raw * INA219_CURRENT_LSB_A * 1000.0;    // mA
ina219.power = (float)power_raw * INA219_POWER_LSB_W * 1000.0;          // mW

您能帮我确认一下错误吗? 我已经检查了自己多次,没有找到它。

提前感谢您、
Genadi.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    所有的电流值是否都约为预期电流读数的2倍?

    如果是这种情况、则很可能是校准寄存器值中的简单错误、寄存器中的数字代码不会映射到您期望的适当值。  

    我们有一个电源监控器工具、可以根据您的器件和参数为您提供写入配置寄存器的值。

    它可以下载在这里: SBOR021计算工具| TI.com

    这是需要写入校准寄存器的示例、具体取决于要映射到寄存器中最高数字值的电流。  

    您将测量的最低和最大电流值大概是多少?

    400 -500mA 是涵盖范围吗?

    如果是这种情况、您可能需要考虑使用更大的分流电阻值。

    使用最高的500mA 电流、您只需在4mΩ 分流器上实现2mV 的电压、这只是配置中±40mV 范围的一小部分。  

    这意味着测量精度较低、这可能是值与您预期不同的另一个原因。

    此致、

    天使

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Angle 的全面回答。

    我要测量的电流可以是从20 mA 到2000 mA 的任何范围。 我不一定需要非常精确的测量、但相差2.2倍是非常显著的。 我的主要关注点是确保系统正常运行、不会出现任何意外问题。

    非常感谢您之前提供的工具。 但是、当我输入参数时、结果有点不清楚。 建议将电流 LSB 设置为0.000061035、将校准寄存器值设置为167772。 但是、根据数据表、校准值的长度为15位、因此此建议超出了允许的范围。 这就是我选择将电流 LSB 设置为0.0004A 的原因。

    我已经采取措施通过读取校准寄存器并使用示波器来验证写入该寄存器的值。 这表明问题可能在系统中的其他地方。

    您能否确认我使用的公式是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Genadi、  

    我会咨询团队、以获取解决此问题的可能建议、并根据您的设置验证应写入配置和校准寄存器的内容。  

    同时、您能从您的设置中向我们提供尽可能多的详细信息吗? 这将帮助我们确定是否还有其他问题、或帮助我们就写入配置寄存器的内容提供建议。

    您的电流读数是否始终比预期值大2.2倍、还是结果变化显著?

    您正在从当前寄存器中读取什么内容、而您希望看到什么内容(十进制/十六进制/二进制输出代码)?

    分流电压寄存器读数如何?

    您的 VS 电源、总线电压等是什么?  

    您能给我们提供一个原理图吗?

    此致、

    天使

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Angle、

    以下是电路中的分流电阻器:

    这里是 INA219本身:

    下面是我从 I2C 获得的原始读数以及转换后获得的电流和分流电压的表格:

    电流_原始 电流_ mA 分流_电压_原始 分流电压 mV 福禄克_ mA
    0x41A 420 0x54 0.84 173.5
    0x3DC 395.199982 0x4F 0.79 173.5
    0x41A 420 0x54 0.84 173.5
    0x3B6 380 0x4C 0.76 173.5
    0x41A 420 0x54 0.84 173.5
    0x40E 415.199982 0x53 0.83 173.5
    0x40E 415.199982 0x53 0.83 173.5
    0x41A 420 0x54 0.84 173.5
    0x3B6 380 0x4C 0.76 173.5
    0x41A 420 0x54 0.84 173.5
    0x3B6 380 0x4C 0.76 173.5
    0x41A 420 0x54 0.84 173.5
    0x41A 420 0x54 0.84 173.5
    0x41A 420 0x54 0.84 173.5
    0x41A 420 0x54 0.84 173.5
    0x3AA 375.200012 0x4B 0.75 173.5
    0x41A 420 0x54 0.84 173.5
    0x3B6 380 0x4C 0.76 173.5
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF83 -49.999996 0xFFFFFFF6 -0.1 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF83 -49.999996 0xFFFFFFF6 -0.1 -61.3
    0xFFFFFF77 -54.799999 0xFFFFFFF5 -0.11 -61.3
    0xFFFFFF83 -49.999996 0xFFFFFFF6 -0.1 -61.3
    0xFFFFFF83 -49.999996 0xFFFFFFF6 -0.1 -61.3
    0xFFFFFF83 -49.999996 0xFFFFFFF6 -0.1 -61.3

    在此阶段、INA219 值与 Fluke 值之间的差值对于正值大约为 x0.41、对于负值大约为 x1.15。

    我之前提到过、当我获取电压并将其除以电阻(0.004欧姆)时、我得到的电流值是上面的两倍。 我决定通过修改校准寄存器公式并删除移位运算来进行进一步的调整:
    #define INA219_CALIB_VALUE ((uint16_t)(0.04096f /(INA219_CURRENT_LSB_mA * INA219_SHUNT_RESULT_OHM))
    而不是:
    #define INA219_CALIB_VALUE (((uint16_t)(0.04096f /(INA219_CURRENT_LSB_mA * INA219_SHUNT_RESULT_OHM))<< 1)
    因此、我发现我获得的电流值与 V/R=I 公式一致。 我还检查了我没有尝试在代码中将校准值移动两次。
    以下是一些示例、例如:
    电流_原始 电流_ mA 分流_电压_原始 分流电压 mV 福禄克_ mA
    0x1DB 190 0x4C 0.76 173.3
    0x20D 210 0x54 0.84 173.3
    0x1D5 187.600006 0x4B 0.75 173.3
    0x20D 210 0x54 0.84 173.3
    0x20D 210 0x54 0.84 173.3
    0x207 207.599991 0x53 0.83 173.3
    0x20D 210 0x54 0.84 173.3
    0x1D5 187.600006 0x4B 0.75 173.3
    0x20D 210 0x54 0.84 173.3
    0x1E1 192.399994 0x4D 0.77 173.3
    0x20D 210 0x54 0.84 173.3
    0x20D 210 0x54 0.84 173.3
    0x1DB 190 0x4C 0.76 173.3
    0x20D 210 0x54 0.84 173.3
    0x1D5 187.600006 0x4B 0.75 173.3
    0x20D 210 0x54 0.84 173.3
    0x20D 210 0x54 0.84 173.3
    0x20D 210 0x54 0.84 173.3
    0x20D 210 0x54 0.84 173.3
    0x1DB 190 0x4C 0.76 173.3
    0x20D 210 0x54 0.84 173.3
    0x1D5 187.600006 0x4B 0.75 173.3
    0x20D 210 0x54 0.84 173.3
    0x20D 210 0x54 0.84 173.3
    0x1DB 190 0x4C 0.76 173.3
    0x20D 210 0x54 0.84 173.3
    0x1D5 187.600006 0x4B 0.75 173.3
    0x207 207.599991 0x53 0.83 173.3
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFB5 -30 0xFFFFFFF4 -0.12 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFB5 -30 0xFFFFFFF4 -0.12 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFB5 -30 0xFFFFFFF4 -0.12 -59
    0xFFFFFFC2 -24.799999 0xFFFFFFF6 -0.1 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59
    0xFFFFFFBB -27.6 0xFFFFFFF5 -0.11 -59

    在此阶段、INA219值与 Fluke 值之间的差值正值约为 x1.15、负值约为 x2。

    作为一个电源我使用 USB 和锂离子电池3.6V, 2350 mA 45100, 8.46 Wh。

    如果有任何其他相关信息我可以为您提供进一步帮助、请告诉我。

    此致、Genadi。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是示波器的另一个示例:

    这是读写电流寄存器操作。  

     我从传感器(由软件)读取的值为  0x019d  与我们可以在图片上看到的内容相同(如果序列中的第一个字节是 MSB)。

    将寄存器中的 CURRENT_RAW 值转换为 CURRENT 值时、 (INA219.CURRENT =(float) CURRENT_RAW * INA219_CURRENT_LSB_A * 1000.0 )以 mA 为单位、当福禄克向我显示45.6 mA 时、我得到的是165.2 mA。

    你有什么想法吗?

    此致、Genadi。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是对 CONFIG 寄存器的写入操作:

    该值表示 0xC800 和预期的一样

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Genadi、

    您的数字通信显然在工作、否则您将无法从寄存器中读回任何信息。

    #define INA219_CALIB_VALUE ((uint16_t)(0.04096f /(INA219_CURRENT_LSB_mA * INA219_SHUNT_RESULT_OHM))
    而不是:
    #define INA219_CALIB_VALUE (((uint16_t)(0.04096f /(INA219_CURRENT_LSB_mA * INA219_SHUNT_RESULT_OHM))<< 1)
    [/报价]

    没有变换的第一种方式就是实现它的方式。 电流值应与 Vshunt = I * Rshunt 公式一致。 进行更改后、您可以从第二个结果表中看到、数值与公式一致、也更接近您的 Fluke 测量值。

    目前似乎有两个问题、一个测量值与另一个测量值略有不同、并且30mA 周围存在偏移。  

    从平均值来看、正电流和负电流测量的30mA 左右偏移。 第二个表中正电流的平均值= 202.34mA、(202.34mA - 30mA = 172.34mA、更接近于 Fluke 的173.3mA 值)。 负电流的平均值=-27.82mA (-27.82mA - 30mA =-57.82mA、这与您的 Fluke -59mA 测量值更为接近)。 偏移25mA 附近的值是由 Vos 引起的。 Vos 是您范围内较低电流测量的主要误差源。 IOS = Vos / Rshunt = 100uV/Rshunt 4mΩ= 25mA。 另一个5mA 是由 IN+和 IN-引脚的偏置电流差异导致的。

    可以在数据表中找到这些数字。  

    我建议用0Ω 电阻器替换 R31和 R38、因为这可能有助于消除 IN+和 IN-之间导致的输入偏置电流差的额外失调。

    从一个电流测量值到另一个电流测量值的变化可能是由噪声导致的。 由于分流电阻器非常小、因此测量值对噪声很敏感、因此其上产生的 Voltage 信号很小。 当您的最大电流为2A 时、Vshunt 最大值仅为8mV、您的配置可提供40mV 电压。  

    我建议尽可能增大分流电阻器以增大 Vshunt 信号、这样将实现更高的精度。  

    此致、

    天使