INA3221 电压电流监测

#ifndef __INAXXXX_H_
#define __INAXXXX_H_

#include "gd32f30x.h"

#define INA3221_ADDR                    (0X40<<1)
#define INA3221_CONFGI_REG        0X00    //配置寄存器
#define INA3221_CH1SHUNT_REG    0X01    //通道1分流电压
#define INA3221_CH1BUS_REG        0X02    //通道1总线电压
#define INA3221_CH2SHUNT_REG    0X03    //通道2分流电压
#define INA3221_CH2BUS_REG        0X04    //通道2总线电压
#define INA3221_CH3SHUNT_REG    0X05    //通道3分流电压
#define INA3221_CH3BUS_REG        0X06    //通道3总线电压
#define INA3221_CH1CAL_REG    0x07  //通道 1 严重警报限制
#define INA3221_CH1WAL_REG    0x08  //通道 1 警告警报限制
#define INA3221_CH2CAL_REG    0x09  //通道 2 严重警报限制
#define INA3221_CH2WAL_REG    0x0A  //通道 2 警告警报限制
#define INA3221_CH3CAL_REG    0x0B  //通道 3 严重警报限制
#define INA3221_CH3WAL_REG    0x0C  //通道 3 警告警报限制
#define INA3221_SVS_REG       0x0D  //分流电压和
#define INA3221_SVSLIMIT_REG  0x0E  //分流电压和限制
#define INA3221_ME_REG        0x0F  //屏蔽/启用 警报
#define INA3221_PVUPPER_REG   0x10  //功率有效上限
#define INA3221_PVLOW_REG     0x11  //功率有效下限
#define INA3221_MANUID_REG    0xFE  //制造商标识号
#define INA3221_DIEID_REG     0xFF  //模具标识号

#define INA3221_MANU_ID         0x5449  //唯一制造商标识号
#define INA3221_DIE_ID          0x3220  //唯一模具标识号

#define ImA(ShuntVoltage)    ((ShuntVoltage>>3)*40/10)
                    
typedef enum devinfo
{
    MANUFACTURER_ID =1,
    DIE_ID                     =2,
}DevInfo_Enum;

typedef enum devchs
{
    Shunt_Channel_1        =1,
    Bus_Channel_1            =2,
    Shunt_Channel_2        =3,
    Bus_Channel_2            =4,
    Shunt_Channel_3        =5,
    Bus_Channel_3            =6,
}DevChannel_Enum;

void INAXXXX_Init(void);

uint8_t INAXXXX_ReadOneByte(uint16_t ReadAddr);

void INAXXXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite);

void INAXXXX_WriteLenByte(uint16_t WriteAddr,uint32_t DataToWrite,uint8_t Len);

uint32_t INAXXXX_ReadLenByte(uint16_t ReadAddr,uint8_t Len);


/**************************************/
void INAXXXX_SendData(uint8_t addr,uint8_t reg,uint16_t data);

uint16_t INAXXXX_ReadData(uint8_t addr);

void INAXXXX_SetRegPointer(uint8_t addr,uint8_t reg);

uint16_t INAXXXX_GetVoltage(uint8_t addr,DevChannel_Enum DevChannel);

uint16_t INAXXXX_GetShuntVoltage(uint8_t addr, DevChannel_Enum DevChannel);

void INAXXXX_DevCheck(uint8_t addr);

uint16_t INAXXXX_GetDevInfo(uint8_t addr,DevInfo_Enum DevInfo);

#endif 

#include "inaxxxx.h"
#include "myiic.h"
#include "systick.h"


void INAXXXX_Init(void)
{

    IIC_Init();
    
    INAXXXX_SendData(INA3221_ADDR,INA3221_CONFGI_REG,0x8000);//软件复位
    INAXXXX_SendData(INA3221_ADDR,INA3221_CONFGI_REG,0X7127);// 7127为默认配置
}

uint8_t INAXXXX_ReadOneByte(uint16_t ReadAddr)
{
        uint8_t temp=0;                                                                                   
    IIC_Start();  

        IIC_Send_Byte(0X80);       //发送写命令
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr>>8);//发送高地址    
    
//        IIC_Send_Byte(0X80+((ReadAddr/256)<<1));
    
        IIC_Wait_Ack(); 
            IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();        
        IIC_Start();              
        IIC_Send_Byte(0X81);           //进入接收模式               
        IIC_Wait_Ack();     
        temp=IIC_Read_Byte(0);            
        IIC_Stop();//产生一个停止条件        
        return temp;
}

void INAXXXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
{
    IIC_Start();  

    IIC_Send_Byte(0X80);        //发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(WriteAddr>>8);//发送高地址      
    
//    IIC_Send_Byte(0X80+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据     

    IIC_Wait_Ack();       
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
    IIC_Wait_Ack();                                                           
    IIC_Send_Byte(DataToWrite);     //发送字节                               
    IIC_Wait_Ack();                     
    IIC_Stop();//产生一个停止条件 
    delay_1ms(10);
}

void INAXXXX_WriteLenByte(uint16_t WriteAddr,uint32_t DataToWrite,uint8_t Len)
{
    uint8_t t;
    for(t=0;t<Len;t++)
    {
        INAXXXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
    }
}

uint32_t INAXXXX_ReadLenByte(uint16_t ReadAddr,uint8_t Len)
{
    uint8_t t;
    uint32_t temp = 0;
    for(t=0;t<Len;t++)
    {
        temp<<=8;
        temp+=INAXXXX_ReadOneByte(ReadAddr+Len-t-1);                         
    }
    return temp;
}

void INAXXXX_SendData(uint8_t addr,uint8_t reg,uint16_t data)
{

    uint8_t temp=0;
    IIC_Start();
    IIC_Send_Byte(addr);
    IIC_Wait_Ack();
    
    IIC_Send_Byte(reg);
    IIC_Wait_Ack();
    
    temp = (uint8_t)(data >> 8);
    IIC_Send_Byte(temp);
    IIC_Wait_Ack();
    
    temp = (uint8_t)(data & 0x00FF);
    IIC_Send_Byte(temp);
    IIC_Wait_Ack();
    
    IIC_Stop();

}

uint16_t INAXXXX_ReadData(uint8_t addr)
{

//读取数据
    uint16_t temp = 0;
    IIC_Start();
    
    IIC_Send_Byte(addr+1);
    IIC_Wait_Ack();
    
    temp = IIC_Read_Byte(1);
    temp <<= 8;
    temp |= IIC_Read_Byte(0);
    
    IIC_Stop();
    return temp;
}

void INAXXXX_SetRegPointer(uint8_t addr,uint8_t reg)
{

    IIC_Start();
    
    IIC_Send_Byte(addr);
    IIC_Wait_Ack();

    IIC_Send_Byte(reg);
    IIC_Wait_Ack();
    
    IIC_Stop();
}

/*
**INAXXXX_GetVoltage:获取电压
**addr:7位芯片地址左移一位
**channel:通道号(1,2,3)
**temp:返回得到得到得电压
*/
uint16_t INAXXXX_GetVoltage(uint8_t addr,DevChannel_Enum DevChannel)
{
    uint32_t temp=0;
    switch(DevChannel)
    {
        case Bus_Channel_1:INAXXXX_SetRegPointer(addr,INA3221_CH1BUS_REG);
                    break;
        case Bus_Channel_2:INAXXXX_SetRegPointer(addr,INA3221_CH2BUS_REG);
                    break;
        case Bus_Channel_3:INAXXXX_SetRegPointer(addr,INA3221_CH3BUS_REG);
                    break;
    }
    temp = INAXXXX_ReadData(addr);
    if(temp & 0X8000)
        temp = ~(temp-1);
    return (uint16_t)temp;
}

/*
**INAXXXX_GetShuntVoltage:获取分流电压
**addr:7位芯片地址左移一位
**channel:通道号(1,2,3)
**temp:返回得到得到得电压
*/
uint16_t INAXXXX_GetShuntVoltage(uint8_t addr, DevChannel_Enum DevChannel)
{
    uint32_t temp = 0;
    switch (DevChannel)
    {
    case Shunt_Channel_1:
        INAXXXX_SetRegPointer(addr, INA3221_CH1SHUNT_REG);
        break;
    case Shunt_Channel_2:
        INAXXXX_SetRegPointer(addr, INA3221_CH2SHUNT_REG);
        break;
    case Shunt_Channel_3:
        INAXXXX_SetRegPointer(addr, INA3221_CH3SHUNT_REG);
        break;
    default:
        break;
    }
    temp = INAXXXX_ReadData(addr);
    if (temp & 0x8000)
        temp = ~(temp - 1);
    return (uint16_t)temp;
}

void INAXXXX_DevCheck(uint8_t addr)
{
    uint32_t id = 0;
    while(id != INA3221_DIE_ID)
    {
//        delay_ms(1);
        delay_1ms(1);
         //卡这说明硬件连接异常或者是地址错误
//        printf("硬件连接异常或者是地址错误");
        INAXXXX_SetRegPointer(addr,INA3221_DIEID_REG);
        id = INAXXXX_ReadData(addr);
    }
}

uint16_t INAXXXX_GetDevInfo(uint8_t addr,DevInfo_Enum DevInfo)
{
    uint32_t temp = 0;
    switch(DevInfo)
    {
        case MANUFACTURER_ID:INAXXXX_SetRegPointer(addr,INA3221_MANUID_REG);
            break;
        case DIE_ID:INAXXXX_SetRegPointer(addr,INA3221_DIEID_REG);
            break;
    }
    
    temp = INAXXXX_ReadData(addr);
    if (temp & 0x8000)
            temp = ~(temp - 1);
    return (uint16_t)temp;    
}


 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
INA3221电流监测芯片是一种具有高精度的电流监测芯片,可用于测量直流电源上的电流。当使用INA3221芯片监测电流时,如果出现电流异常,可能会出现以下情况: 1. 过载保护触发:INA3221芯片内置了过载保护功能,当被测电路中的电流超过芯片规定的最大电流范围时,芯片会自动触发过载保护功能,此时电流监测值会异常。 2. 供电电压异常:INA3221芯片需要通过供电电压来工作,如果供电电压不稳定或异常,可能导致芯片无法正常工作,进而导致电流监测值异常。 3. 接线错误:INA3221芯片需要正确连接到被测电路中,如果接线错误或接触不良,可能导致芯片无法准确测量电流值,从而出现电流监测异常。 对于INA3221电流监测芯片监测电流异常的处理方法如下: 1. 检查被测电路的电流是否超过芯片规定的最大电流范围,如果超过,应采取相应的措施,如减小负载或增加额外的保护措施,以确保电流在允许范围内。 2. 检查INA3221芯片的供电电压是否正常,如果不正常,应检查供电电压源是否稳定,并确保电压在芯片的工作范围内。 3. 检查INA3221芯片的接线是否正确,确认与被测电路的连接是否牢固可靠。如果发现问题,应及时修复或更换不良的接线。 总之,INA3221电流监测芯片监测电流异常可能是由于过载、供电电压异常或接线错误所致,需要检查相应的问题并采取适当的措施进行修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值