两个 SKU 怎么选
两个都是 INA228 芯片,芯片性能完全一样,差别在板型、采样电阻和端子形式。挑哪个只看你怎么接线。
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
红板 · 直针已焊
- 尺寸 25.6 × 21.8 mm,约 5.2 g
- 采样电阻为合金条式电阻,阻值 待确认
- 直针排针出厂已焊,杜邦线直接插
- 绿 + 蓝两组螺丝端子,粗线好接、承流更从容
- 适合:不想动烙铁、要接较粗电源线、现场接线的
要免焊、要 Qwiic 生态、要接面包板 → 选 02526 黑板;不想焊接、要拧螺丝端子接粗线 → 选 03065 红板。 精度上两者没有区别,真正影响读数量程的是采样电阻阻值(见第 06 节)。
INA219 / INA226 / INA228 怎么选
客户问得最多的就是这个。三颗都是 TI 的 I2C 高侧电流检测芯片,差在分辨率、电压上限和有没有电能累加。
| 项目 | INA219 | INA226 | INA228(本页) |
|---|---|---|---|
| ADC 位数 | 12 bit | 16 bit | 20 bit |
| 总线电压上限 | 26 V | 36 V | 85 V |
| 分流量程 | ±320 mV(可调档) | ±81.92 mV | ±163.84 / ±40.96 mV |
| 分流电压分辨率 | 10 µV | 2.5 µV | 312.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 的接线和排查。
芯片关键参数
来自 TI 数据手册下表全部来自 TI 官方数据手册 SLYS021A(2021-01 初版 / 2022-05 修订)原文,不是估算值。
| 项目 | 规格 | 说明 |
|---|---|---|
| ADC | 20 位 ΔΣ | 分流、总线、温度共用 |
| 分流满量程 | ±163.84 mV / ±40.96 mV | 由 ADCRANGE 位切换 |
| 分流电压 LSB | 312.5 nV / 78.125 nV | 对应上面两档 |
| 总线电压 | 0 ~ 85 V | LSB = 195.3125 µV |
| 共模电压范围 | −0.3 V ~ +85 V | 高侧检测靠这个 |
| 偏移电压 | ±1 µV(max) | 漂移 ±0.01 µV/°C max |
| 增益误差 | ±0.05%(max) | 漂移 ±20 ppm/°C max |
| CMRR | 154 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 MHz | 16 个可选地址 |
| 转换时间 | 50 µs ~ 4.12 ms | 8 档可选 |
| 采样平均 | 1 ~ 1024 次 | 8 档可选 |
模块参数与引脚
上面第 03 节是芯片参数,抄手册的,可以放心用。 这一节是模块参数,只有实物量过才算数。 标 待确认 的项目我们还没逐个测,不要拿去跟客户打包票。
| 项目 | 02526 黑板 | 03065 红板 |
|---|---|---|
| PCB 尺寸 | 25.4 × 20.4 mm | 25.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−,含义相同;接线前请以手上实物丝印为准。
接线:这里是客户最容易错的地方
VIN+ 和 VIN− 必须"串"在电源到负载的线路上,不能"并"在电源正负极两端。 并联接法读数会恒为 0 或乱跳,而且采样电阻等于直接横跨电源,有烧电阻的风险。
正确接法:高侧串联
- 被测电源 正极 → 模块 VIN+
- 模块 VIN− → 负载 正极
- 负载 负极 → 被测电源 负极(这根线不经过模块)
- 模块 VCC / GND / SDA / SCL 单独接主控,与被测回路共地
I2C 接线对照表
| 模块 | ESP32(经典) | ESP32-S3 | Arduino UNO / Nano |
|---|---|---|---|
| VCC | 3V3 | 3V3 | 5V 或 3.3V |
| GND | GND | GND | GND |
| SDA | GPIO21 | GPIO8(可改) | A4 |
| SCL | GPIO22 | GPIO9(可改) | A5 |
| ALRT | 不用可悬空;要用就接任意可中断 GPIO | ||
模块 VCC 用主控的 3.3 V / 5 V 供电,被测电源可以是完全独立的另一路(比如 24 V 电池)。
两者只需要共地。被测电压最高 85 V,但 VCC 只能 2.7~5.5 V——把高压误接到 VCC 会当场烧板。
这块板到底能测多大电流
客户最常问的第二个问题。答案分两层:芯片量程算出来一个数,采样电阻的散热能力又会把它压下来,实际能用的是后者。
第一层:芯片量程能测多少
以 02526 黑板(R015 = 0.015 Ω) 为例:
最大电流 = 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 A | 15 mV | 0.015 W | 毫无压力 |
| 3 A | 45 mV | 0.135 W | 轻松 |
| 5 A | 75 mV | 0.375 W | 常见 2512 封装可承受 |
| 8 A | 120 mV | 0.96 W | 已接近 1 W 电阻极限,会明显发烫 |
| 10.9 A | 163 mV | 1.78 W | 芯片量程虽然到了,电阻多半扛不住 |
"理论量程 ±10.9 A" 和 "可以长期跑 10 A" 不是一回事。 真正的连续电流上限由采样电阻的额定功率、PCB 铜箔和端子承载能力三者中最弱的一环决定, 而本批次采样电阻的额定功率尚待确认。 保守建议:连续电流按 5 A 以内使用,短时峰值不超过 8 A;需要更大电流请选更低阻值的板子或外接分流器。
另外注意:压降本身也是代价。10 A 时采样电阻上要掉 163 mV,如果你的负载对供电电压很敏感(比如 3.3 V 系统),这 0.16 V 是要算进去的。
校准:CURRENT_LSB 与 SHUNT_CAL 怎么算
INA228 不会自己知道你板上焊的是多大的电阻。上电后必须往 SHUNT_CAL 寄存器写一个校准值,
CURRENT 和 POWER 寄存器读出来才是对的。这一步漏掉,电流读数就是错的——
这是"读数偏大偏小"类售后问题的头号原因。
两条公式(TI 手册 Equation 2 / 3)
SHUNT_CAL = 13107.2 × 106 × CURRENT_LSB × RSHUNT
※ 如果用 ADCRANGE = 1(±40.96 mV 档),算出的 SHUNT_CAL 还要 × 4
实算例:02526 黑板,打算测 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)
读出来怎么换算成物理量
| 要什么 | 读哪个寄存器 | 怎么算 |
|---|---|---|
| 总线电压 V | VBUS | 原始值 × 195.3125 µV |
| 分流电压 V | VSHUNT | 原始值 × 312.5 nV(ADCRANGE=0) |
| 电流 A | CURRENT | 原始值 × CURRENT_LSB |
| 功率 W | POWER | 3.2 × CURRENT_LSB × 原始值 |
| 电能 J | ENERGY | 16 × 3.2 × CURRENT_LSB × 原始值 |
| 电荷 C | CHARGE | 原始值 × CURRENT_LSB |
| 芯片温度 °C | DIETEMP | 原始值 × 7.8125 m°C |
VSHUNT、VBUS、CURRENT 都是 24 位寄存器,但有效数据只有高 20 位,
低 4 位是保留位恒为 0。读回来必须先右移 4 位,然后按 20 位二进制补码做符号扩展。
忘了移位,读数会正好差 16 倍——这是自己写驱动时最常见的 bug。
POWER 是例外:24 位全部有效、无符号,不要移位。
寄存器表
TI SLYS021A 表 7-3| 地址 | 名称 | 位宽 | 作用 / 复位值 |
|---|---|---|---|
| 0x00 | CONFIG | 16 | 复位、ADCRANGE 量程选择。复位值 0x0000 |
| 0x01 | ADC_CONFIG | 16 | 工作模式、转换时间、平均次数。复位值 0xFB68 |
| 0x02 | SHUNT_CAL | 16 | 校准值,必须写。复位值 0x1000 |
| 0x03 | SHUNT_TEMPCO | 16 | 采样电阻温度系数补偿 |
| 0x04 | VSHUNT | 24 | 分流电压,高 20 位有效,有符号 |
| 0x05 | VBUS | 24 | 总线电压,高 20 位有效,恒为正 |
| 0x06 | DIETEMP | 16 | 芯片温度,有符号 |
| 0x07 | CURRENT | 24 | 电流,高 20 位有效,有符号 |
| 0x08 | POWER | 24 | 功率,24 位全有效,无符号 |
| 0x09 | ENERGY | 40 | 累计电能(焦耳),无符号 |
| 0x0A | CHARGE | 40 | 累计电荷(库仑),有符号 |
| 0x0B | DIAG_ALRT | 16 | 报警标志与配置。复位值 0x0001 |
| 0x0C~0x0F | SOVL / SUVL / BOVL / BUVL | 16 | 分流、总线的过压 / 欠压门限 |
| 0x10 | TEMP_LIMIT | 16 | 过温门限 |
| 0x11 | PWR_LIMIT | 16 | 过功率门限 |
| 0x3E | MANUFACTURER_ID | 16 | 固定读回 0x5449(ASCII "TI") |
| 0x3F | DEVICE_ID | 16 | 固定读回 0x2281(型号 0x228 + 版本 1) |
怀疑通信有问题时,先读 0x3E,能读回 0x5449 就说明 I2C 通了、地址也对,
问题一定在后面的配置或接线上。这一招能省掉一半排查时间。
VSCode + ESP-IDF 代码(裸寄存器)
ESP-IDF 环境下没有现成的 INA228 组件,直接按寄存器写反而更清楚。下面这份用的是
ESP-IDF v5.2 起的新 I2C 主机驱动 driver/i2c_master.h,
每个魔数后面都标了出处,改 R_SHUNT 和 I_MAX 两行就能适配别的板子。
这份代码尚未在本店实机烧录验证,寄存器地址与换算系数均照 TI 数据手册 SLYS021A 写。 客户实测有出入请反馈,我们会更正本页。
/*
* 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, ®, 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));
}
}
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()),
寄存器读写逻辑和换算公式完全不用改。
Arduino 代码(用现成库)
Arduino IDE 里直接装 RobTillaart 的 INA228 库(库管理器搜 INA228)最省事,
接口返回的都是标准单位:伏特、安培、瓦特。
/*
* 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_INA228,
接口是 begin() / setShunt(电阻, 最大电流) / readBusVoltage() /
readCurrent() / readPower() / readDieTemp()。
注意它的部分接口返回的是 mV / mA 而不是 V / A,代入公式前先看一眼库自带示例,别把单位搞错了。
连不上先跑这个:I2C 扫描
地址不对是排查里最常见的原因。本站有现成的 Arduino I2C 扫描器教程与代码,
先扫出实际地址再改上面的 INA228 INA(0x40)。
常见问题排查
万用表蜂鸣档测 VIN+ 和 VIN− 是导通的,模块是不是短路坏了?
正常,不是坏的。VIN+ 和 VIN− 之间本来就焊着一颗低阻值采样电阻(黑板是 R015 ≈ 0.015 Ω), 0.015 Ω 对万用表来说和短路没区别,所以一定会响。
INA228 的工作原理正是测量这颗电阻两端的微小压差来反推电流, 所以这两脚之间必须是低阻的——如果反而不通,那才是真坏了。
I2C 扫不到设备 / 扫到了但读数全是 0
按这个顺序查:
- 先确认供电:模块 VCC 有没有 3.3 V / 5 V,GND 有没有和主控共地。共地漏接是最常见的。
- 读
0x3E寄存器:能读回0x5449就说明 I2C 通了,问题在配置不在接线。 - 跑 I2C Scanner:地址不一定是 0x40,A0/A1 焊盘状态会改成 0x40~0x4F 里的任意一个。
- 检查是否写了 SHUNT_CAL:没写校准值,
CURRENT和POWER会一直是 0。这是"扫得到但读数为 0"的头号原因。 - 确认排针真的焊透了:02526 黑板出厂不焊排针,虚焊会时好时坏。
电流读数是负的
接反了方向,不是故障。电流从 VIN+ 流进、VIN− 流出时读数为正;反过来接就是负值。
两种处理方式:把 VIN+ / VIN− 对调,或者代码里取绝对值。 如果你要测充放电双向电流(比如电池),负值本身就是有用信息,别急着改。
电流读数偏大 / 偏小,跟钳形表对不上
按可能性从大到小:
- 代码里的电阻值和实际不符。黑板是 0.015 Ω,很多网上例程默认写 0.1 Ω 或 0.01 Ω,直接抄会差好几倍。
- 读 24 位寄存器忘了右移 4 位,读数会正好差 16 倍。见第 07 节。
- ADCRANGE 改成 1 了但 SHUNT_CAL 没乘 4,读数会差 4 倍。
- 采样电阻本身有公差和温漂。大电流下电阻发热,阻值会漂,读数跟着变——这是物理限制,不是模块坏。
- 小电流场景下没切到 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
需要技术支持时,把这几项一起发来
复制下面这段填一下发给客服,我们一次就能定位,不用来回问。
资料与参考
本站相关资料
- INA226 / INA228 I2C 电压电流功率监测模块(02962 / 02963)——另一组 SKU 的接线与排查
- Arduino I2C 扫描器——地址扫不到时先跑这个
- SCT-013 电流互感器——需要非接触测交流电流时的另一种方案
- 电源与保护 分类全部资料
本页信息来源
芯片参数(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 头文件原文。