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:从 VBUS 寄存器读取数据时出现 INA228问题

Guru**** 2390755 points
Other Parts Discussed in Thread: INA228

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/985050/ina228-ina228-problem-with-reading-data-from-the-vbus-register

器件型号:INA228

美好的一天! 我计划在我的项目中使用 INA228。 从 VBUS 寄存器读取数据时遇到问题、该值与 VBUS 引脚上的实际电压无关。 使用了多个 IC 来消除硬件错误、但没有任何效果。 所有其他参数均得到正确计算和读取。

参数:

分流电阻- 0.001 Ω;
最大电流-不超过163.84A;
平均数量- 16;
转换时间- 4120us (所有通道相同);
模式-所有通道(HF)连续;
ADC 范围- 163.84mV;
I2C 频率- 400kHz;
DEVICE_ID - 0x2281。

用于 VBUS 的已用代码:

#define INA2228_VBUS_LSB            (0.0001953125f)
#define INA2228_x_ADDRESS_x_VBUS  (0x05)

uint32_t INA2228_x_VBUS;

空 INA228::ReadBlock (uint8_t regAddress、uint8_t* receiverPtr、uint8_t length)

  Wire.requestFrom (addresssI2C、length、regAddress、(uint8_t) 1、(uint8_t) true);
  对于(uint8_t i = 0;i < length;i++)
  {
    receiverPtr [i]= Wire.read();
  }

uint32_t INA228::GetBusVoltage_raw (void)

  uint8_t data[3]={0};
  读取块(INA2228_x_address_x_vBus、data、3);
  INA2228_x_VBUS = 0x000FFFFF &(((DATA[0]<< 16)|(DATA[1]<< 8)|(DATA[2]))>> 4);
  返回 INA2228_x_VBUS;

浮点 INA228::GetBusVoltage_V (空)

  uint32_t raw = GetBusVoltage_raw ();
  返回(浮点)(RAW * INA2228_VBUS_LSB);

VSHUNT 的已用代码(例如工作正常):

#define INA2228_x_ADDRESS_x_VSHUNT  (0x04)
#define INA222_VSH_LSB_Wide          (0.0000003125f)
#define INA222_VSH_LSB_Narrow       (0.000000078125f)

typedef 枚举

  INA2228_ADC_RANGE_Wide = 0、
  INA2228_ADC_RANGE_Narrow = 1、
} INA2228_ADC_RANGE_t;

uint8_t adcRange = INA2228_ADC_RANGE_Wide;
uint32_t INA2228_x_VSHUNT;

uint32_t INA228::GetShuntVoltage_raw (void)

  uint8_t data[3]={0};
  读取块(INA2228_x_address_x_VSHUNT、data、3);
  INA228_x_VSHUNT = 0x000FFFFF &(((DATA[0]<< 16)|(DATA[1]<< 8)|(DATA[2])>> 4);
  返回 INA2228_x_VSHUNT;

浮点 INA228::GetShuntVoltage_V (空)

  浮点数= 1.0;
  uint32_t raw = GetShuntVoltage_raw ();
  如果(原始>> 19)
  {
    RAW =((~RAW)& 0x000FFFFF)+ 1;
    符号=-1.0;
  }
  IF (adcRange = INA2228_ADC_RANGE_Wide)
    返回(浮点)(符号* RAW * INA2228_VSH_LSB_Wide);
  其他
    返回(浮点)(符号* RAW * INA2228_VSH_LSB_Narrow);

VBUS 引脚电压大约为24.4V

09:57:10.557 -->---------------
09:57:10.557 ->测量值:                     16位16位... [二进制]
09:57:10.557 ->
09:57:10.557 ->分流电压: [us]= 0.00017438 V      原始[h/l]:0_1000111011
09:57:10.557 ->
09:57:10.557 ->总线电压:   ![Ub]= 204.44746398 V   RAW [h/l]:111111_1111100011111100
09:57:10.557 ->功率/电流:![Ub]= 24.44157791 V
09:57:10.557 ->
09:57:10.557 ->温度:    [T]= 33.95312500 C     原始[h/l]:0_1000011111011
09:57:10.557 ->当前:         [i]= 0.17437500A       原始[h/l]:0_1000111100
09:57:10.557 ->电源:          [P]= 4.26200008 W      原始[h/l]:0_1000001111001
09:57:10.557 ->能源:         [E]= 4.25600004 J      原始[h/l]:0_0_0_100010100
09:57:10.557 ->费用:         [C]= 0.17531249 C      原始[h/l]:0_0_0_1001001

VBUS 引脚电压大约为20.2V (相同负载)

10:00:35.521->-----------------
10:00:35.521 ->测量值:                      16位16位... [二进制]
10:00:35.521 ->
10:00:35.521 ->分流电压:  [us]= 0.00007281V       原始[h/l]:0_11101100
10:00:35.521 ->
10:00:35.521 ->总线电压:   ![Ub]= 0.22519531 V       原始[h/l]:0_10010011001
10:00:35.521 ->功率/电流:![Ub]= 20.21631050 V
10:00:35.521 ->
10:00:35.521 ->温度:    [T]=33.85156250 C      原始[h/l]:0_1000011101110
10:00:35.521 ->电流:         [i]= 0.07281250A       原始[h/l]:0_11100110
10:00:35.521 ->电源:          [P]= 1.47200012W      原始[h/l]:0_10110101101
10:00:35.521 ->能源:         [E]= 1.42400002 J       原始[h/l]:0_0_0_1011100
10:00:35.521 ->充电:         [C]= 0.07156250 C       原始[h/l]:0_0_0_11101110

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

    您好!

    为了排除潜在的软件/读取错误、您能否发送一个来自 INA228的读取命令和响应的示波器快照(理想情况下具有 I2C 解码)?  此外、最好使用电压表来确认电压并获得更精确的测量值、以便在转换时进行比较。  

    排除软件/读取错误的另一种方法是将您的设置连接到 EVM 并使用 GUI 进行读取、以查看值是否正确。  您甚至可以尝试仅使用 EVM 随附的 MCU/固件、并通过跳线将通信连接到您的设置、以查看 GUI 中的操作是否正常。

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

    嗨、Mitch! 问题迎刃而解! 该错误包括需要在 GetBusVoltage_raw 函数中将 uint8_t 类型额外转换为 uint32_t、以实现正确的移位(DATA[0]、DATA[1]等)。 通过 I2C 读取没有问题、但在形成一个20位寄存器值的阶段发生了一个错误。 有趣的是、虽然用于接收原始数据的代码是相同的、但所有其他参数都被正确读取。 很抱歉让你对一个令人窒息的问题感到困扰))谢谢,祝你度过美好的一天)

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

    很高兴你能找到它!