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.

[参考译文] INA228-Q1:电流读数错误

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/979456/ina228-q1-current-reading-error

器件型号:INA228-Q1
主题中讨论的其他器件:INA228INA226

Ω 10A 的最大电流、如果分流电阻为0.005 μ A、则无法实现正确的电流测量。 即使分流电压读数刚好在现场、也是如此。

如果我们计算 CURRLSBCALC 为13107.2 x 10^7 x CURRENT_LSB x RSHUNT、然后将寄存器7h (向右移4位)的内容乘以 CURRENT_LSB、然后乘以10、我们得到正确的电流值。

是否确定数据表值正确? 还是软件方面的错误?

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

    您好!

    Q1预览数据表的一些公式目前存在错误、将很快更新。  目前、请使用已发布的商业数据表(INA228)中的公式、并查看该公式是否可以解决问题。

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

    您好!

    虽然我注意到以下方面存在一些不一致之处、但我不能找到这么大的差异:

    在(2)上、您说10^6、然后在下面它说10e6、哪一个是正确的? 这一错误位于两个数据表上。

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

    我将其标记为已通过意外解决...

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

    哦、我看到您现在所说的内容。 很抱歉、我以前没看到。 13107.2 x 10^6是要使用的正确值。 我将在下一次更新中让系统团队对此进行澄清。

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

    但这仍然不能得到正确的电流值。

    正确的唯一方法是按照我在第一个帖子中所说的内容进行操作:

    如果我们计算 CURRLSBCALC / SHUN_CAL 为13107.2 x 10^7 x CURRENT_LSB x RSHUNT、然后将寄存器7h (右移4位)的内容乘以 CURRENT_LSB、然后乘以10、我们得到正确的电流值。

    这 使用的是 ADC 范围0。

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

    您好!

    您能为我提供错误情况的确切寄存器读数吗?  在 SSHUNT_CAL 公式中使用10^6。 具体而言、我想查看 SHUNT_CAL、VSHUNT 和电流寄存器的读数。  我还需要知道您为 Current_LSB 选择了什么、以防您将其取整。

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

    您好 Mitch、

    请在下面找到所需的信息。

    SHUNT_CAL 原始值:1250
    VSHUNT 原始值:13680
    分流电压:0.00027
    当前原始值:-21472
    分流电流:-0.02560

    我使用的 VBUS 电压为24V、负载电阻为470Ω Ω、因此分流电压读数很好。 电流读数为负、我没有理想原因...

    原理图如下所示、请记住、我们使用原理图的 INA-48V 部分、分流器为5mΩ Ω、我们使用的 INA 是 INA228-Q1、而不是原理图上所写的 INA226。

    我用于读取寄存器的代码如下:

    #define INA2228_REG_CONFIG(0x00)
    #define INA2228_REG_ADCCONFIG(0x01)
    #define INA2228_REG_SHUNTCAL (0x02)
    #define INA2228_REG_TEMPSCOCONFIG (0x03)
    #define INA2228_REG_VSHUT(0x04)
    #define INA2228_REG_VBUS (0x05)
    #define INA2228_REG_DIETEMP (0x06)
    #define INA2228_REG_CURRENT(0x07)
    #define INA2228_REG_POWER (0x08)
    #define INA2228_REG_ENERGY (0x09)
    #define INA2228_REG_CHARGE (0x0A)
    #define INA2228_REG_DIAGALRT (0x0B)
    #define INA2228_REG_SOVL (0x0C)
    #define INA2228_REG_SUVL (0x0D)
    #define INA2228_REG_BOVL (0x0E)
    #define INA2228_REG_BUVL (0x0F)
    #define INA2228_REG_TEMPLIMIT (0x10)
    #define INA2228_REG_PWRLIMIT (0x11)
    #define INA2228_REG_MANUFACTURID (0x3E)
    #define INA2228_REG_DEVICEID (0x3F)
    
    int32_t INA228::readRegister24 (uint8_t reg)
    {
    int32_t 值= 0;
    
    Wire.beginTransmission(inaAddress);
    Wire.write (reg);
    wire.endTransmission ();
    
    Wire.requestFrom (inaAddress、3);
    uint8_t vha = Wire.read();
    uint8_t vMA = Wire.read();
    uint8_t VLA = Wire.read();
    值=(uint32_t) vha << 16 |(vMA << 8)| VLA;
    
    返回值;
    }
    
    int16_t INA228::readRegister16 (uint8_t reg)
    {
    int16_t 值;
    
    Wire.beginTransmission(inaAddress);
    Wire.write (reg);
    wire.endTransmission ();
    
    Wire.requestFrom (inaAddress、2);
    uint8_t vha = Wire.read();
    uint8_t VLA = Wire.read();
    值= vha << 8 | VLA;
    
    返回值;
    }
    
    void INA228::writeRegister16 (uint8_t reg、uint16_t val)
    {
    uint8_t vla;
    VLA =(uint8_t) val;
    Val >>= 8;
    
    Wire.beginTransmission(inaAddress);
    Wire.write (reg);
    Wire.write ((uint8_t) val);
    Wire.write (VLA);
    Wire.endTransmission ();
    }
    
    bool INA228:::calibrate (float rShuntValue、float iMaxCurrentExpected)
    {
    uint16_t calibrationValue;
    rShunt = rShuntValue;
    
    float iMaxPosible;
    
    iMaxPosible = vShuntMax/rShunt;
    
    currentLSB = iMaxCurrentExpected / pow (2、19);
    
    powerLSB =电流 LSB * 3.2;
    energyLSB = currentLSB * 51.2;
    chargeLSB =当前 LSB;
    
    calibrationValue =(uint16_t)(13107.2 * pow (10、6)* currentLSB * rShunt);
    
    writeRegister16 (INA2228_REG_SHUNTCAL、calibrationValue);
    
    返回 true;
    }
    
    float INA228::readShuntCurrent (void)
    {
    int32_t CURRENT_RAW;
    // Current_RAW = readRegister24 (INA2228_REG_CURRENT)>> 4;
    
    Current_RAW = readRegister24 (INA2228_REG_CURRENT);
    serial.println ((String)"当前原始值:"+ CURRENT_RAW);
    CURRENT_RAW = CURRENT_RAW >> 4;
    serial.print ("分流电流:");
    serial.println (currentLSB,5);
    
    return (Current_RAW * currentLSB);
    }
    
    float INA228::readShuntVoltage (void)
    {
    int32_t VOLTAGE_RAW;
    
    // volte_raw = readRegister24 (INA2228_REG_VSHUT)>> 4;
    
    VOLTGE_RAW = readRegister24 (INA2228_REG_VSHUT);
    
    serial.println ((字符串)"shunt_CAL 原始值:"+ readRegister16 (INA2228_REG_SHUNTCAL));
    serial.println ((String)"VSHUNT 原始值:"+ VOLTGE_RAW);
    VOLTGE_RAW = VOLTGE_RAW >> 4;
    serial.print ("分流电压:");
    serial.println (volte_raw * 0.0000003125、5);
    
    返回((浮点) VOLTGE_RAW * 0.0000003125);//如果 ADCRANGE = 0
    }
    

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

    您好!

    您为原始电流寄存器返回的值不是有效的电流代码、因为它将始终以0b0000结束。  那么、I2C 传输或代码可能存在问题?  您能否获得 I2C 传输的逻辑分析仪/示波器截图、以便向当前寄存器执行读取命令、以便我们确认 I2C 总线本身的值?

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

    您好!

    数字是正确的。 如果您将-21472转换为两个补码、则来自 INA 的原始数字为两个补码: 111010110000100000b、即0xFAC20。

    以这种方式打印的数字是 Arduino 处理打印的方式造成的。

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

    哦、抱歉、我最后误输入了它 我将再次重新运行这些数字。

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

    您好!

    为了确保电流和 vshunt 寄存器读数来自相同的转换、您能否再次获取数据、但这次是在单次模式下。 使用更长的转换时间、可能还有一些平均值也是不错的选择(只是为了确保读出更准确)。

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

    我直到下周才再次使用该板、但我确信它们是这样的、这与我以前所得到的情况相同。 在这种情况下、负载仅为固定电阻器、因此不会发生变化。 考虑到来自相同转换或非转换并不会真正改变任何东西。

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

    好的、我看到您说的是什么。  我只是尝试在 EVM 上重复该问题、但我确实获得了预期的电流值。  您是否有可用于运行相同测试的 EVM?  通过这种方式、我们可以查看问题是否仍然在相同的条件下发生、但在不同的器件/固件下发生。

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

    遗憾的是、我没有 EVM。 如果你们给我们发一个、我会很乐意进行测试。

    尽管如此、我还是发布了我的代码、但没有比我发布的代码更多的内容...

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

    是的、我查看了您的代码、没有发现任何问题。  这就是为什么我认为尝试不同的硬件/器件也是不错的。  我已向您发送朋友请求、以便我们可以发送私人消息来讨论 EVM 选项。  

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

    好的、我已经向您发送了一条消息。

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

    好的、谢谢、如果有更多与原始问题相关的信息、我将回复此主题。   

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

    此外、您能否共享器件 ID 寄存器显示的内容、即0x2280还是0x2281? 是您正在使用预览器件(即 PINA228-Q1)或完全商业版(INA228)的器件。   

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

    我目前没有物理访问器件的权限、但我从 TI 商店购买了器件、根据发票和芯片封装标签、这些器件是预览器件。 我认为当时(1月20日)还没有完整的商业版。

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

     好的、在您返回到物理设置后、让我知道器件 ID。  此外、我认为您的值出现为负值、因为打印语句似乎将其视为16位值、因此最好将其视为示波器快照来确认总线上的值。

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

    您好 Mitch、

    刚刚有机会检查器件 ID 寄存器。 它将返回0x2281。 顺便说一下、我认为商业版的数据表在7.6.1.20中有一个拼写错误、因为根据该点的表、ID 是0x2281、而在点标题中、它显示为[RESET = 0x2080]

    此致、

    Sebastião μ A

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

    Sebastião μ A、

    感谢您的观看。 我要向数据表团队指出、该数字不一致。 不确定它们是否希望它为1或0、因为它是修订 ID、并且两个数字都可以存在。 (虽然目前大多数人会说1)。

    至于电流读数问题、由于我能够通过 EVM 上的仿真设置获得预期的电流值、因此这不是一个一致的器件问题。 因此、我认为有2个测试路径:

    1.如果问题出在您的硬件/软件上、最好尝试使用具有相同电流感应设置的 EVM、以查看您是否从中获得正确的值。

    2.如果器件因某种原因损坏并导致了问题、则最好将 INA228与另一个器件交换、看看您是否遇到相同的问题。

    通常、在 I2C 通信线路上放置示波器并确保 Arduino 报告的值与 I2C 总线上显示的值相同也不会有任何影响。

    请执行上述测试、并告诉我测试结果如何。 (如果这可以解决您的问题、我会将此帖子标记为"TI 认为已解决"、但一旦您知道结果、我仍然很想了解这些结果)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="477911" URL"~/support/amplifiers/f/amplifiers-forum/979456/ina228-q1-current-reading-error/3620062 #3620062"]uint8_t vha = Wire.read(); uint8_t vMA = Wire.read(); uint8_t VLA = Wire.read(); 值=(uint32_t) vha << 16 |(vMA << 8)| vla;

    因此、在使用 EVM 之后、我发现问题出在 Arduino 方面。 这种“哈”的铸造是问题所在。 将 vha、vMA 和 vLA 定义为 uint32_t 可以解决问题。