TI INA228 · 20 位 ADC · 0~85 V 高侧电流检测 · I2C

INA228 电流 / 电压 / 功率监测模块
02526 黑板 · 03065 红板

INA228 是 TI 的 20 位电能计量芯片,比常见的 INA219(12 位)、INA226(16 位)高一个档次: 偏移电压 ±1 µV、增益误差 ±0.05%,还内置电能(焦耳)和电荷(库仑)累加器, 适合电池续航测试、功耗分析、小电流精密测量这类"INA219 精度不够用"的场合。 本页把两个 SKU 的差异、最容易接错的高侧串联接线、R015 采样电阻实际能测多大电流、 SHUNT_CAL 校准怎么算,以及 VSCode + ESP-IDF 和 Arduino 两套代码一次讲完。

更新于 2026-08-08 · SKU 02526 / 03065

  • ADC20 bit
  • 总线电压0~85 V
  • 分流量程±163.84 / ±40.96 mV
  • 增益误差±0.05% max
  • 偏移±1 µV max
  • I2C 地址0x40~0x4F
  • 模块供电2.7~5.5 V
SKU 02526 INA228 电流电压监控器 黑色PCB 模块实物图,板载 R015 采样电阻,排针与绿色端子未焊
SKU 02526:黑色 PCB,板载采样电阻丝印 R015,排针和绿色端子随板附送、未焊接,板上带两个 Qwiic / STEMMA QT 座。
01

两个 SKU 怎么选

两个都是 INA228 芯片,芯片性能完全一样,差别在板型、采样电阻和端子形式。挑哪个只看你怎么接线。

SKU 02526 INA228 黑色PCB模块,25.4×20.4mm,R015采样电阻,Qwiic接口 SKU 02526

黑板 · 排针未焊

  • 尺寸 25.4 × 20.4 mm,约 3.7 g(板 2 g + 配件 1.7 g)
  • 采样电阻丝印 R015 ≈ 0.015 Ω
  • 带 两个 Qwiic / STEMMA QT 座,可免焊串接 I2C
  • 排针 + 绿色 3P 螺丝端子随板附送但未焊,要自己焊
  • 适合:会焊接、想用 Qwiic 线免焊快速验证、要接进面包板的
SKU 03065 INA228 红色PCB模块,25.6×21.8mm,直针端子已焊,绿色蓝色螺丝端子 SKU 03065

红板 · 直针已焊

  • 尺寸 25.6 × 21.8 mm,约 5.2 g
  • 采样电阻为合金条式电阻,阻值 待确认
  • 直针排针出厂已焊,杜邦线直接插
  • 绿 + 蓝两组螺丝端子,粗线好接、承流更从容
  • 适合:不想动烙铁、要接较粗电源线、现场接线的
一句话

要免焊、要 Qwiic 生态、要接面包板 → 选 02526 黑板;不想焊接、要拧螺丝端子接粗线 → 选 03065 红板。 精度上两者没有区别,真正影响读数量程的是采样电阻阻值(见第 06 节)。

02

INA219 / INA226 / INA228 怎么选

客户问得最多的就是这个。三颗都是 TI 的 I2C 高侧电流检测芯片,差在分辨率、电压上限和有没有电能累加。

项目INA219INA226INA228(本页)
ADC 位数12 bit16 bit20 bit
总线电压上限26 V36 V85 V
分流量程±320 mV(可调档)±81.92 mV±163.84 / ±40.96 mV
分流电压分辨率10 µV2.5 µV312.5 / 78.125 nV
增益误差较大±0.1%±0.05% max
偏移电压—±10 µV±1 µV max
电能 / 电荷累加无无有(40 位焦耳 + 40 位库仑)
芯片温度传感器无无有(±1 °C)
典型用途入门、粗测常规功耗监测电池续航测试、待机功耗分析、精密小电流
选型建议

只是想看个大概电流 → INA219 够了,便宜。
常规 3.3 V / 5 V / 12 V 设备功耗监测 → INA226 性价比最高。
要测待机微安级电流、要跑一晚上算总耗电量(mAh / Wh)、电压超过 36 V → 必须 INA228。 电能累加器是 INA228 最值钱的功能:芯片自己在后台积分,主控隔几分钟读一次就能得到准确的总耗电, 不需要 MCU 高频轮询再自己做积分。

本站另有 INA226 / INA228 I2C 功率监测模块(02962 / 02963) 一页,讲的是另一组 SKU 的接线和排查。

03

芯片关键参数

来自 TI 数据手册

下表全部来自 TI 官方数据手册 SLYS021A(2021-01 初版 / 2022-05 修订)原文,不是估算值。

项目规格说明
ADC20 位 ΔΣ分流、总线、温度共用
分流满量程±163.84 mV / ±40.96 mV由 ADCRANGE 位切换
分流电压 LSB312.5 nV / 78.125 nV对应上面两档
总线电压0 ~ 85 VLSB = 195.3125 µV
共模电压范围−0.3 V ~ +85 V高侧检测靠这个
偏移电压±1 µV(max)漂移 ±0.01 µV/°C max
增益误差±0.05%(max)漂移 ±20 ppm/°C max
CMRR154 dB(min)
功率测量精度0.5% 满量程−40~+125 °C,max
电能 / 电荷精度1.0% 满量程max
内置温度传感器±1 °C(25 °C,max)LSB = 7.8125 m°C
供电2.7 ~ 5.5 V典型工作电流 640 µA
I2C最高 2.94 MHz16 个可选地址
转换时间50 µs ~ 4.12 ms8 档可选
采样平均1 ~ 1024 次8 档可选
04

模块参数与引脚

这一段必须分清

上面第 03 节是芯片参数,抄手册的,可以放心用。 这一节是模块参数,只有实物量过才算数。 标 待确认 的项目我们还没逐个测,不要拿去跟客户打包票。

项目02526 黑板03065 红板
PCB 尺寸25.4 × 20.4 mm25.6 × 21.8 mm
重量约 3.7 g(板 2 g)约 5.2 g
采样电阻丝印R015(≈ 0.015 Ω)待确认
采样电阻精度 / 功率待确认待确认
排针是否已焊未焊(附送)已焊(直针)
螺丝端子绿色 3P,未焊绿 + 蓝 各 2P,已焊
Qwiic / STEMMA QT有,2 个无
默认 I2C 地址0x40(A1 = A0 = GND 时);地址焊盘状态待确认,建议先跑扫描
最大可测电流受采样电阻功率限制,见第 06 节;连续额定值待实测

引脚说明

  • VIN+被测电流流入端,接电源正极。芯片内部这一脚也是共模电压参考。
  • VIN−被测电流流出端,接负载正极。VIN+ 与 VIN− 之间就是那颗采样电阻。
  • VBUS总线电压检测输入,测的是"这一脚对 GND"的电压,量程 0~85 V。该脚在板上是否已内部连到 VIN+,待用万用表通断档确认;若未连,要单独接到你想测电压的那个点。
  • VCC / VIN模块自身逻辑供电,2.7~5.5 V,接主控 3V3 或 5V。注意:这跟被测的 85 V 是两回事,绝不能接高压。
  • GND地。必须和主控共地,否则 I2C 通不了。
  • SDA / SCLI2C 数据 / 时钟。模块板上通常已带上拉电阻,接主控对应引脚即可。
  • ALRT报警输出(开漏),超过你设定的过压 / 欠压 / 过温 / 过功率门限时拉低。不用可以悬空。
  • A0 / A1地址选择。接 GND / VS / SDA / SCL 四种状态组合出 16 个地址(0x40~0x4F)。

丝印以实物为准 上面的名称按商品图上可辨认的丝印整理。不同批次板子丝印可能写作 IN+/IN− 或 VIN+/VIN−,含义相同;接线前请以手上实物丝印为准。

05

接线:这里是客户最容易错的地方

最高频的售后问题

VIN+ 和 VIN− 必须"串"在电源到负载的线路上,不能"并"在电源正负极两端。 并联接法读数会恒为 0 或乱跳,而且采样电阻等于直接横跨电源,有烧电阻的风险。

INA228 错误接法与正确接法对比图:左边并联到电源两端为错误,右边串联在电源与负载之间为正确
左边是错的,右边才对。判断方法很简单:负载的电流有没有全部流经模块?没有就是接错了。

正确接法:高侧串联

  1. 被测电源 正极 → 模块 VIN+
  2. 模块 VIN− → 负载 正极
  3. 负载 负极 → 被测电源 负极(这根线不经过模块)
  4. 模块 VCC / GND / SDA / SCL 单独接主控,与被测回路共地
INA228 高侧串联接线图:电源正极经 VIN+ 和采样电阻到 VIN- 再到负载正极,负载负极回电源负极,I2C 四线单独接主控
红线是正极电流路径,黑线是回流路径,I2C 四根线从模块下方单独走,不与电流回路交叉。

I2C 接线对照表

模块ESP32(经典)ESP32-S3Arduino UNO / Nano
VCC3V33V35V 或 3.3V
GNDGNDGNDGND
SDAGPIO21GPIO8(可改)A4
SCLGPIO22GPIO9(可改)A5
ALRT不用可悬空;要用就接任意可中断 GPIO
供电别搞混

模块 VCC 用主控的 3.3 V / 5 V 供电,被测电源可以是完全独立的另一路(比如 24 V 电池)。 两者只需要共地。被测电压最高 85 V,但 VCC 只能 2.7~5.5 V——把高压误接到 VCC 会当场烧板。

06

这块板到底能测多大电流

客户最常问的第二个问题。答案分两层:芯片量程算出来一个数,采样电阻的散热能力又会把它压下来,实际能用的是后者。

第一层:芯片量程能测多少

以 02526 黑板(R015 = 0.015 Ω) 为例:

ADCRANGE = 0(±163.84 mV 档)
  最大电流 = 163.84 mV ÷ 0.015 Ω = ±10.92 A
  分辨率   = 312.5 nV ÷ 0.015 Ω = 20.83 µA

ADCRANGE = 1(±40.96 mV 档)
  最大电流 = 40.96 mV ÷ 0.015 Ω = ±2.73 A
  分辨率   = 78.125 nV ÷ 0.015 Ω = 5.21 µA

小电流场景请务必切到 ADCRANGE = 1,分辨率直接好 4 倍,能分辨到 5 µA 级别——这正是 INA228 用来测待机功耗的价值所在。

第二层:采样电阻的功率把上限压下来

电流流过采样电阻会发热,功率 P = I² × R。0.015 Ω 在不同电流下的实际发热:

电流电阻压降电阻发热说明
1 A15 mV0.015 W毫无压力
3 A45 mV0.135 W轻松
5 A75 mV0.375 W常见 2512 封装可承受
8 A120 mV0.96 W已接近 1 W 电阻极限,会明显发烫
10.9 A163 mV1.78 W芯片量程虽然到了,电阻多半扛不住
回答客户时必须说清

"理论量程 ±10.9 A" 和 "可以长期跑 10 A" 不是一回事。 真正的连续电流上限由采样电阻的额定功率、PCB 铜箔和端子承载能力三者中最弱的一环决定, 而本批次采样电阻的额定功率尚待确认。 保守建议:连续电流按 5 A 以内使用,短时峰值不超过 8 A;需要更大电流请选更低阻值的板子或外接分流器。

另外注意:压降本身也是代价。10 A 时采样电阻上要掉 163 mV,如果你的负载对供电电压很敏感(比如 3.3 V 系统),这 0.16 V 是要算进去的。

07

校准:CURRENT_LSB 与 SHUNT_CAL 怎么算

INA228 不会自己知道你板上焊的是多大的电阻。上电后必须往 SHUNT_CAL 寄存器写一个校准值, CURRENT 和 POWER 寄存器读出来才是对的。这一步漏掉,电流读数就是错的—— 这是"读数偏大偏小"类售后问题的头号原因。

两条公式(TI 手册 Equation 2 / 3)

CURRENT_LSB = 最大预期电流 ÷ 219
SHUNT_CAL   = 13107.2 × 106 × CURRENT_LSB × RSHUNT

※ 如果用 ADCRANGE = 1(±40.96 mV 档),算出的 SHUNT_CAL 还要 × 4

实算例:02526 黑板,打算测 10 A

已知:RSHUNT = 0.015 Ω,最大预期电流 = 10 A

① CURRENT_LSB = 10 ÷ 524288 = 1.9073486 × 10−5 A = 19.073 µA
② SHUNT_CAL   = 13107.2e6 × 1.9073486e−5 × 0.015
               = 250000 × 0.015 = 3750(十六进制 0x0EA6)

若改用 ADCRANGE = 1:3750 × 4 = 15000(0x3A98)

读出来怎么换算成物理量

要什么读哪个寄存器怎么算
总线电压 VVBUS原始值 × 195.3125 µV
分流电压 VVSHUNT原始值 × 312.5 nV(ADCRANGE=0)
电流 ACURRENT原始值 × CURRENT_LSB
功率 WPOWER3.2 × CURRENT_LSB × 原始值
电能 JENERGY16 × 3.2 × CURRENT_LSB × 原始值
电荷 CCHARGE原始值 × CURRENT_LSB
芯片温度 °CDIETEMP原始值 × 7.8125 m°C
位对齐这个坑

VSHUNT、VBUS、CURRENT 都是 24 位寄存器,但有效数据只有高 20 位, 低 4 位是保留位恒为 0。读回来必须先右移 4 位,然后按 20 位二进制补码做符号扩展。 忘了移位,读数会正好差 16 倍——这是自己写驱动时最常见的 bug。
POWER 是例外:24 位全部有效、无符号,不要移位。

08

寄存器表

TI SLYS021A 表 7-3
地址名称位宽作用 / 复位值
0x00CONFIG16复位、ADCRANGE 量程选择。复位值 0x0000
0x01ADC_CONFIG16工作模式、转换时间、平均次数。复位值 0xFB68
0x02SHUNT_CAL16校准值,必须写。复位值 0x1000
0x03SHUNT_TEMPCO16采样电阻温度系数补偿
0x04VSHUNT24分流电压,高 20 位有效,有符号
0x05VBUS24总线电压,高 20 位有效,恒为正
0x06DIETEMP16芯片温度,有符号
0x07CURRENT24电流,高 20 位有效,有符号
0x08POWER24功率,24 位全有效,无符号
0x09ENERGY40累计电能(焦耳),无符号
0x0ACHARGE40累计电荷(库仑),有符号
0x0BDIAG_ALRT16报警标志与配置。复位值 0x0001
0x0C~0x0FSOVL / SUVL / BOVL / BUVL16分流、总线的过压 / 欠压门限
0x10TEMP_LIMIT16过温门限
0x11PWR_LIMIT16过功率门限
0x3EMANUFACTURER_ID16固定读回 0x5449(ASCII "TI")
0x3FDEVICE_ID16固定读回 0x2281(型号 0x228 + 版本 1)
调试第一步

怀疑通信有问题时,先读 0x3E,能读回 0x5449 就说明 I2C 通了、地址也对, 问题一定在后面的配置或接线上。这一招能省掉一半排查时间。

09

VSCode + ESP-IDF 代码(裸寄存器)

ESP-IDF 环境下没有现成的 INA228 组件,直接按寄存器写反而更清楚。下面这份用的是 ESP-IDF v5.2 起的新 I2C 主机驱动 driver/i2c_master.h, 每个魔数后面都标了出处,改 R_SHUNT 和 I_MAX 两行就能适配别的板子。

验证状态

这份代码尚未在本店实机烧录验证,寄存器地址与换算系数均照 TI 数据手册 SLYS021A 写。 客户实测有出入请反馈,我们会更正本页。

main/ina228_main.c
/*
 * INA228 电流 / 电压 / 功率读取 —— ESP-IDF 裸寄存器示例
 *
 * 开发环境:VSCode + ESP-IDF v5.2 及以上(新版 I2C 驱动 driver/i2c_master.h)
 * 硬件    :ESP32-S3 + INA228 模块(02526 黑板,采样电阻 R015 ≈ 0.015 Ω)
 * 接线    :模块 VCC -> 3V3   GND -> GND   SDA -> GPIO8   SCL -> GPIO9
 *           VIN+ 接被测电源正极,VIN- 接负载正极(必须串联,见本页接线图)
 *
 * CMakeLists.txt:
 *   idf_component_register(SRCS "ina228_main.c" INCLUDE_DIRS "" REQUIRES driver)
 *
 * 说明:所有换算系数来自 TI 数据手册 SLYS021A。
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c_master.h"
#include "esp_log.h"

static const char *TAG = "INA228";

#define I2C_PORT        I2C_NUM_0
#define PIN_SDA         8
#define PIN_SCL         9
#define INA228_ADDR     0x40      /* A1=A0=GND 时的地址;16 个地址范围 0x40~0x4F */

/* ---- 寄存器地址(手册 Table 7-3)---- */
#define REG_CONFIG          0x00
#define REG_ADC_CONFIG      0x01
#define REG_SHUNT_CAL       0x02
#define REG_VSHUNT          0x04  /* 24 位,高 20 位有效,有符号 */
#define REG_VBUS            0x05  /* 24 位,高 20 位有效,恒正   */
#define REG_DIETEMP         0x06  /* 16 位,有符号               */
#define REG_CURRENT         0x07  /* 24 位,高 20 位有效,有符号 */
#define REG_POWER           0x08  /* 24 位全有效,无符号,不移位 */
#define REG_MANUFACTURER_ID 0x3E  /* 应读回 0x5449 = "TI"        */
#define REG_DEVICE_ID       0x3F  /* 应读回 0x2281               */

/* ---- 改这两行就能适配别的板子 ---- */
#define R_SHUNT   0.015f   /* Ω,02526 黑板丝印 R015 */
#define I_MAX     10.0f    /* A,你打算测的最大电流   */

static i2c_master_dev_handle_t s_dev;
static float s_current_lsb;

static esp_err_t ina228_write16(uint8_t reg, uint16_t val)
{
    uint8_t buf[3] = { reg, (uint8_t)(val >> 8), (uint8_t)(val & 0xFF) };
    return i2c_master_transmit(s_dev, buf, sizeof(buf), 1000);
}

static esp_err_t ina228_read(uint8_t reg, uint8_t *buf, size_t len)
{
    return i2c_master_transmit_receive(s_dev, &reg, 1, buf, len, 1000);
}

static esp_err_t ina228_read16(uint8_t reg, uint16_t *out)
{
    uint8_t b[2];
    esp_err_t err = ina228_read(reg, b, 2);
    if (err == ESP_OK) *out = ((uint16_t)b[0] << 8) | b[1];
    return err;
}

/* 24 位寄存器:低 4 位是保留位,必须先右移 4 位,再按 20 位补码扩展符号。
   忘了移位读数会正好差 16 倍——这是自己写驱动最常踩的坑。 */
static esp_err_t ina228_read20_signed(uint8_t reg, int32_t *out)
{
    uint8_t b[3];
    esp_err_t err = ina228_read(reg, b, 3);
    if (err != ESP_OK) return err;

    int32_t raw = ((int32_t)b[0] << 16) | ((int32_t)b[1] << 8) | b[2];
    raw >>= 4;
    if (raw & 0x00080000) raw -= 0x00100000;   /* 20 位符号扩展 */
    *out = raw;
    return ESP_OK;
}

/* POWER 是 24 位全有效的无符号值,不移位 */
static esp_err_t ina228_read24_unsigned(uint8_t reg, uint32_t *out)
{
    uint8_t b[3];
    esp_err_t err = ina228_read(reg, b, 3);
    if (err != ESP_OK) return err;
    *out = ((uint32_t)b[0] << 16) | ((uint32_t)b[1] << 8) | b[2];
    return ESP_OK;
}

static void ina228_init(void)
{
    i2c_master_bus_config_t bus_cfg = {
        .clk_source                   = I2C_CLK_SRC_DEFAULT,
        .i2c_port                     = I2C_PORT,
        .scl_io_num                   = PIN_SCL,
        .sda_io_num                   = PIN_SDA,
        .glitch_ignore_cnt            = 7,
        .flags.enable_internal_pullup = true,
    };
    i2c_master_bus_handle_t bus = NULL;
    ESP_ERROR_CHECK(i2c_new_master_bus(&bus_cfg, &bus));

    i2c_device_config_t dev_cfg = {
        .dev_addr_length = I2C_ADDR_BIT_LEN_7,
        .device_address  = INA228_ADDR,
        .scl_speed_hz    = 400000,
    };
    ESP_ERROR_CHECK(i2c_master_bus_add_device(bus, &dev_cfg, &s_dev));

    /* 第一步永远是验身份:读不到这两个值,后面都白搭 */
    uint16_t id = 0;
    ESP_ERROR_CHECK(ina228_read16(REG_MANUFACTURER_ID, &id));
    ESP_LOGI(TAG, "MANUFACTURER_ID = 0x%04X (应为 0x5449)", id);
    ESP_ERROR_CHECK(ina228_read16(REG_DEVICE_ID, &id));
    ESP_LOGI(TAG, "DEVICE_ID       = 0x%04X (应为 0x2281)", id);

    /* ADC_CONFIG = 0xFB6A
       MODE=Fh 连续测量分流+总线+温度;三个转换时间都取 5h(1052us);AVG=2h(平均16次)
       复位默认是 0xFB68(AVG=1 次),这里改成 16 次平均把读数稳住 */
    ESP_ERROR_CHECK(ina228_write16(REG_ADC_CONFIG, 0xFB6A));

    /* 校准(手册 Equation 2/3):
       CURRENT_LSB = I_MAX / 2^19
       SHUNT_CAL   = 13107.2e6 * CURRENT_LSB * R_SHUNT
       注意:若把 CONFIG 的 ADCRANGE 置 1(±40.96mV 档),SHUNT_CAL 要再乘 4 */
    s_current_lsb = I_MAX / 524288.0f;
    uint16_t shunt_cal = (uint16_t)(13107.2e6f * s_current_lsb * R_SHUNT + 0.5f);
    ESP_ERROR_CHECK(ina228_write16(REG_SHUNT_CAL, shunt_cal));
    ESP_LOGI(TAG, "CURRENT_LSB = %.3f uA, SHUNT_CAL = %u (0x%04X)",
             s_current_lsb * 1e6f, shunt_cal, shunt_cal);
}

void app_main(void)
{
    ina228_init();

    while (1) {
        int32_t  vbus_raw = 0, vsh_raw = 0, cur_raw = 0;
        uint32_t pwr_raw  = 0;
        uint16_t temp_raw = 0;

        ESP_ERROR_CHECK(ina228_read20_signed(REG_VBUS,    &vbus_raw));
        ESP_ERROR_CHECK(ina228_read20_signed(REG_VSHUNT,  &vsh_raw));
        ESP_ERROR_CHECK(ina228_read20_signed(REG_CURRENT, &cur_raw));
        ESP_ERROR_CHECK(ina228_read24_unsigned(REG_POWER, &pwr_raw));
        ESP_ERROR_CHECK(ina228_read16(REG_DIETEMP,        &temp_raw));

        float vbus    = vbus_raw * 195.3125e-6f;          /* 195.3125 uV/LSB  */
        float vshunt  = vsh_raw  * 312.5e-9f;             /* 312.5 nV/LSB     */
        float current = cur_raw  * s_current_lsb;         /* A                */
        float power   = 3.2f * s_current_lsb * pwr_raw;   /* W,手册 Eq.5     */
        float die_c   = (int16_t)temp_raw * 7.8125e-3f;   /* 7.8125 m°C/LSB   */

        ESP_LOGI(TAG, "Bus=%.4f V  Shunt=%.3f mV  I=%.4f A  P=%.4f W  Tdie=%.2f C",
                 vbus, vshunt * 1000.0f, current, power, die_c);

        vTaskDelay(pdMS_TO_TICKS(500));
    }
}
ESP-IDF 版本提醒

driver/i2c_master.h 是 ESP-IDF v5.2 才引入的新驱动。 如果你的工程还在 v5.0 / v5.1 或者 v4.x,需要改用旧的 driver/i2c.h API (i2c_param_config() + i2c_master_cmd_begin()), 寄存器读写逻辑和换算公式完全不用改。

10

Arduino 代码(用现成库)

Arduino IDE 里直接装 RobTillaart 的 INA228 库(库管理器搜 INA228)最省事, 接口返回的都是标准单位:伏特、安培、瓦特。

ina228_basic.ino
/*
 * INA228 基础读取示例(Arduino)
 * 库:RobTillaart/INA228(库管理器搜 "INA228")
 * 硬件:INA228 模块,采样电阻 0.015 Ω(02526 黑板 R015)
 * 接线:VCC->3V3/5V  GND->GND  SDA->A4(UNO)/GPIO21(ESP32)  SCL->A5(UNO)/GPIO22(ESP32)
 *       VIN+ 接电源正极,VIN- 接负载正极(串联!)
 */
#include "Wire.h"
#include "INA228.h"

INA228 INA(0x40);          // A1=A0=GND 时地址是 0x40

void setup()
{
  Serial.begin(115200);
  Wire.begin();            // ESP32 想指定引脚:Wire.begin(21, 22);

  if (!INA.begin())
  {
    Serial.println("找不到 INA228。请检查:");
    Serial.println("  1) VCC/GND/SDA/SCL 四根线");
    Serial.println("  2) 先跑 I2C Scanner 确认实际地址(可能不是 0x40)");
    while (1) delay(1000);
  }

  // 关键一步:告诉库你要测多大电流、板上电阻多少欧
  // 不设这个,电流和功率读数全是错的
  INA.setMaxCurrentShunt(10, 0.015);

  Serial.println("INA228 就绪");
}

void loop()
{
  Serial.print("总线电压 ");
  Serial.print(INA.getBusVoltage(), 4);
  Serial.print(" V   电流 ");
  Serial.print(INA.getCurrent(), 4);
  Serial.print(" A   功率 ");
  Serial.print(INA.getPower(), 4);
  Serial.print(" W   芯片温度 ");
  Serial.print(INA.getTemperature(), 2);
  Serial.println(" C");

  delay(500);
}
用 Adafruit 库要注意单位

另一个常见选择是 Adafruit_INA228, 接口是 begin() / setShunt(电阻, 最大电流) / readBusVoltage() / readCurrent() / readPower() / readDieTemp()。 注意它的部分接口返回的是 mV / mA 而不是 V / A,代入公式前先看一眼库自带示例,别把单位搞错了。

连不上先跑这个:I2C 扫描

地址不对是排查里最常见的原因。本站有现成的 Arduino I2C 扫描器教程与代码, 先扫出实际地址再改上面的 INA228 INA(0x40)。

11

常见问题排查

万用表蜂鸣档测 VIN+ 和 VIN− 是导通的,模块是不是短路坏了?

正常,不是坏的。VIN+ 和 VIN− 之间本来就焊着一颗低阻值采样电阻(黑板是 R015 ≈ 0.015 Ω), 0.015 Ω 对万用表来说和短路没区别,所以一定会响。

INA228 的工作原理正是测量这颗电阻两端的微小压差来反推电流, 所以这两脚之间必须是低阻的——如果反而不通,那才是真坏了。

I2C 扫不到设备 / 扫到了但读数全是 0

按这个顺序查:

  1. 先确认供电:模块 VCC 有没有 3.3 V / 5 V,GND 有没有和主控共地。共地漏接是最常见的。
  2. 读 0x3E 寄存器:能读回 0x5449 就说明 I2C 通了,问题在配置不在接线。
  3. 跑 I2C Scanner:地址不一定是 0x40,A0/A1 焊盘状态会改成 0x40~0x4F 里的任意一个。
  4. 检查是否写了 SHUNT_CAL:没写校准值,CURRENT 和 POWER 会一直是 0。这是"扫得到但读数为 0"的头号原因。
  5. 确认排针真的焊透了:02526 黑板出厂不焊排针,虚焊会时好时坏。
电流读数是负的

接反了方向,不是故障。电流从 VIN+ 流进、VIN− 流出时读数为正;反过来接就是负值。

两种处理方式:把 VIN+ / VIN− 对调,或者代码里取绝对值。 如果你要测充放电双向电流(比如电池),负值本身就是有用信息,别急着改。

电流读数偏大 / 偏小,跟钳形表对不上

按可能性从大到小:

  1. 代码里的电阻值和实际不符。黑板是 0.015 Ω,很多网上例程默认写 0.1 Ω 或 0.01 Ω,直接抄会差好几倍。
  2. 读 24 位寄存器忘了右移 4 位,读数会正好差 16 倍。见第 07 节。
  3. ADCRANGE 改成 1 了但 SHUNT_CAL 没乘 4,读数会差 4 倍。
  4. 采样电阻本身有公差和温漂。大电流下电阻发热,阻值会漂,读数跟着变——这是物理限制,不是模块坏。
  5. 小电流场景下没切到 ADCRANGE = 1,分辨率不够,读数在末位跳。
能测多大电流?可以长期跑 10 A 吗?

芯片量程和实际能跑的电流不是一回事。0.015 Ω 配 ±163.84 mV 档理论到 ±10.9 A, 但 10 A 时采样电阻上要发 1.78 W 的热,普通贴片电阻扛不住。

保守建议连续 5 A 以内、峰值不超过 8 A。详细换算见第 06 节。 本批次采样电阻的额定功率待确认,需要长期大电流请先跟我们确认。

被测电压能到多少?可以直接测 60 V 电池吗?

可以,INA228 的总线电压和共模范围都是 85 V,60 V 在范围内。

但务必分清两路电:被测的 60 V 走 VIN+ / VIN− / VBUS; 模块自己的 VCC 只能接 2.7~5.5 V。 把 60 V 误接到 VCC 会当场烧掉芯片,这个错误不在保修范围内,接线前请务必核对丝印。

ALRT 脚要接吗?

不用可以直接悬空,不影响 I2C 读数。

它是开漏报警输出,只有当你在 SOVL / BOVL / TEMP_LIMIT / PWR_LIMIT 里设了门限、想让芯片在超限时主动通知主控(而不是靠轮询)时才需要接,接到任意可中断 GPIO 并加上拉。

Support

需要技术支持时,把这几项一起发来

复制下面这段填一下发给客服,我们一次就能定位,不用来回问。

【INA228 电流 / 电压 / 功率监测模块02526 黑板 · 03065  技术支持】
主控型号:            (如 Arduino UNO / ESP32 / STM32)
供电接的是:          □ 3.3V   □ 5V
I2C Scanner 扫到的地址:
串口显示的内容:
用的是哪份代码:      □ 本页示例   □ 其他(请说明)
接线照片:            (请附一张能看清接线的照片)
13

资料与参考

TI INA228 产品页

官方选型参数、应用笔记、设计工具

前往 TI 官网

INA228 数据手册 PDF

SLYS021A,本页所有芯片参数的出处

下载数据手册

RobTillaart INA228 库

Arduino 库,返回标准单位 V / A / W

GitHub 仓库

Adafruit INA228 库

另一个 Arduino 选择,注意部分接口单位是 mV / mA

GitHub 仓库

本站相关资料

14

本页信息来源

说明

芯片参数(ADC 位数、量程、LSB、精度、寄存器地址与换算公式)全部来自 TI 官方数据手册 SLYS021A(2021 年 1 月发布,2022 年 5 月修订)原文逐条核对, 包括 Equation 2/3 的 SHUNT_CAL 计算式与 Table 7-3 寄存器表。

模块参数(尺寸、重量、采样电阻丝印 R015、排针是否已焊、端子形式、Qwiic 座) 来自本店商品实物图可辨认信息。

标「待确认」的项目——包括 03065 红板的采样电阻阻值、两款板采样电阻的精度与额定功率、 地址焊盘默认状态、VBUS 是否内部连到 VIN+、连续电流额定值——尚未用实物逐项测量,请勿据此向客户承诺。 我们会在实测后回填本页。

代码:ESP-IDF 示例按数据手册编写,尚未实机烧录验证; Arduino 示例所用库接口来自 RobTillaart/INA228 头文件原文。

← 返回电源与保护分类 返回首页 进入淘宝店铺 →