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.

[参考译文] INA229-Q1:INA229 电流读数与分流电阻器计算不匹配

Guru**** 2513185 points
Other Parts Discussed in Thread: INA229, INA229-Q1

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/1557851/ina229-q1-ina229-current-reading-mismatch-with-shunt-resistor-calculation

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

工具/软件:

您好:

我正在使用 INA229 电流/功率监测器 IC 并面临测量精度问题。

设置:

  • 器件:INA229

  • 接口:SPI

  • 分流电阻器:15Ω

  • 测试电流:5mA

  • 范围:1uA 至 10mA

  • 预期的电流寄存器值(根据数据表计算结果): 262145.

  • 观察到的当前寄存器实际值: 261760

问题:
根据数据表、当电流的 5mA 流过 15Ω 分流电阻器时、我应该从电流寄存器中读取 262145 的值、但我的代码给出的值为 261774。

固件代码:

typedef 结构

uint16_t wConfigRegister;
uint16_t wADCConfigRegister;
uint16_t wShuntCalRegister;
Uint16_t wShuntTempcoRegister;
uint16_t wDiagAlrtRegister;
uint16_t wSOVLRegister;
uint16_t wSUVLRegister;
uint16_t wBOVL 寄存器;
uint16_t wBUVLRegister;
Uint16_t wTempLimitRegister;
uint16_t wPWRLimitRegister;

uint16_t wADCRange;//config_register_adcrange
浮点 fCurrentLSB;//电流 lsb 值

}tLLD_INA229_STATE;
typedef tLLD_INA229_State *tLLD_INA229_handle;

静态 tLLD_INA229_State tINA229_state ={

//配置和设置
.wConfigRegister = 0x0000U、
.wADCConfigRegister =(LLD_INA229_ADC_CONFIG_REGISTER_MODE_CONTINUAL_SHUNT_AND_BUS_VOLTAGE |
LLD_INA229_ADC_CONFIG_REGISTER_VB.S._84us |
LLD_INA229_ADC_CONFIG_REGISTER_VSHCT_150us |
LLD_INA229_ADC_CONFIG_REGISTER_VTCT_84us |
LLD_INA229_ADC_CONFIG_REGISTER_AVG_1024)、
.wShuntCalRegister = 0x0EA6U、
.wShuntTempcoRegister = 0x0000U、/* TEMPCO 为 0ppm/°C */
.wDiagAlrtRegister =(LLD_INA229_DIAG_ALRT_REGISTER_ALATCH_PREPARENATURE |
LLD_INA229_DIAG_ALRT_REGISTER_CNVR_DISABLE_CONVERSION_READY_FLAG_ON_ALERT_PIN |
LLD_INA229_DIAG_ALRT_REGISTER_SLOWALERT_ALERT_COMPARY_ON_AVERAGED_VALUE |
LLD_INA229_DIAG_ALRT_REGISTER_APOL_NORMAL_ACTIVE_LOW_OPEND_Rain)、
.wSOVLRegister = 0x7E40U、
.wSUVLRegister = 0x8000U、
.wBOVLRegister = 0x7FFFU、
.wBUVLRegister = 0x0000U、
.wTempLimitRegister = 0x7FFFU、
.wPWRLimitRegister = 0xFFFFU、
.wADCRange = LLD_INA229_CONFIG_REGISTER_ADC_RANGE_16384MV、
.fCurrentLSB = 0、
};

const tLLD_INA229_handle tLLD_INA229_0 =&tINA229_state;

void vLLD_INA229_Config (tLLD_INA229_Handle TSENSOR)

//写入传感器配置寄存器
VLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_CONFIG_REGISTER、TSENSOR->wConfigRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_ADC_CONFIG_REGISTER、TSENSOR->wADCConfigRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_SHUNT_CAL_REGISTER、TSENSOR->wShuntCalRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_SHUNT_TEMPCO_REGISTER、TSENSOR->wShuntTempcoRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_DIAG_ALRT_REGISTER、TSENSOR->wDiagAlrtRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_SOVL_REGISTER、TSENSOR->wSOVLRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_SUVL_REGISTER、TSENSOR->wSUVLRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_BOVL_REGISTER、TSENSOR->wBOVLRegister);
vLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_BUVL_REGISTER、TSENSOR->wBUVLRegister);
VLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_TEMP_LIMIT_REGISTER、TSENSOR->wTempLimitRegister);
VLLD_INA229_WriteRegister (TSENSOR、LLD_INA229_PWR_LIMIT_REGISTER、TSENSOR->wPWRLimitRegister);

}

uint64_t dLLD_INA229_ReadRawDataCurrent (tLLD_INA229_handle TSENSOR)

//读取原始电流数据
UINT64_t dRawCurrentValue = dLLD_INA229_ReadRegister (TSENSOR、LLD_INA229_CURRENT_REGISTER);

//删除保留位
dRawCurrentValue = dRawCurrentValue >> LLD_INA229_FOUR_BIT_SHIFT_VALUE;

返回 dRawCurrentValue;
}

void vAPPTaskINA229( void *pvParameters )

bool boNegativeCurrent;
int32_t sCurrentValue;

//配置 INA229
vLLD_INA229_Config (tLLD_INA229_0);

uint64_t 数据;
//在通知数据中添加当前原始数据
DATA = dLLD_INA229_ReadRawDataCurrent (tLLD_INA229_0);

abINA229MeasurementData[7]=数据;
abINA229MeasurementData[6]= DATA >> 8;
abINA229MeasurementData[5]=数据>> 16;

boNegativeCurrent =( abINA229MeasurementData[5])&( 8 );
sCurrentValue =((uint8_t) abINA229MeasurementData[5])<< 16;
sCurrentValue |=((uint8_t) abINA229MeasurementData[6])<< 8;
sCurrentValue |=((uint8_t) abINA229MeasurementData[7]);

if( boNegativeCurrent )

sCurrentADCValue = lConvert20BitTwosComplement( sCurrentValue );
}
暴露

sCurrentADCValue = sCurrentValue;
}
printf(“Current register value =%ld“、&sCurrentADCValue);
}

 

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

    INA229-Q1 中具有 15Ω 分流器和 5mA 测试电流的预期 (262145) 电流寄存器值与观察到的 (261760) 电流寄存器值不匹配可能是由于分流器校准寄存器值 (0x0EA6) 不正确所致。 根据数据表、计算:

    SHUNT_CAL=0.005129.536×≈×9−15 ^ 35791 (0x8BDF)\text{SHUNT\_CAL}=\frac{0.00512}{9.536 \Times≈μ s{–9}\Times 15}\approx 35791 \text{ (0x8BDF)}SHUNT_CAL=9.536×10−9×150.00512 35791 (0x8BDF)

    wShuntCalRegister 更新 0x8BDF。 此外、16.384mV ADC 范围 (LLD_INA229_CONFIG_REGISTER_ADC_RANGE_16384MV) 对于 75mV 分流电压 (5mA× 15Ω) 来说过低。 开关至 81.92mV 范围 (LLD_INA229_CONFIG_REGISTER_ADC_RANGE_81920MV)。 检查分流电阻器容差和 SPI 通信稳定性。 Re 测试以确认修复。

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

    感谢您的迅速响应、

    我已经浏览了数据表、发现分流校准寄存器的公式与上面分享的公式不同。


    根据数据表、分流校准寄存器的值计算结果正确无误 0x0EA6。
    SHUNT_CAL = 13 107.2 *(10^6)*(0.01 /(2^19))* 15 = 0xEA6 (DEC - 3750)

    此外、根据数据表、没有像 81.92mV 这样的范围配置、但我们已经配置了 163.84mV 范围。

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

    不匹配原因

    • 观察值 (261760) 比预期值 (262145) 低~0.15%、这表示误差很小。 潜在原因:
      • 分流电阻容差 :具有±1%容差的 15Ω 电阻器可能会略有偏差(例如 14.85Ω),从而降低分流电压和电流读数。
      • 噪声或失调电压 :汽车环境中的电噪声或 ADC 偏移(例如,来自其他组件的 EMI )可能会影响读数。
      • SPI 通信 :在 dLLD_INA229_ReadRawDataCurrent 中的 SPI 数据传输或位移动中出现小错误(例如 LLD_INA229_FOURCE_BIT_SHIFT_VALUE 错位)
      • 温度效应 :分流电阻器或 INA229 温漂,尽管 wShuntTempcoRegister = 0x0000 假设 0ppm/°C                           测试噪声:直接测量分流电压(预期为 75mV)并使用示波器检查噪声。 如果需要、在分流器上添加一个 100nF 电容器              

        重新校准。               我误停了、所以不会收到您的帖子通知   

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

    尊敬的 Bhavesh:

    您的分流校准值正确:  

     您的分流电阻容差是多少?

    此致、
    Mallika Senthil

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

      • 我在上使用 DMM 测量了分流电压 5mA 电流

      • 读数: 74.93mV 、这几乎正是我所期望的(接近 75 mV)。

      • 这表明分流电阻容差不是导致电流寄存器值出现~0.15%误差的主要原因。

    • 噪声检查

      • 我使用示波器探测了分流电压。

      • 波形干净且稳定。

      • 未观察到可能影响测量精度的明显噪声或纹波。

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

    尊敬的 Bhavesh:

    由于分流电阻器容差和特定于原理图/布局的设置、有时电压甚至在到达 INA 之前会发生变化。 因此、测试方法最好是直接在器件引脚上测量分流电压、看看是否符合预期。 您还可以将其与 VSHUNT 结果寄存器进行比较、以查看测量精度。

    请测量 器件的 IN+和 IN-引脚(而不是电阻器)上的电压、并将该电压与分流器寄存器中的电压进行比较。  这将告诉 您是在 INA 之前发生了电压变化、还是由配置问题引起。
    如果这是预期值、则可以检查电流寄存器。

    此致、
    Mallika Senthil

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

    尊敬的 Mallika:

    感谢您的指导。 我直接在 IN+和 IN-引脚上测量了电压并得到了 74.94mV 。 从分流器寄存器中、测量值为 74.794mV

    约有一个小差异 0.146mV 寄存器读数之间的不匹配。 您能帮助我了解这种偏差是由于器件精度/分辨率造成的、还是表示配置中存在偏差吗?

    此致、
    Bhavesh

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

    尊敬的 Bhavesh:

    对于 INA229 等超精密器件而言、0.146mV 的差异过大。
    1.使用的共模电压是多少?

    2.请检查您的 DMM 的准确性。

    3、您还可以提供原始格式的所有寄存器的完整读数进行调试。

    此致、
    Mallika Senthil

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

    尊敬的 Mallika:

    感谢您的及时回复。  我已按照您的建议读了所有读数。 但是、当 我测量处的共模电压时  IN+至 GND  和  IN-至 GND  观察到电压逐渐降低。

    作为参考、我 附上了 INA229 的原理图。



    我们使用的是  Keysight 34465A  用于所有电压测量的 DMM、因此测量精度可靠。

    以下是用于调试的原始格式完整寄存器读出结果:

    • 配置 (0x00):  0

    • ADC 配置 (0x01):  45711.

    • SHUNT_CAL (0x02):  3744.

    • SHUNT_TEMPCO (0x03):  0

    • VSHUNT (0x04):  75.15mV

    • VBUS (0x05):  1171.875mV

    • DIETEMP (0x06):  3633

    • 电流 (0x07):  4981µA

    • 功率 (0x08):  323.

    • 能量 (0x09):  0

    • 充电 (0x0A):  4.5 × 10^8.

    • DIAG_ALRT (0x0B):  8193.

    • SOVL (0x0C):  32320

    • SUVL (0x0D):  0

    • BOVL (0x0E):  32767.

    • BUVL (0x0F):  0

    • TEMP_LIMIT (0x10):  32767.

    您还提到、“对于 INA229 等超精密器件、0.146mV 的差异过大。“ 我假设相同、但减少差异的最佳做法是什么?

    如果您需要我这边的其他测量或测试、请告诉我。

    此致、
    Bhavesh Vyas

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

    尊敬的  Bhavesh:

    鉴于您的 VCM 正在变化、我想确认您的 DMM 具有足够高的阻抗、以确保它不会灌入电流。 此外、INA 接地是否与负载连接到同一接地端? 如果不是、请让它们相同。

    如果上述操作无法解决问题、请将您的寄存器的完整读数发送给我、其中不是转换后的值、而是原始十六进制值、以便我们检查您的转换结果是否正确。

    此致、
    Mallika Senthil

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

    尊敬的 Mallika:

    感谢您的建议。 关于接地端:INA 接地端特意与负载接地端分离、因为我们需要同时测量电流和总线电压。 因此、我们不能将它们连接到同一接地端。

    根据要求、请找到寄存器的原始十六进制值读数如下:

    • 配置 (0x00): 0x0000

    • ADC 配置 (0x01): 0xB28F

    • SHUNT_CAL (0x02): 0x0EA6

    • SHUNT_TEMPCO (0x03): 0x0000

    • VSHUNT (0x04): 0x3A67B

    • VBUS (0x05): 0x0004.

    • DIETEMP (0x06): 0x0E69

    • 电流 (0x07): 0x3FCBD

    • 功率 (0x08): 0x0139

    • 能量 (0x09): 0x1C14A

    • 充电 (0x0A): 0x1AD27480(≈4.5 × 10^8)

    • DIAG_ALRT (0x0B): 0x53726777

    • SOVL (0x0C): 0x7E40

    • SUVL (0x0D): 0x8000

    • BOVL (0x0E): 0x7FFF

    • BUVL (0x0F): 0x0000

    • TEMP_LIMIT (0x10): 0x7FFF

    如果您想捕获任何其他寄存器或使用特定设置进行测试、请告诉我。

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

    尊敬的 Bhavesh:

    具有两个不同的接地端是读数不匹配的原因、器件接地和负载接地均应相同、以便器件以公共接地为基准测量电压和电流。

    您无需单独接地即可测量电流和总线电压、但是、如果您的系统不允许使用相同的接地端、则可以使用数字隔离器、如以下两个参考设计所示。
    https://www.ti.com/tool/TIDA-01608

    https://www.ti.com/tool/TIDA-00313

    此致、
    Mallika Senthil