主题中讨论的其他器件: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);
}


