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.

[参考译文] INA233:INA233 I2C 通信

Guru**** 2538930 points
Other Parts Discussed in Thread: ISO1541, INA233, INA226

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/797903/ina233-ina233-i2c-communication

器件型号:INA233
主题中讨论的其他部件:ISO1541INA226

我正在开发一个需要使用   位于 MCU 和 INA233之间的隔离器 ISO1541读取 ina233总线电压、电流等的应用。 因此、I2C 通信发生在 MCU--1SO1541 --INA233之间。

为了进行测试,我 尝试读取 MFID (制造商 ID 来自寄存器地址0x88)。 但我无法读取完整的2字节数据、我只从 IC.I 接收(2、255)数据、即读取的第二个字节始终为高电平。

与函数共享代码:

数据= Read_ina (0x88);         //从寄存器地址0x88读取数据。

unsigned char read_ina (unsigned char 地址)

unsigned int temp=0、temp2=0;
unsigned char add_lo = 0、add_hi = 0;

unsigned char reg_address = 0;
REG_ADDRESS =地址;

Start1();delay_us (300);
 write_byte_ina233 (0x88);                    //delay_us (300);      //从地址+写入位
 write_byte_address_ina233 (reg_address);      //delay_us (300);      //寄存器地址
stop1();delay_us (300);

Start1();delay_us (300);
write_byte_ina233 (0x89);trisb.f3 = 1;delay_us (300);                  //从地址+读取位
ina_data_lsb = read_Byte_ina233_ack ();            //delay_us (300);
INA_DATA_MSB = read_Byte_ina233_nack ();          //delay_us (300);

stop1();delay_us (300);

return (ina_data_msb);

其他功能如下:

void start1 (void)

trisb.f3 = 0;delay_us (300);

SDA_iso1541 = 1;delay_us (300);
SCL_iso1541 = 1;delay_us (300);

SDA_iso1541 = 0;delay_us (300);
SCL_iso1541 = 0;delay_us (300);


void stop1 (void)

trisb.f3 = 0;delay_us (300);

SDA_iso1541 = 0;delay_us (300);
SCL_iso1541 = 1;delay_us (300);

SDA_iso1541 = 1;delay_us (300);


void write_byte_ina233 (无符号字符 val)

unsigned char x=0;
trisb.f3 = 0;delay_us (500);

对于(x=0;x<=7;x++)

if (val & 0x80)
{sda_iso1541 = 1;}
其他
{sda_iso1541 =0;}

delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 =0;
delay_us (500);
Val = val << 1;


trisb.f3 = 1;delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 =0;
delay_us (500);

//trisb.f3 = 1;delay_us (300);


void write_byte_address_ina233 (无符号字符 val)

unsigned char x=0;
trisb.f3 = 0;delay_us (500);


对于(x=0;x<=7;x++)

if (val & 0x80)
{sda_iso1541 = 1;}
其他
{sda_iso1541 =0;}

delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 =0;
delay_us (500);
Val = val << 1;


trisb.f3 = 1;delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 =0;
delay_us (500);

//trisb.f3 = 1;delay_us (300);

unsigned char read_Byte_ina233_ack (void)

unsigned char x=0、val=0;
//trisb.f3 = 1;
delay_us (300);

对于(x=0;x<=7;x++)

Val = val << 1;
delay_us (500);
Val = val | sda_iso1541;
delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 =0;
delay_us (500);


delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 =0;
delay_us (500);

return (val);

unsigned char read_Byte_ina233_nack (void)

unsigned char x=0、val=0;
//trisb.f3 = 1;
//delay_us (300);

对于(x=0;x<=7;x++)

Val = val << 1;
delay_us (500);
Val = val | sda_iso1541;
delay_us (500);

SCL_iso1541 = 1;
delay_us (500);
SCL_iso1541 = 0;
delay_us (500);

//trisb.f3 =0;delay_us (100);
return (val);

请告诉我代码的一些问题。

或者、请向我发送示例代码以读取一些寄存器值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    朋友好,解决了这个问题,是通过 i2c 通信,没有从主器件拉下 sda 线路。现在我可以用字读取、字写入、块读取…
    我的下一个问题是:
    我能够读取地址(0x88)的2个寄存器、即 READ_VIN。但是我如何使用这2个数据字节来计算实际电压?
    请帮助。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很高兴您能正常工作。

    要计算总线电压、请使用数据表中的公式(3)并设置 m=8;b=0;r=2;y= Vin 寄存器值的十进制值。

    有关详细说明、请参阅第7.5.4节

    此致、Guang

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

    大家好、我使用下面的应用手册来阅读48V 电信和电流。 但我使用的是 INA233而不是 INA226。

    以下是相同的图:

    嗯、我能够以0.1V 的精度读取 V BUS 的总线电压。然而、存在一些线性问题。 我将应用以下公式来读取实际电压。

    V_ina = ina_data_msb;
    Vvolte_ina <<= 8;
    Vell_ina = Vell_ina | ina_data_lsb;
    VOLTGE_var = VOLT_INA * 0.00125;   //Vbus

    分压电阻器(R2、R1)后面的 Vbus 电压与读取结果(VOLTGE_var)匹配。   变化仅为0.1V。

    但是当我尝试获取 VIN-(GND_INA)的读数时 ,在施加-59V 电源时读数会有3V 的差异。(施加-59V 电压会在 Vbus 上提供大约20V 的电压,这是安全区域0 - 36V)。

    如何缩放 Vbus 以读取 Vin-(GND_INA)。

    我使用的器件型号是否有问题 参考器件是 INA226,我使用了 INA233。  

    我正在读取0x88寄存器,该寄存器读取的 V BUS 电压即将正常。但如何转换为实际的 Vin-电压、 它不是线性的(-59.23V Vin-在 Vbus 电压为20.144V 时应用2.78625的倍增因数时读数为56.122)即 Vbus * mult factor = Vin-从 MCU 读取。

     

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

    Jitender、您好!

    INA233在您的应用中应该同样正常。

    您是如何获得比例因子的? 您是否根据标称电阻器值测量或简单计算了它? 您可以在最小和最大输入电压之间安装直线,计算增益或比例因子。 这基本上是一个校准、应该提供非常准确的读数。

    此致、Guang