1.INA233 高侧或低侧测量双向电流功率监视器简介
-
特性:
- 测量总线电压范围:0v~36v;
- 可测量电流、电压、功率;
- 电流、总线电压、功率的独立警报阈值;
- 兼容I2C、SMBus、PMBus接口的1.8v电压;
- 供电电压:2.7v~5.5v
-
引脚功能介绍:
名称 | NO | I/O | 描述 |
---|---|---|---|
A0 | 2 | 数字输入 | 地址引脚,可连接 GND、SCL、SDA、VS。与A1 共同确定从机地址,不同的连接对应不同的从机地址 |
A1 | 1 | 数字输入 | 地址引脚,可连接 GND、SCL、SDA、VS。与A2 共同确定从机地址,不同的连接对应不同的从机地址 |
ALERT | 3 | 数字输出 | 警告引脚,此引脚可用于设置 过流、欠压或过压、过功率阈值 |
GND | 7 | - | - |
IN- | 9 | 模拟输入 | 连接到采样电阻的 -端 |
IN+ | 10 | 模拟输入 | 连接到采样电阻的 +端 |
SCL | 5 | 数字输入 | I2C的SCL 线 |
SDA | 4 | 数字输入/输出 | I2C 的SDA 线 |
VBUS | 8 | 模拟输入 | 总线电压输入 |
VS | 6 | 模拟输入 | 电源输入端 2.7v~5.5v |
- INA233 功能框图
2.INA233的使用介绍
-
确定从机地址
为了与INA233通信,主机必须首先通过一个从机地址字节来访问从机设备。从机地址由 7个地址位 + 1个方向位组成(方向位指示是读还是写操作)。如下表 INA233 地址引脚的不同接法对应的从机地址。
-
设置校准寄存器
INA233 通过测量IN+和 IN- 之间的差分电压 和 VBUS上的总线电压。通过MFR_CALIBRATION 指令设置校准寄存器缩放,返回值是通过缩放合适的最低有效位或PMBus直接方程估算的电流、电压、功率。 若要采集电流、功率,则必须在设备启动时就设置校准寄存器的值。详细编程方法见后面的应用举例。 -
INA233的读写时序
从INA233读和写是通过使用不同的PMBus总线命令实现的。每个PMBus命令代码 是一个允许读和写访问的内部寄存器的地址。命令值的地址是在从机地址和最低位读写命令传送后第一个传输的字节,每个对硬件的写操作都需要一个命令地址。- 写入INA233:
①通过SDA主机向从机写入 从机地址(7位)+ 读写位(0,写)。从机返回接收到有效地址的信号。
②主机向从机写入 PMBus命令地址(参照PMBus命令部分),这个命令地址值更新寄存器的指针指向需要写入的寄存器。从机返回接收到有效地址的信号。
③接下来写入的2个字节是写入相应寄存器的数据,从机返回接收到有效数据的信号。
注:由于每次传送8位数据,对于16位数据 先发送低8位,再发送高8位。
- 从INA233读取:
①通过SDA主机向从机写入 从机地址(7位)+ 读写位(0,写)。从机返回接收到有效地址的信号。
②主机向从机写入 PMBus命令地址(参照PMBus命令部分),这个命令是要读的寄存器。从机返回接收到有效地址的信号。
③主机生成一个重复启动信号,并发送 从机地址(7位)+ 读写位(1,读) 启动读命令。
④下一个传送的字节 是从机发送的寄存器指针指示的寄存器里面的有效低8位,紧随其后的是主机发送的ACK信号。然后从机发送有效高8位。主机发送数据字节已接收到的ACK信号。
- 写入INA233:
-
PMBus命令
下表是PMBus 命令的列表,详细的各寄存器的具体介绍 可参照INA233的芯片资料。
3.应用举例
1.典型应用电路
2.设计需求
参数 | 设计目标 |
---|---|
供电电压 | 5v |
名义上的总线供给电压 | 5v |
VBUS 过压报警阈值 | 5.5v |
负载电流峰值 | 15A |
过流报警阈值 | 15A |
采样电阻 | 2mΩ |
3.详细设计方法
3.1计算校准寄存器的值
对于这个例子,假设电流峰值<15A, Current_LSB (电流分辨率) 通过公式(2)计算值为 457.7uA/bit, 为Current_LSB选择一个500uA/bit 或 1mA/bit 有效简化从 READ_IN 和 READ_PIN 返回值向 电流 和 功率的转换。这个例子Current_LSB 选1mA/bit。 用公式(1)计算 MFR_CALIBRATION寄存器的值 = 0.00512 / (1mA/bit * 2mΩ)= 2560d (A00h)。
3.2 计算PMBus系数
如上表所示,READ VIN 和 MFR_READ_VSHUNT 的PMBus值时固定的 , 电流和功率的 m 、R系数值需要计算。
如果需要最小化舍入误差,通过取反Current_LSB的值计算m的值。对于此例: m = 1 / 1mA/bit = 1000 。
R是 当计算出的m值不是整数时,通过移动小数点使m值最大 并保证 m 在-32767~32768 之间 时的小数点移动位数。
R的正值表示小数点向左移动的次数,R为负值表示小数点向右移动的次数。
因为m的值是一个整数,移动小数点不会获得更高的准确率。所以R 为0。
3.3 编程报警值
根据m 、b 、R 系数通过公式4 将电压、电流、功率转换为数字值。
例如,通过VIN_OV_WARN_LIMIT 命令设置总线过压报警阈值为5.5v 。 m=8,b=0,R=2
Y = (8*5.5 + 0) * 10^2 = 4400 d(1130h)
16位字的低8位的最后3位硬编码为0,因为报警阈值仅有12位有效分辨率。所以要确保后三位为0.
对于此例后3位已为0,故设置的数字值没有改变。
3.4 计算返回的测量值
①使用m、b、R系数根据公式(3)计算 转换为电压、电流、功率值。
②用返回值×相应的LSB
Power_LSB = 25 * Current_LSB
BusVoltage_LSB = 1.25 mv/bit 固定值
ShuntVoltage_LSB = 2.5uv/bit 固定值
4.程序代码:
- 向INA233写入数据
/******************************************************************
- 函数名称:INA_Write(unsigned char reg,unsigned int dat)
- 功能说明:向INA233 寄存器内写入数据
- 参数说明:reg,寄存器地址PMBus命令; dat 要发送的数据 16位
- 返回说明:无
- 备注说明:无
******************************************************************/
void INA_Write(unsigned char reg,unsigned int dat)
{
unsigned char data_temp[2];
data_temp[0] = (unsigned char)(dat >> 8);
data_temp[1] = (unsigned char) (dat & 0xff);
Start();
SendData(0x80); //发送设备地址1000000+写命令0
RecvACK();
SendData(reg); //发送PMBus命令
RecvACK();
SendData(data_temp[1]); //发送数据低字节
RecvACK();
SendData(data_temp[0]); //发送数据高字节
RecvACK();
Stop();
Delay_ms(5);
}
- 从INA233读取数据
/******************************************************************
- 函数名称:INA_READ(unsigned char reg)
- 功能说明:从INA233读取数据
- 参数说明:reg,要读取的寄存器地址
- 返回说明:返回读取寄存器中的值;16bit
- 备注说明: 无
******************************************************************/
unsigned int INA_READ(unsigned char reg)
{
unsigned char vol_H = 0,vol_L = 0;
unsigned int tmp = 0;
Start();
SendData(0x80); //发送设备地址1000000+写命令0
RecvACK();
SendData(reg); //发送要读取的寄存器地址,PMBus命令
RecvACK();
Start();
SendData(0x81); //发送设备地址1000000+读命令1
RecvACK();
vol_L = RecvData(); //读取数据低字节
SendACK();
vol_H = RecvData(); //读取数据高字节
SendNAK();
Stop();
tmp |= vol_H;
tmp<<=8;
tmp |= vol_L;
return tmp;
}
以上