INA260 开发使用
INA260 是一颗带集成分流电阻的电流/电压/功率监测芯片,通过 I2C 输出测量结果。它直接给出电流与功率寄存器值,不需要像 INA219 那样做校准电阻换算,适合快速集成。
I2C 地址
本文示例默认地址为 0x45。
寄存器概览与数据格式
INA260 寄存器为 16-bit,大端(先读高字节再读低字节)。
常用寄存器(十六进制):
0x00Configuration(配置)0x01Current(电流)0x02Bus Voltage(母线电压)0x03Power(功率)0x06Mask/Enable(中断/告警使能与状态)0x07Alert Limit(告警阈值)0xFEManufacturer ID(厂商 ID)0xFFDie ID(芯片 ID)
量化单位(常用默认):
- Bus Voltage:
1.25 mV / LSB - Current:
1.25 mA / LSB - Power:
10 mW / LSB
注意:电流寄存器是有符号(two’s complement),方向由电流流向决定;功率寄存器通常按无符号读取;母线电压通常视为非负量。
读取电压/电流/功率
读取流程:
- I2C 读寄存器 16-bit 原始值
- 按 LSB 系数换算成物理量
换算公式:
- 电压(V):
Vbus = raw_bus_voltage * 1.25e-3 - 电流(A):
I = raw_current * 1.25e-3 - 功率(W):
P = raw_power * 10e-3
其中 raw_* 为寄存器读出的整数值(电流按 int16_t 解释;电压/功率按 uint16_t 解释)。
配置(Configuration 寄存器 0x00)
Configuration 为 16-bit,常用字段:
- Bit15:
RST软复位(写 1 触发) - Bit11..9:
AVG平均次数 - Bit8..6:
VBUSCT母线电压转换时间 - Bit5..3:
ISHCT电流转换时间 - Bit2..0:
MODE工作模式
典型配置思路:
- 想要更稳定的数据:提高 AVG(更多平均)与/或更长的转换时间(VBUSCT/ISHCT)
- 想要更快的刷新率:降低 AVG 与缩短转换时间
- 一般连续测量:MODE 选择 “连续测量电流+电压”
一个常用的“连续测量电流+电压、较快刷新”的示例配置(仅示意,具体值以数据手册为准):
- AVG:1 次(不平均)
- VBUSCT:1.1ms
- ISHCT:1.1ms
- MODE:Shunt+Bus continuous
如果你只做最小可用集成,也可以保持模块/库的默认配置,直接读三个寄存器即可。
Arduino 示例(原生 Wire,无第三方库)
下面示例展示:
- 初始化 I2C
- 可选写入配置寄存器
- 循环读取电压/电流/功率并打印到串口
cpp
#include <Wire.h>
static const uint8_t INA260_ADDR = 0x45;
static const uint8_t REG_CONFIG = 0x00;
static const uint8_t REG_CURRENT = 0x01;
static const uint8_t REG_VBUS = 0x02;
static const uint8_t REG_POWER = 0x03;
uint16_t readRegister16(uint8_t reg) {
Wire.beginTransmission(INA260_ADDR);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(INA260_ADDR, (uint8_t)2);
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
return (uint16_t(msb) << 8) | uint16_t(lsb);
}
void writeRegister16(uint8_t reg, uint16_t value) {
Wire.beginTransmission(INA260_ADDR);
Wire.write(reg);
Wire.write((uint8_t)(value >> 8));
Wire.write((uint8_t)(value & 0xFF));
Wire.endTransmission();
}
void setup() {
Serial.begin(115200);
while (!Serial) {}
Wire.begin();
Wire.setClock(400000);
uint16_t config = 0;
config |= (0b000 << 9);
config |= (0b100 << 6);
config |= (0b100 << 3);
config |= (0b111 << 0);
writeRegister16(REG_CONFIG, config);
}
void loop() {
int16_t rawCurrent = (int16_t)readRegister16(REG_CURRENT);
uint16_t rawVbus = readRegister16(REG_VBUS);
uint16_t rawPower = readRegister16(REG_POWER);
float currentA = rawCurrent * 1.25e-3f;
float voltageV = rawVbus * 1.25e-3f;
float powerW = rawPower * 10e-3f;
Serial.print("V=");
Serial.print(voltageV, 3);
Serial.print(" V I=");
Serial.print(currentA, 3);
Serial.print(" A P=");
Serial.print(powerW, 3);
Serial.println(" W");
delay(200);
}说明:
readRegister16采用 repeated start(endTransmission(false)),兼容大多数 I2C 设备读寄存器流程- 如果你发现读值始终为 0 或 I2C NACK:优先检查地址、供电、电平、电源回路是否正确串入 IN+/OUT+
常见问题排查
- 读不到设备:用 I2C 扫描确认地址是否为 0x45(或其他)
- 电流为负:电流方向与模块标注的电流正方向相反,换接 IN+/OUT+ 或按负值解释
- 读数抖动:提高 AVG、延长转换时间、降低采样频率、保证接线可靠与回路稳定