一、芯片简述
众所周知,INA226是一款电流、电压、功率检测芯片,可通过IIC接口使用。这篇主要写如何计算数值,其他内容有所缩减,见谅。
二、芯片参数
IIC地址:见A0、A1,一般是0x40、0x41。
工作电压:2.7V~5.5V
监测电压:0V~36V,分辨率为16bit。
监测电流:±81.92mV,分辨率为15bit。
三、计算方法
(00H 配置寄存器)
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
RST | 这个不动 | 平均模式 4的x次方 | 电压转换时间 1.1mS | 分流电压转换时间 1.1mS | 操作模式 连续测量电压电流 | ||||||||||
0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
这个可以看这位大佬的文章,写的比较详细。
// 配置参数:平均值16,总线电压转换时间1.1ms,分流电压转换时间1.1ms,连续测量模式
INA226_WriteReg(0x00, 0x4527);
(01H 分流电压寄存器)
最大81.92 mV,最小测量单位(LSB)为2.5 μV。
这个没用到,就不写了。
(02H 总线电压寄存器)
最高40.96V,最小测量单位(LSB)为1.25 mV。
公式:
电压(V) = 电压寄存器值(02H) * 0.00125V
INA226_ReadBusVoltage = INA226_ReadReg(0x02) * 0.00125f;
(03H 功率寄存器)
公式:
功率最小单位(LSB) = 最小电流测量单位(LSB) * 25倍
功率(W) = 功率寄存器值(03H) * 功率最小单位(LSB)
官方公式:
Power_LSB = Current_LSB * 25.0f;
INA226_ReadPower = INA226_ReadReg(0x03) * Power_LSB;
(04H 电流寄存器)
公式:
电流(A) = 电流寄存器值(04H) * 电流最小单位(LSB)
官方公式:
INA226_ReadCurrent = INA226_ReadReg(0x04) * Current_LSB;
(05H 校准寄存器)
预期电流:10A
电流检测电阻:0.005mΩ
公式:
电流最小单位(LSB) = 预期电流(10A) / 2的15次方(32768)
例如:10A / 32768 = 0.00030517578125,取近似值0.000305就行。
电流校准值(CAL) = 0.00512 / ( 电流最小单位(LSB) * 电流检测电阻(0.005))
官方公式:
uint16_t Cal = (uint16_t)(0.00512f / (Current_LSB * SHUNT_RESISTOR));
INA226_WriteReg(INA226_CAL_REG, Cal);
四、工程文件
ina226.c
#include "INA226.h"
// 写入INA226寄存器
void INA226_WriteReg(uint8_t reg, uint16_t value)
{
uint8_t data[2] = {value >> 8, value & 0xFF};
HAL_I2C_Mem_Write(&INA226_I2C, INA226_ADDR, reg, I2C_MEMADD_SIZE_8BIT, data, 2, 100);
}
// 读取INA226寄存器
uint16_t INA226_ReadReg(uint8_t reg)
{
uint8_t data[2];
HAL_I2C_Mem_Read(&INA226_I2C, INA226_ADDR, reg, I2C_MEMADD_SIZE_8BIT, data, 2, 100);
return (data[0] << 8) | data[1];
}
// INA226初始化
void INA226_Init(void)
{
// 配置参数:平均值128,总线电压转换时间0.14ms,分流电压转换时间0.14ms,连续测量模式
INA226_WriteReg(INA226_CONFIG_REG, 0x4807);
// 计算校准值(假设最大预期电流为10A)
Current_LSB = 0.000305f; // ≈ MAX_CURRENT / 2的15次方
uint16_t Cal = (uint16_t)(0.00512f / (Current_LSB * SHUNT_RESISTOR));
INA226_WriteReg(INA226_CAL_REG, Cal);
Power_LSB = Current_LSB * 25.0f; // 功率校准值 = 电流最小值 * 25倍
}
// 读取电流(单位:A)
float INA226_ReadCurrent(void)
{
uint16_t raw = INA226_ReadReg(INA226_CURRENT_REG);
return raw * Current_LSB; // 根据实际LSB调整
}
// 读取总线电压(单位:V)
float INA226_ReadBusVoltage(void)
{
uint16_t raw = INA226_ReadReg(INA226_BUS_V_REG);
return raw * 0.00125f; // 1.25mV/LSB
}
// 读取分流电压(单位:mV)
float INA226_ReadShuntVoltage(void)
{
uint16_t raw = INA226_ReadReg(INA226_SHUNT_V_REG);
return raw * 0.0025f * SHUNT_RESISTOR; // 2.5μV/LSB
}
// 读取功率(单位:W)
float INA226_ReadPower(void)
{
uint16_t raw = INA226_ReadReg(INA226_POWER_REG);
return raw * Power_LSB; // 25 * 电流最小值
}
ina226.h
#ifndef __INA226_H
#define __INA226_H
#include "main.h"
#define INA226_I2C hi2c2
/********** 读写地址 **********/
#define INA226_ADDR 0x40 << 1 //A0=GND,A1=GND // R=1, W=0
#define INA226_R_ADDR 0x80
#define INA226_W_ADDR 0x81
/********** 寄存器 **********/
#define INA226_CONFIG_REG 0x00
#define INA226_SHUNT_V_REG 0x01
#define INA226_BUS_V_REG 0x02
#define INA226_POWER_REG 0x03
#define INA226_CURRENT_REG 0x04
#define INA226_CAL_REG 0x05
#define Mask_En_Reg 0x06
#define Alert_Reg 0x07
#define Man_ID_Reg 0xFE //0x5449
#define ID_Reg 0xFF //0x2260
/********** 硬件参数配置 **********/
#define SHUNT_RESISTOR 0.005f // 分流电阻5毫欧
#define MAX_CURRENT 10.0f // 最大电流
///********** 软件参数 **********/
static float Current_LSB; // 电流分辨率
static float Power_LSB; // 功率校准值
/********** 功能函数 **********/
void INA226_WriteReg(uint8_t reg, uint16_t value); // 写寄存器
uint16_t INA226_ReadReg(uint8_t reg); // 读寄存器
void INA226_Init(void); // INA226初始化
float INA226_ReadBusVoltage(void); // 读取总线电压
float INA226_ReadShuntVoltage(void); // 读取分流电压
float INA226_ReadCurrent(void); // 读取电流值
float INA226_ReadPower(void); // 读取功率值
#endif