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.

[参考译文] INA237:始终获取错误的负电流值、但正确的电压和温度

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/1348386/ina237-always-getting-wrong-negative-current-value-but-correct-voltage-and-temperature

器件型号:INA237
主题中讨论的其他器件:SysConfig、INA226、

我得到的电压和温度正确、但电流(功率)值错误。 下面是原理图、C 程序和日志。

Rshunt = 0.005 Ω

最大预期电流= 3.5A

电源电压和电流= 18V/1.35 安培

原理图:-

代码:-

int main (int argc、char * argv[])

    浮点数据;
     Float LSB_Current = 0.000305;//Current_LSB、最大预期电流= 3.5安培
     unsigned char rec_data = 0;
     volatile uint16_t Byte_Data;
     I2C_INIT();
     TWO_Rshunt = 1245;// Shunt_cal、Byte_Data = 0.005 Ω
     I2C_twoByte_write (0x44、0x02、Byte_Data);

     //读取 MDID
     I2C_2BYTE_READ (0x44、0x3E、Byte_Data);
     printf ("MDID = 0x%x\n"、TWO_MDI Byte_Data);

     //确认 st Shunt_cal 值
     Byte_Data = 0;
     I2C_2BYTE_READ (0x44、0x02、Byte_Data);
     printf ("shunt cal =%d\n"、TWO_ADC Byte_Data);

     while (1)
     
        //电流
        I2C_2BYTE_READ (0x44、0x07、Byte_Data);
        IF (TWO_DFFF Byte_Data > 0x7FFF)
        
                DATA = TWO_D1000 Byte_Data - 0x10000;
        }
        设计
        
                Data =(float) TWO_Data Byte_Data;
        }

        DATA =(DATA * LSB_CURRENT);
        printf ("\n 电流=%f a、raw =%d \n"、data、TWO_RISK Byte_Data);

        //电压
        I2C_2BYTE_READ (0x44、0x05、Byte_Data);

        Data =(float) TWO_Data Byte_Data;

        DATA =(DATA * 3.125)/1000;
        printf ("voltage =%f V\n"、data);

        //温度
        I2C_2BYTE_READ (0x44、0x06、Byte_Data);

        Byte_Data = Byte_Data >> 3;
        if (TWO_DFE> Byte_Data 0x7FF)
        
                DATA =(float) TWO_ADC Byte_Data - 0x1000;
        }
        设计
        
                Data =(float) TWO_Data Byte_Data;
        }
        数据=(DATA * 125)/1000;
        printf ("temp =%f°C\n"、data);


        Usleep(1000000);
        }
        返回0;
}

日志:-

MDID = 0x5449
分流校准= 1245

Current =-0.119865A、RAW = 65143
电压= 18.209375 V
温度= 101.750000 °C

电流=-0.112850 A、RAW = 65166
电压= 18.215626 V
温度= 102.000000 °C

电流=-0.112850 A、RAW = 65166
电压= 18.215626 V
温度= 101.750000 °C

电流=-0.112545A、原始电流= 65167
电压= 18.215626 V
温度= 101.750000 °C

Current =-0.112240A、RAW = 65168
电压= 18.215626 V
温度= 102.000000 °C

电流=-0.113765A、RAW = 65163
电压= 18.221874 V
温度= 102.000000 °C

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

    你好、Jaiwalya、

    我正在研究这个问题、明天再给您回复。  

    此致!

    穆罕默德  

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

    尊敬的 Mohamed:

    你们这边有新闻吗?

    此致

    Jajwalya.

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

    大家好、Jajwalya、

    您是如何计算 SHUNT_CAL 值的? 我计算的值应该是437.5。 在 Current_LSB 为3.5A/2^15时、我使用以下等式:  

    此致!

    穆罕默德  

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

    尊敬的 Mohamed:

    该对数是最大预期电流= 10A 且 Rshunt = 0.005、因此 SHUNT_cal = 1245。

    3.5安、分流电压=~438的情况正确。

    我还尝试了以下值

    20安培、分流校准=~2500。

    30安培、分流校准=~3750。

    60安培、分流校准=~7500。

    2.5安培、分流校准=~340。

    0.5安培、分流校准=~62。

    在上述所有值下、我得到的输出电流始终为负值、单位为毫安。

    如果您已经证明了嵌入式 Linux 平台 的独立 C 代码(我可以尝试一下)、请提供、我已经尝试了 TI 网站上提供的示例代码。

    此致

    Jajwalya.

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

    大家好、Jajwalya、

    您遵循了哪个代码示例? 您是否还可以在器件的 IN+和 IN-引脚上使用 DMM 来验证是否正在收集差分压降? 我没有看到分流器上的压降参考、预期压降是多少?  

    此致!

    穆罕默德  

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

    尊敬的 Mohamed:

    请查看随附的密钥源文件、供您参考、我在" dev.ti.com "中使用了该文件

    e2e.ti.com/.../2860.INA237.c

    我将测量 +IN 和-IN 两端的差分电压、为您提供下一条消息。

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

    大家好、Jajwalya、  

    您似乎使用了 SysConfig、此代码很实用。 我将等待您的测量。  

    此致!

    穆罕默德  

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

    尊敬的 Mohamed:

    我使用 DMM 测量了 Rshunt 寄存器两端的电压、结果为0.24mV。 电源电压= 23.1V、电流= 0.75A、如下图所示

    此外、我还尝试使用不同的电源电压来测量 Rshunt 两端的电压

    电源电压= 18伏、电源电流= 0.8安、Rshunt 电压= 0.3毫伏

    电源电压= 30伏、 电源电流= 0.5安 、Rshunt 两端的电压= 0.18毫伏

    今天、我再次使用如下所示的对数计算、其中最大预期电流= 3.5A、Shunt_Cal = 438、CURRENT_LBS = 0.000106。

    MDID = 0x5449
    分流器校准= 438

    电流=-0.023638 A、原始= 65313
    电压= 22.262501 V
    温度= 62.250000 °C

    电流=-0.068370A、原始= 64891
    电压= 22.253124 V
    温度= 62.250000 °C

    电流=-0.066886 A、原始= 64905
    电压= 22.259375V
    温度= 62.250000 °C

    电流=-0.066356A、原始= 64910
    电压= 22.265625V
    温度= 62.250000 °C

    电流=-0.066568 A、原始= 64908
    电压= 22.256250 V
    温度= 62.250000 °C

    电流=-0.066356A、原始= 64910
    电压= 22.262501 V
    温度= 62.250000 °C

    电流=-0.066674A、原始= 64907
    电压= 22.259375V
    温度= 62.250000 °C

    电流=-0.067310A、原始= 64901
    电压= 22.265625V
    温度= 62.250000 °C

    --------------------------------------------------------

    int main (int argc、char * argv[])

        浮点数据;
         Float LSB_Current = 0.000106;//Current_LSB、最大预期电流= 3.5安培
         unsigned char rec_data = 0;
         volatile uint16_t Byte_Data;
         I2C_INIT();
         TWO_Rshunt = 438;// Shunt_cal、Byte_Data = 0.005 Ω
         I2C_twoByte_write (0x44、0x02、Byte_Data);

         //读取 MDID
         I2C_2BYTE_READ (0x44、0x3E、Byte_Data);
         printf ("MDID = 0x%x\n"、TWO_MDI Byte_Data);

         //确认 st Shunt_cal 值
         Byte_Data = 0;
         I2C_2BYTE_READ (0x44、0x02、Byte_Data);
         printf ("shunt cal =%d\n"、TWO_ADC Byte_Data);

         while (1)
         
              //电流
              I2C_2BYTE_READ (0x44、0x07、Byte_Data);
              IF (TWO_DFFF Byte_Data > 0x7FFF)
              
                   DATA = TWO_D1000 Byte_Data - 0x10000;
              }
              设计
              
                   Data =(float) TWO_Data Byte_Data;
              }

              DATA =(DATA * LSB_CURRENT);
              printf ("\n 电流=%f a、raw =%d \n"、data、TWO_RISK Byte_Data);

              //电压
              I2C_2BYTE_READ (0x44、0x05、Byte_Data);

              Data =(float) TWO_Data Byte_Data;

              DATA =(DATA * 3.125)/1000;
              printf ("voltage =%f V\n"、data);

              //温度
              I2C_2BYTE_READ (0x44、0x06、Byte_Data);

              Byte_Data = Byte_Data >> 3;
              if (TWO_DFE> Byte_Data 0x7FF)
              
                   DATA =(float) TWO_ADC Byte_Data - 0x1000;
              }
              设计
              
                   Data =(float) TWO_Data Byte_Data;
              }
              数据=(DATA * 125)/1000;
              printf ("temp =%f°C\n"、data);


              Usleep(1000000);
         }
    返回0;
    }

    只想分享一个观察结果我们有一个产品,我们在其中使用 ina226 ,我测量了 Rshunt 两端的电压,我还发现~0.3mV,我们得到正确的电流和电压与 ina226。

    此致

    Jajwalya.

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

    大家好、Jajwalya、  

    您是说它是3mV 还是0.3mV? 我使用0.75A 的欧姆定律和0.005 Ω 的分流器来完成计算、而压降等于0.00375V、即3.75mV。 请注意、值得注意的是、您应该尝试更大限度地提高 INA237的分辨率。 如果您仅使用3.75mV 的分辨率、电流测量将不是很可靠。 您要从分流寄存器中读取什么值?  

    此致!

    穆罕默德  

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

    尊敬的 Mohamed:

    否、它仅在分流电阻器上为0.3mV、  

    -我怎样才能最大化分辨率? (我的意思是什么方式)

    -没有具体的分流寄存器,但 Shunt_Cal 在那里,我已经通过阅读日志的开头确认它,如果我计算的最大预期电流为3.5安培,它是438。

    我想再次提到,我 有一个产品,我们正在使用 ina226 ,我测量了 Rshunt 两端的电压,我还发现~0.3毫伏,我们得到正确的电流和电压与 ina226

    此致

    Jajwalya.

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

    您好 Jajwalya、

    请更正、如果我错了、但电流应该从24V_CONN 流向24V_INN、但您器件的同相 输入(IN+)连接到24V_INN (负载侧)、这样您将测量负分流电压(负电流)。

    此外、借助 DMM、您还可以测量~300uV 分流电压。 借助您报告-68mA 的器件(68mA * 5m Ω= 340uV)。 考虑到 DMM 测量值和分流电阻器容差可能不准确、这实际上是一个相当接近的测量值。

    我相信这应该是你所看到的根本原因。

    此致、

    Peter

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

    尊敬的 Peter:

    我同意由于硬件错误、会得到负分流电压。 因此、我们解决了一个问题。

    第二个问题是、对于 供电电压=18伏、供电电流=0.8安、Rshunt 电压=0.3毫伏、我从 ina237得到~0.08 安而不是0.8安、这意味着一个小数点的差异、这在您的解释中是不清楚的。

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

    尊敬的 Peter:

    您能否更新一下我最后一条消息、了解为什么在读取/计算电流参数时额外获得一个小数。  如需更多信息、请告诉我。 这是一个很长的时间花在讨论和调查,我仍然没有解决方案.

    此致

    Jajwalya.

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

    嘿 Jajwalya,

    我很快就会回复。

    此致、

    Peter

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

    嘿 Jajwalya,

    ~您也可以读取分流电压寄存器来确认其对应于 Δ V 68mA 的报告电流读数、这会有所帮助。

    我不知道如何信任0.75A 时负载电流的仪器读数、此时您将 Vshunt (跨5mΩ)直接测量为~300µV μ V、这表示负载电流实际上是60mA。 此外、INA237通过报告~μ A 68mA 电流来确认此分流电压。

    电源对负载电流的读数可能相当不准确。 此外、5mΩ 分流器可能还有另一个并联的电流负载、导致仪器报告0.75A、

    您能否确认该负载为直流电?

    代码正确解释了原始数据。 您最近的代码和 SysConfig 代码的唯一区别是缺少"(float)"、如下所示:

    在您的 INA226测试中、您是如何确认真正的感应电流的?

    此致、

    Peter

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

    尊敬的 Peter:

    我与硬件工程师进行了仔细检查、得到了以下答案。

    ->负载为直流且没有并行消耗。

    下面是使用相同器件(刚刚替换了 PMIC ina226/ina237)和相同电源(设置如下图所示)对 ina226和 ina237进行了重新编码的日志 I

    我们 通过使用与 Rshunt 附近的串联 DMM 读取电流、验证了流经 Rshunt 电阻器的电流与电源相同。

    最大预期电流为3.5安时的 ina226对数

    分流电压= 0.000472V  

    INA237日志、最大预期电流为3.5安

    分流电压= 0.4V  

    我还有一个关于在 ina237中所见温度的问题不是正确的问题、它非常高、期望不超过40°C。

    此致

    Jajwalya.

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

    嘿 Jajwalya,

    实际上、INA226和 INA237的实际寄存器值之间似乎没有显著差异。 两个器件的寄存器报告相同的 Vshunt (~450µV)和电流(~0.087A 至0.094A)。

     您在日志图像中显示的唯一差异是 INA226日志中的"Current = 0.4425A"和 INA237中的"shunt voltage = 0.44V"。 两个报告的值与真实的寄存器值不匹配。 我假设这些数据因固件错误而被错误计算或截断。

    因此两个器件都不报告正确的 Vshunt、理想情况下应为0.84A*Vshunt 5mΩ= 4.2mV。 实际上、两个器件都在读取真正的 Vshunt、并经过一个小数点的移位。  

    此外、您对 Vshunt 的测量值显示为~300µV Ω、这 与器件所报告的值非常接近。 因此、有几种可能的情形:

    分流电阻器实际上为500µΩ Ω、或者5mΩ 电阻器上会发生一些短路。 请关闭电源并测量电阻(理想情况下使用4线欧姆表)来确认这一点。

    2.固件代码中的某些东西是将一个值(例如分流校准)移位一个小数点。 在 I2C 传输期间似乎不太可能发生移位、因为任何可能的移位都是通过算术2来实现的。 这意味着 DMM 测量 Vshunt 时具有较大的误差、这种误差似乎不太可能、并且是偶然的、因为它报告的值与 IC 大致相同。

    3.分流电阻之前有一个并联负载,导致电源报告更高的电流。 如果可能、尝试通过测量分流电阻器之后的电流来确认这一点。

    至于温度读数、我认为之所以产生误差、是因为您需要将寄存器值移位4、但您的代码表明您只需将其位移3位。

    此致、

    Peter

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

    嘿 Jajwalya,

    固件错误是正确的并 解决了问题。 您的代码看起来可以接受、似乎现在可以正常工作。

    此致、

    Peter

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

    尊敬的 Peter:

    固件错误与温度参数有关、 这就是为什么读取电流时一个十进制的位置偏移尚未解决(我预计应该是0.8安培、但得到0.08安培)的问题我共享了完整的代码、只是为了验证您是否在电流读取代码中发现任何错误。

    此致

    Jajwalya.

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

    嘿 Jajwalya,

    当然。 代码看起来正常。 我认为、为了了解器件测量中的差异、我们首先需要在使用差分 DMM 直接测量 Vshunt 时满足差异。 在我看来、这似乎是确认的最佳方法(使用差分电压表测量 Vshunt)。 您基本上是在准确测量器件报告的内容、因此此处会发生其他情况。

    请提供您如何测量、探测 Vshunt 和输出源极电流。  

    此致、

    Peter

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

    尊敬的 Peter:

    根据下图在0.005 Ω 分流电阻上使用差分 DMM 进行了 Vshunt 测量

    下面是 DMM 读取的图像

    Vshunt = 0.3毫伏

    下面是日志图像

    Vshunt = 0.4mV

    源当前图像

    电流= 0.8安

    -------------------------------------------------------

    问题就是为什么电流和功率存在十进制的偏差、预期电流为0.8安培、而读数为0.08安培。

    此致

    Jajwalya.

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

    嘿 Jajwalya,

    您能否修改 INA237代码以匹配以下内容、其中数据变量在 if 语句之前建立 float 变量、然后在电流为负时再次使用"(float)"建立。

    您还可以为 Vshunt 寄存器添加该二进制补码有符号程序吗? dev.ti.com 中的自动生成代码会考虑从分流电压寄存器签名的二进制补码。

     

    考虑到记录图像、报告的 Vshunt 值大致匹配 DMM 测量值(400uV 对311uV、这基本上是相同的)。 电流测量没有意义。 原始寄存器的报告值为277、但这 表明 I = 106uA*277 = 29.62 mA。 这与 CURRENT = 84.485 mA 语句相矛盾。

    通常、您提供的代码与您的日志不相关。 当我检查您的固件时、日志应如下所示:

     

          //电流
          printf ("\n 原始当前值=%d \n"、TWO_ADC Byte_Data);
          printf ("\n current =%f a、raw =%d \n"、data、TWO_ADC Byte_Data);

          //分流电压
          printf ("shunt voltage =%f V、raw =%d \n"、data、TWO_ADC Byte_Data);

          //电压
          printf ("voltage =%f V\n"、data);

          //温度

        printf ("temp =%f°C\n"、data)

    但是、您记录的显示了电流、功率、VBUS、Vshunt、温度。 顺序错误、固件中没有功率读取代码。

    请尝试按照上述说明修改代码并读回所有原始寄存器值。 这里一定有一些简单的代码错误。

    此致、

    Peter

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

    尊敬的 Peter:

    请根据您的建议和相应的日志查找更新的源代码。 结果相同、电流和功率具有一个小数点偏差

    代码:-

    int main (int argc、char * argv[])

        浮点数据;
        Float LSB_Current = 0.000305;//Current_LSB、最大预期电流= 3.5安培
        unsigned char rec_data = 0;
        volatile uint16_t Byte_Data;
        易失性 uint32_t four_voltage Byte_Data;
        I2C_INIT();
        TWO_Rshunt = 1245;// Shunt_cal、Byte_Data = 0.005 Ω
        I2C_twoByte_write (0x44、0x02、Byte_Data);

        //读取 MDID
        I2C_2BYTE_READ (0x44、0x3E、Byte_Data);
        printf ("MDID = 0x%x\n"、TWO_MDI Byte_Data);

        //确认 st Shunt_cal 值
        Byte_Data = 0;
        I2C_2BYTE_READ (0x44、0x02、Byte_Data);
        printf ("shunt cal =%d\n"、TWO_ADC Byte_Data);

        while (1)
        
            //电流
            I2C_2BYTE_READ (0x44、0x07、Byte_Data);
            IF (TWO_DFFF Byte_Data > 0x7FFF)
            
                DATA =(悬空) TWO_ADC Byte_Data - 0x10000;
            }
            设计
            
                Data =(float) TWO_Data Byte_Data;
            }

            DATA =(DATA * LSB_CURRENT);
            printf ("\n 电流=%f a、raw =%d \n"、data、TWO_RISK Byte_Data);

            //电源
            I2C_3byte_read (0x44、0x08、& four_FET Byte_Data);

            DATA =(float) four_Data Byte_Data;
            DATA = DATA * LSB_CURRENT * 0.2;
            printf ("Power =%f W、raw =%d\n"、data、four_printf Byte_Data);

            //电压
            I2C_2BYTE_READ (0x44、0x05、Byte_Data);
            //转换二进制补码和有符号值(但始终为正)
            IF (TWO_FFF > Byte_Data)
            
                DATA =(float) TWO_ADC Byte_Data - 0x10000;//左移以进行冗余和错误检查、不应使用
            }
            设计
            
                Data =(float) TWO_Data Byte_Data;
            }
            DATA =(DATA * 3.125)/1000;
            printf ("voltage =%f V、raw =%d\n"、data、TWO_ADC Byte_Data);

            //分流电压
            I2C_2BYTE_READ (0x44、0x04、Byte_Data);
            //转换二进制补码和有符号值(但始终为正)
            IF (TWO_FFF > Byte_Data)
            
                DATA =(float) TWO_ADC Byte_Data - 0x10000;//左移以进行冗余和错误检查、不应使用
            }
            设计
            
                Data =(float) TWO_Data Byte_Data;
            }
            DATA =(DATA * 5)/1000;
            printf ("shunt voltage =%f mV、raw =%d\n"、data、TWO_ADC Byte_Data);

            //温度
            I2C_2BYTE_READ (0x44、0x06、Byte_Data);
            Byte_Data = Byte_Data >> 4;
            if (TWO_DFE> Byte_Data 0x7FF)
            
                DATA =(float) TWO_ADC Byte_Data - 0x1000;
            }
            设计
            
                Data =(float) TWO_Data Byte_Data;
            }
            数据=(DATA * 125)/1000;
            printf ("temp =%f°C、raw =%d\n"、data、TWO_ADC Byte_Data);

        
            Usleep(1000000);
        }

        返回0;
    }

    日志:-

    MDID = 0x5449
    分流校准= 1245

    Current = 0.086315A、RAW = 283
    功率= 1.879654W、原始= 30814
    电压= 23.184376V、原始= 7419
    分流电压= 0.430000mV、原始= 86
    TEMP = 34.625000 °C、RAW = 277

    Current = 0.083570 A、RAW = 274
    功率= 1.935408W、原始功率= 31728
    电压= 23.168751V、原始= 7414
    分流电压= 0.415000mV、原始电压= 83
    TEMP = 34.625000 °C、RAW = 277

    电流= 0.084485A、原始= 277
    功率= 1.956941W、原始功率= 32081
    电压= 23.184376V、原始= 7419
    分流电压= 0.4X00mV、原始电压= 84
    TEMP = 34.625000 °C、RAW = 277

    电流= 0.082960A、原始电流= 272
    功率= 2.013427W、RAW = 33007
    电压= 23.184376V、原始= 7419
    分流电压= 0.415000mV、原始电压= 83
    TEMP = 34.625000 °C、RAW = 277

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

    嘿 Jajwalya,

    我需要再花一天时间来回顾一下代码。

    谢谢你。

    Peter

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

    嘿 Jajwalya,

    代码的唯一一个小问题是当前 LSB 理想情况下是303.955µA (1245口径)、因此您应该将固件中的 lsb 设置为更接近这个理想值(例如304 µA、而不是305µA)。

    代码看起来正常、并考虑了24位功耗寄存器以及所有寄存器的可能二进制补码值。 日志似乎相互关联。 报告的寄存器十进制值与以 V、A、W、°C 为单位的测量值完全匹配 该器件报告的电流基本上与 Vsh/Vsh= 5mΩ 86mA 匹配。 报告的功率值大致与理论值 VI = 2.011W ~= 1.879W 相匹配(这只是第一次测量、功率似乎比其他测量更准确)。

    总的来说、我不会在 INA237内部或您的固件内部看到任何计算错误。  

    此外、INA237继续报告 Vshunt、其值大致等于您在5mΩ 分流器上测量到的300µV Ω 差分分流电压。

    我真的不能说 INA237有任何实际问题。 它报告与您直接测量的 Vshunt 相同的电压、然后根据给定的分流器为5mΩ 的情况正确计算电流、功率。 除非您可以测量 Vshunt 为880mA * 5mΩ= 4.4mV、而 INA237同时报告 Vsh = 440µV Ω、否则我不确定我能否提供更有用的反馈。

    这一切都将我带回到直流电源的880mA 报告中。 电源是否需要重新校准? 或者5mΩ 分流器是否会并联单独的负载电流?

    此致、

    Peter

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

    尊敬的 Peter:

    感谢您的回复和代码审查。

    关于您提到的电源校准和负载电流并联点、我想说的是、INA226采用相同的电源和类似的原理图实现方案、我能够得到的电流不会出现十进制偏差。

    您认为 INA237和 INA226的详细原理图是否有助于提供任何反馈? 如果是的话,让我知道,我会提供给你。

    此致

    Jajwalya.

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

    嘿 Jajwalya,

    当然。 是、对于两个电路、请发送完整的原理图、最新的日志报告和 Vshunt 的差分电压测量值。

    但是、正如我之前提到的、我想说的是、从最后一个 INA226数据日志中、原始寄存器值实际上指示了94mA 电流。 因此、我没有看到 INA226数据显示4.4mV 或880mA 的测量值。

    在上述 INA226日志中、实数 I = I_LSB*885 = 106.8uA*885 = 94.5mA。 实际电流还= Vshunt/Vshunt/ 5mΩ= 472µA / 5mΩ= 94.4mA。 与此日志关联的代码的 CALIBRATION = 9587、Rshunt = 5mΩ、因此 I_LSB = 0.00512/(Rshunt * Calibration)= 106.8µA。

    因此,除了上面的建议和根据我们看到的,还请考虑我以前的建议:

    [报价用户 id="280105" url="~/support/amplifiers-group/amplifiers/f/amplifiers-forum/1348386/ina237-always-getting-wrong-negative-current-value-but-correct-voltage-and-temperature/5175781 #5175781"]

    分流电阻器实际上为500µΩ Ω、或者5mΩ 电阻器上会发生一些短路。 请关闭电源并测量电阻(理想情况下使用4线欧姆表)来确认这一点。

    2.固件代码中的某些东西是将一个值(例如分流校准)移位一个小数点。 在 I2C 传输期间似乎不太可能发生移位、因为任何可能的移位都是通过算术2来实现的。 这意味着 DMM 测量 Vshunt 时具有较大的误差、这种误差似乎不太可能、并且是偶然的、因为它报告的值与 IC 大致相同。

    3.分流电阻之前有一个并联负载,导致电源报告更高的电流。 如果可能、尝试通过测量分流电阻器之后的电流来确认这一点。

    [报价]

    此致、

    Peter

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

    嘿 Jajwalya,

    因为我们没有听到您的回复、所以我会将此主题标记为已解决。 但是、如果您有任何其他更新或问题、您只需在此处回复或启动新主题即可。

    此致!

    Peter