一芯片介绍
INA226是具有I2C™或SMBUS兼容接口的电流分流器和功率监控器。该设备同时监视并联电压降和总线电源电压。可编程的校准值,转换时间和平均值与内部乘法器结合使用,可以直接读取以安培为单位的电流和以瓦特为单位的功率。INA226感应共模总线电压上的电流,该电压可在0 V至36 V之间变化,与电源电压无关。该器件采用2.7V至5.5V单电源供电,典型功耗为330 µA。
二硬件设计
INA的电路设计可以参考官方设计。
实际上把负载接在VIN+前面,VIN-接在GND效果会更加好。监控电阻选择大功率的电阻就可以,选择的电阻关系到LSB的计算。
三程序设计
INA266采用I2C协议。
最简单的I2C代码就不发出来了,这个引用哪一家的代码都可以的。
//读2个字节,reg_addr为读的寄存器地址
u16 INA226_Read2Byte(u8 reg_addr)
{
u16 reg_data=0;
u16 temp=0;
INA226_IIC_Start();
INA226_IIC_Send_Byte(WRITE_ADDR);
if(INA226_IIC_Wait_Ack())
return 0;
INA226_IIC_Send_Byte(reg_addr);
if(INA226_IIC_Wait_Ack())
return 0;
INA226_IIC_Start();
INA226_IIC_Send_Byte(READ_ADDR);
if(INA226_IIC_Wait_Ack())
return 0;
reg_data= INA226_IIC_Read_Byte(1);
reg_data=(reg_data<<8)&0xFF00;
temp=INA226_IIC_Read_Byte(0);
INA226_IIC_Stop();
reg_data|=temp;
return reg_data;
}
//写2个字节,reg_addr为写的寄存器地址,reg_data为写的数据
u8 INA226_Write2Byte(u8 reg_addr,u16 reg_data)
{
u8 data_high=(u8)((reg_data&0xFF00)>>8);
u8 data_low=(u8)reg_data&0x00FF;
INA226_IIC_Start();
INA226_IIC_Send_Byte(WRITE_ADDR);
if(INA226_IIC_Wait_Ack())
return 0;
INA226_IIC_Send_Byte(reg_addr );
if(INA226_IIC_Wait_Ack())
return 0;
INA226_IIC_Send_Byte(data_high);
if(INA226_IIC_Wait_Ack())
return 0;
INA226_IIC_Send_Byte(data_low);
if(INA226_IIC_Wait_Ack())
return 0;
INA226_IIC_Stop();
delay_ms(2);
return 1;
}
先看INA266的寄存器。
INA266的简单使用只要写入两个寄存器,一个是配置寄存器,另一个是校准寄存器。
INA266的使用步骤可以参考以下的步骤。
首先是配置寄存器。配置的是测量模式,转换时间和分流电压和总线电压。写入两个字节。
第二步是校准寄存器。写入这个寄存器的数值我们要看下图的公式,选择出合适的LSB和分压电阻,这一步很重要,读取寄存器的数值都是靠这个完成。
void INA226_Init(void)
{
INA226_IIC_Init(); //初始化接口
delay_ms(10);
//写配置寄存器
INA226_Write2Byte(Config_Reg, 0x4527);//0100_010_100_100_111 //16次平均,1.1ms,1.1ms,连续测量分流电压和总线电压
//写校准寄存器
//LSB选择0.02mA,分压电阻选0.0001R Cal=0.00512/(0.02mA*0.0001R)=2560
INA226_Write2Byte(Calib_Reg, 0x0A00);
}
初始完INA266后就是直接读取电流,电压和功率。这3个都是直接读取寄存器。
//分流电压mV
float INA226_GetShuntVoltage(void)
{
float Shunt_V;
Shunt_V=INA226_Read2Byte(Shunt_V_Reg)*2.5*0.001;//分流电压LSB固定2.5uV
printf("data=%-5d, Shunt_V=%f mV\r\n", INA226_Read2Byte(Current_Reg),Shunt_V);
return Shunt_V;
}
电流的计算。
//获取分流电流mA
float INA226_GetShunt_Current(void)
{
float Curent;
Curent=INA226_Read2Byte(Current_Reg)*0.02; //分流电流LSB选择0.02mA
printf("data=%-5d, Curent =%f mA\r\n", INA226_Read2Byte(Current_Reg),Curent);
return Curent;
}
功率的计算。
//获取功率
float INA226_Get_Power(void)
{
float Power;
Power=INA226_Read2Byte(Power_Reg)*0.02*25;//功率LSB固定分流电流LSB的25倍
printf("data=%-5d, Power=%f mW\r\n", INA226_Read2Byte(Power_Reg),Power);
return Power;
}
头文件
#ifndef __INA226_H
#define __INA226_H
#include "sys.h"
//IO方向设置
#define INA226_SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<12;}
#define INA226_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<12;}
//IO操作函数
#define INA226_SCL PBout(6) //SCL
#define INA226_SDA PBout(7) //SDA
#define READ_INA226_SDA PBin(7)
//IIC所有操作函数
void INA226_IIC_Init(void); //初始化IIC的IO口
void INA226_IIC_Start(void); //发送IIC开始信号
void INA226_IIC_Stop(void); //发送IIC停止信号
u8 INA226_IIC_Wait_Ack(void); //等待从机应答
void INA226_IIC_Ack(void); //主机产生应答
void INA226_IIC_NAck(void); //主机不产生应答
void INA226_IIC_Send_Byte(u8 txd); //写一个字节
u8 INA226_IIC_Read_Byte(unsigned char ack); //读一个字节
void INA226_write_press(char device,char date);
float INA226_read_press(char device);
float INA226_get_press(void);
char INA226_read_byte1(void);
#define READ_ADDR 0x81 //A0=GND,A1=GND // R=1, W=0
#define WRITE_ADDR 0x80
#define Config_Reg 0x00 //配置寄存器 读写
#define Shunt_V_Reg 0x01 //分流电压 读
#define Bus_V_Reg 0x02 //总线电压 读
#define Power_Reg 0x03 //电源 读
#define Current_Reg 0x04 //电流 读
#define Calib_Reg 0x05 //校准寄存器 读写
#define Mask_En_Reg 0x06
#define Alert_Reg 0x07
#define Man_ID_Reg 0xFE //0x5449
#define ID_Reg 0xFF //0x2260
u16 INA226_Read2Byte(u8 reg_addr);
u8 INA226_Write2Byte(u8 reg_addr,u16 reg_data);
void INA226_Init(void);
float INA226_GetVoltage(void);//获取总线电压mV
float INA226_GetShunt_Current(void);//获取分流电流mA
float INA226_GetShuntVoltage(void);//分流电压mV
float INA226_Get_Power(void);//获取功率
#endif