TI中文支持网
TI专业的中文技术问题搜集分享网站

INA226無法讀取測量值

目前使用C8051F340控制INA226作為電壓電流偵測器,可正常讀取Bus Voltage register 02h,但是讀取Shunt register 01h、current register 04h、power register 03h的讀值皆為0。請問造成01h/03h/04h讀值為0的原因為何?

使用偵測電路架構為High side shunt型式。

Shunt resistor阻值設定為2m ohm。

schematic.pdf

暫存器設定值參考下表進行設定:

Register setting.pdf

以下程式碼為實際應用:

void main()

{

        Word RD_Word_Data = 0;

        //float RD_Word_Data1;

        Long A = 0;

        //Word A = 0;

        Byte cnt = 0;

        Byte j = 0;

        PCA0MD &= ~0x40;                        // clear watch dog

   PCA0MD = 0x00;

   Oscillator_Init();                     // OSC=48MHZ

        P1MDOUT = 0x7F;

        XBR1 = 0x40;

 

        //read bus voltage

        I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27); <=設定configuration register

        I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00); <=設定calibration register

        I2C_WR_Byte_Data(0x82,0x01,0x02,0x00,0x00); <=設定Register Pointer

        RD_Word_Data = I2C_RD_Word_Data(0x83);       <=設定讀取位址

 

        //read shunt voltage

        I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27);

        I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00);

        I2C_WR_Byte_Data(0x82,0x01,0x01,0x00,0x00);

        RD_Word_Data = I2C_RD_Word_Data(0x83);

 

        // read current

        I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27);

        I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00);

        I2C_WR_Byte_Data(0x82,0x01,0x04,0x00,0x00);

        RD_Word_Data = I2C_RD_Word_Data(0x83);

        // read power

        I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27);

        I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00);

        I2C_WR_Byte_Data(0x82,0x01,0x03,0x00,0x00);

        RD_Word_Data = I2C_RD_Word_Data(0x83);

}

 

void I2C_WR_Byte_Data(Byte Address, Byte Para_Count, Byte Para1, Byte Para2, Byte Para3)

{

   Byte i = 0;

  

   I2C_Start();

  

   Write_Byte(Address);

       

        for (i=0; i<Para_Count; i++)

        {

                switch (i)

                {

                        case 0:

                                Write_Byte(Para1);

                             break;

                        case 1:

                                Write_Byte(Para2);

                             break;

                        case 2:

                                Write_Byte(Para3);

                             break;

                default:

                        Write_Byte(Para1);

                }

                delay_us(15);

        }

 

   I2C_Stop();

}

 

Word I2C_RD_Word_Data(Byte Address)

{

   Byte i = 0;

   Word RD_Data = 0;

  

   I2C_Start();

  

   Write_Byte(Address);

   delay_us(15);

        RD_Data = (RD_Data | Read_Byte(0));

        delay_us(15);

        RD_Data = ((RD_Data << 8) | Read_Byte(0));

        delay_us(15);

   I2C_Stop();

  

   return RD_Data;

}

 

void I2C_Start()

{

   I2C_CLK = 1;             

   I2C_DATA = 1;

   I2C_DATA = 0;

   delay_us(1);

   I2C_CLK = 0;

}

 

void I2C_Stop()

{

   I2C_CLK = 0;

   delay_us(1);

   I2C_DATA = 0;

   delay_us(1);

   I2C_CLK = 1;

   delay_us(1);

   I2C_DATA = 1;

}

 

void Write_Byte(Byte Data)

{

   Byte i = 9;

   Byte Original_Data = 0;

   bit ack;

  

   Original_Data = Data;

 

Repeat:

        Data = Original_Data;

 

        while(–i)

        {

       // load data

       I2C_DATA = (Data & 0x80)? 1 : 0;

       delay_us(1);

       // send data

       I2C_CLK = 1;

       delay_us(1);

       Data <<= 1;                      // Data = Data << 1;

       I2C_CLK = 0;

        }

       

   // get acknowledgement

   delay_us(1);

   I2C_DATA = 1;

   delay_us(1);

   I2C_CLK = 1;

   delay_us(1);

   ack = I2C_DATA;

   I2C_CLK = 0;

  

   if (ack) goto Repeat;               // ack: active low; If INA226 is no ack, repeat again

}

 

Byte Read_Byte(bit ack)

{

   char i = 9;

   Byte Data = 0;

  

   // read data

   while(–i)

   {

       Data <<= 1;            //Data = Data << 1;

       delay_us(1);

       I2C_CLK = 1;

       delay_us(1);

       Data |= I2C_DATA; // Data = Data | I2Cdata

       delay_us(1);

       I2C_CLK = 0;

   }

  

   // send ack

   delay_us(1);

   I2C_DATA = ack;

   delay_us(1);

   I2C_CLK = 1;

   delay_us(1);

   I2C_CLK = 0;

   // return data

   return Data;

}

Amy Luo:

您好,
请您做以下检查:
1、检测回路是否为完整回路,即是否有电流流过SR。
2、被检测回路是否和INA226共地,在您给出的电路图中没有表示出来。
3、I2C通信建议用示波器查看波形,查看波形是否存在干扰或时序是否正确。

赞(0)
未经允许不得转载:TI中文支持网 » INA226無法讀取測量值
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1