跳转到内容

INA260 开发使用

INA260 是一颗带集成分流电阻的电流/电压/功率监测芯片,通过 I2C 输出测量结果。它直接给出电流与功率寄存器值,不需要像 INA219 那样做校准电阻换算,适合快速集成。

官方数据手册 https://www.ti.com/cn/lit/ds/symlink/ina260.pdf

I2C 地址

本文示例默认地址为 0x45

寄存器概览与数据格式

INA260 寄存器为 16-bit,大端(先读高字节再读低字节)。

常用寄存器(十六进制):

  • 0x00 Configuration(配置)
  • 0x01 Current(电流)
  • 0x02 Bus Voltage(母线电压)
  • 0x03 Power(功率)
  • 0x06 Mask/Enable(中断/告警使能与状态)
  • 0x07 Alert Limit(告警阈值)
  • 0xFE Manufacturer ID(厂商 ID)
  • 0xFF Die ID(芯片 ID)

量化单位(常用默认):

  • Bus Voltage:1.25 mV / LSB
  • Current:1.25 mA / LSB
  • Power:10 mW / LSB

注意:电流寄存器是有符号(two’s complement),方向由电流流向决定;功率寄存器通常按无符号读取;母线电压通常视为非负量。

读取电压/电流/功率

读取流程:

  1. I2C 读寄存器 16-bit 原始值
  2. 按 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、延长转换时间、降低采样频率、保证接线可靠与回路稳定