INA228 中文手册 · INA228 英文手册 · INA238 中文手册 · INA238 英文手册 · 寄存器计算书
1. 概述
INA228 与 INA238 是德州仪器(TI)推出的数字功率监测芯片。它们通常接在被测电源回路的分流电阻两端,通过测量分流电阻上的压差来计算电流,同时监测该路电源的总线电压,并在芯片内部完成功率、能量和电荷的换算,最终通过 I2C 总线与主控完成数据交互。
两者属于同系列产品,主要区别在于 ADC 位数、测量精度以及部分能量、电荷寄存器。INA228 适合高精度计量场景,INA238 则更适合成本敏感但仍需功率监测的应用。
| 项目 | INA228 | INA238 |
|---|---|---|
| ADC | 20 位 | 16 位 |
| 分流满量程 | ±163.84 mV / ±40.96 mV | 相同 |
| 总线电压测量范围 | 0 V 至 85 V | 相同 |
| 电能、电荷 | 有 | 无 |
| 分流电阻温度补偿 | 有 | 无 |
| 适用情况 | 高精度计量 | 只需电流和功率、成本更敏感 |
2. 主要功能
2.1 电流测量
电流由外部分流电阻上的差分压降算出。MCU 读 VSHUNT(04h)得到压降,读 CURRENT(07h)得到电流。
分流电压:
| 芯片 | ADCRANGE = 0 | ADCRANGE = 1 |
|---|---|---|
| INA228 | VSHUNT × 312.5 nV | VSHUNT × 78.125 nV |
| INA238 | VSHUNT × 5 µV | VSHUNT × 1.25 µV |
结果单位是 V。二进制补码,有方向:IN+ 高于 IN− 时为正,反之为负。
电流先由最大预期电流确定 CURRENT_LSB,再乘寄存器值:
| 芯片 | CURRENT_LSB | 电流 |
|---|---|---|
| INA228 | Imax / 2^19 | CURRENT_LSB × CURRENT |
| INA238 | Imax / 2^15 | CURRENT_LSB × CURRENT |
结果单位是 A。二进制补码,有方向,符号与分流电压一致。
2.2 总线电压测量
VBUS 直接测量被测点对地的电压,测量范围 0 V 至 85 V,不需要外部分压。MCU 读 VBUS(05h)。
| 芯片 | 公式 |
|---|---|
| INA228 | VBUS × 195.3125 µV |
| INA238 | VBUS × 3.125 mV |
结果单位是 V。寄存器按二进制补码存放,但测量值始终 ≥ 0,没有方向。
2.3 功率
功率在芯片内部按电流 × 总线电压计算。电流校准和总线电压测量都完成后,读 POWER(08h)。
| 芯片 | 公式 |
|---|---|
| INA228 | 3.2 × CURRENT_LSB × POWER |
| INA238 | 0.2 × CURRENT_LSB × POWER |
结果单位是 W。无符号,始终 ≥ 0。电流反向时功率仍为正,不表示方向。
2.4 电能与电荷
只有 INA228 有这两项。电能是功率对时间的累积,电荷是电流对时间的累积。分别读 ENERGY(09h)和 CHARGE(0Ah)。INA238 没有这两个寄存器。
| 量 | 公式 |
|---|---|
| 电能 | 16 × 3.2 × CURRENT_LSB × ENERGY |
| 电荷 | CURRENT_LSB × CHARGE |
这两项都只有 INA228 有,溢出后都会从 0 重新累计。写 CONFIG 的 RSTACC 可以立刻把两个寄存器清零。
电能单位是 J(焦耳)。40 位无符号,只增加、不为负。功率本身没有符号,所以电流反向时电能仍继续累加,不能用来判断充放电方向。
电荷单位是 C(库仑)。40 位二进制补码,有方向,符号与电流一致。正向电流使累计值增加,反向电流使累计值减小,结果可以为负。要区分充入和放出,看电荷,不看电能。
1 小时等于 3600 秒,所以常用的 Wh、Ah 与寄存器单位相差 3600 倍:
| 换算 | 关系 |
|---|---|
| 电能 | Wh = J / 3600 |
| 电荷 | Ah = C / 3600 |
电荷换算成 Ah 后符号不变。电能为正,Wh 也为正。电池容量常写成 mAh,此时 mAh = C / 3.6。
2.5 温度监测
芯片内部温度传感器测量的是管芯温度,不是电芯温度。读 DIETEMP(06h),可用于过热告警,或作为 INA228 分流电阻温度补偿的参考。
| 芯片 | 公式 |
|---|---|
| INA228 | DIETEMP × 7.8125 m°C |
| INA238 | DIETEMP × 125 m°C |
结果单位是 °C。二进制补码,可以为负,表示零下温度。这里的符号是温度正负,不是电流方向。
2.6 告警
ALERT 是开漏输出,默认低电平有效。哪一项超限,读 DIAG_ALRT(0Bh)判断。
分流过欠压和总线过欠压,INA228 与 INA238 相同。温度阈值、功率阈值,以及电能、电荷溢出标志不同。
分流过压 SOVL(0Ch)、欠压 SUVL(0Dh)都是 16 位二进制补码,有方向,单位是 V。两颗芯片的步进和可设范围相同:
| ADCRANGE | 步进 | 可设范围 |
|---|---|---|
| 0 | 5 µV | ±163.84 mV |
| 1 | 1.25 µV | ±40.96 mV |
换算:阈值电压 = 寄存器值 × 步进。SOVL 复位值为 7FFFh(正满量程),SUVL 复位值为 8000h(负满量程)。
INA228 的分流电压测量步进更细(312.5 nV 或 78.125 nV),是阈值步进的 1/16。阈值只能按 5 µV 或 1.25 µV 来设,不能设到测量分辨率那一档。INA238 的测量步进和阈值步进相同。
其余阈值:
| 阈值 | 两颗是否相同 | 换算 |
|---|---|---|
总线过压 / 欠压 BOVL、BUVL | 相同 | 寄存器值 × 3.125 mV,只有正值 |
温度 TEMP_LIMIT | 不同 | INA228:寄存器值 × 7.8125 m°C;INA238:寄存器值 × 125 m°C |
功率 PWR_LIMIT | 不同 | 寄存器值 × 256 × 该芯片的功率 LSB。INA228 的功率 LSB 是 3.2 × CURRENT_LSB,INA238 是 0.2 × CURRENT_LSB |
DIAG_ALRT 的 bit15–bit12(锁存、转换完成、平均后再比较、引脚极性)两颗相同。bit11、bit10 只有 INA228 有定义,分别是电能溢出和电荷溢出;INA238 这两位是保留位。
3. 硬件设计
3.1 内部框图与引脚

分流电阻接在 IN+ 与 IN− 之间,芯片测量的是这两脚之间的压差。
封装为 10 引脚 VSSOP。IN+ / IN− 的共模电压范围是 −0.3 V 至 +85 V,而 VBUS 的测量范围是 0 V 至 85 V,两者并不相同,设计时需要注意区分。
| 引脚 | 名称 | 类型 | 作用 |
|---|---|---|---|
| 1 | A1 | 数字输入 | I2C 地址选择,接到 GND、VS、SDA 或 SCL |
| 2 | A0 | 数字输入 | I2C 地址选择,接到 GND、VS、SDA 或 SCL |
| 3 | ALERT | 开漏输出 | 告警,默认低电平有效,需要上拉 |
| 4 | SDA | 输入/输出 | I2C 数据 |
| 5 | SCL | 输入 | I2C 时钟 |
| 6 | VS | 电源 | 2.7 V 至 5.5 V,对 GND 就近放 0.1 µF 去耦电容 |
| 7 | GND | 地 | 地 |
| 8 | VBUS | 模拟输入 | 总线电压 |
| 9 | IN− | 模拟输入 | 高侧使用时接分流电阻负载侧,低侧使用时接分流电阻接地侧 |
| 10 | IN+ | 模拟输入 | 高侧使用时接分流电阻电源侧,低侧使用时接分流电阻负载侧 |
3.2 I2C 地址配置
从机地址的字节由 7 位地址 + 1 位方向位(R/W 位) 组成。其中,Bit7 ~ Bit1 为从机地址(由A1、A0 引脚状态决定),Bit0 为 R/W 位(0 = 写,1 = 读)。
引脚 A1、A0 只能接到 GND、VS、SDA、SCL 四种电平之一,不能悬空。只要 A1、A0 的接法不同,同一条 I2C 总线上可以挂多颗从设备。7 位地址配置如下。
| 序号 | 引脚 A1 | 引脚 A0 | I2C 器件地址 | 7 位地址 | 7 位地址 + 写 | 7 位地址 + 读 |
|---|---|---|---|---|---|---|
| 1 | GND | GND | 100 0000 | 0x40 | 0x80 | 0x81 |
| 2 | GND | VS | 100 0001 | 0x41 | 0x82 | 0x83 |
| 3 | GND | SDA | 100 0010 | 0x42 | 0x84 | 0x85 |
| 4 | GND | SCL | 100 0011 | 0x43 | 0x86 | 0x87 |
| 5 | VS | GND | 100 0100 | 0x44 | 0x88 | 0x89 |
| 6 | VS | VS | 100 0101 | 0x45 | 0x8A | 0x8B |
| 7 | VS | SDA | 100 0110 | 0x46 | 0x8C | 0x8D |
| 8 | VS | SCL | 100 0111 | 0x47 | 0x8E | 0x8F |
| 9 | SDA | GND | 100 1000 | 0x48 | 0x90 | 0x91 |
| 10 | SDA | VS | 100 1001 | 0x49 | 0x92 | 0x93 |
| 11 | SDA | SDA | 100 1010 | 0x4A | 0x94 | 0x95 |
| 12 | SDA | SCL | 100 1011 | 0x4B | 0x96 | 0x97 |
| 13 | SCL | GND | 100 1100 | 0x4C | 0x98 | 0x99 |
| 14 | SCL | VS | 100 1101 | 0x4D | 0x9A | 0x9B |
| 15 | SCL | SDA | 100 1110 | 0x4E | 0x9C | 0x9D |
| 16 | SCL | SCL | 100 1111 | 0x4F | 0x9E | 0x9F |
3.3 典型应用
高侧采样时,分流电阻串在电源和负载之间:IN+ 接电源侧,IN− 接负载侧。低侧采样时,分流电阻串在负载和地之间:IN+ 接负载侧,IN− 接地侧。VBUS 接到要监测的那一点对地电压上。

连续测量电流、电压和功率时,ADC_CONFIG 的 MODE 选持续转换,并且同时打开分流电压和总线电压。只做电流监测时可以不测 VBUS,但这样没有功率结果。
应用笔记见 在 AM263x 上监测总线电压和功率。
4. 寄存器配置

配置顺序:先写 CONFIG 选择分流量程,再写 SHUNT_CAL 完成电流校准,然后写 ADC_CONFIG 选择测哪些项、转换时间和平均次数,最后读结果寄存器。告警阈值可以在启动转换之前写好。
4.1 CONFIG(00h)
| 位 | INA228 | INA238 |
|---|---|---|
| 15 | RST,写 1 复位,随后自动清零 | 相同 |
| 14 | RSTACC,写 1 把电能和电荷清零 | 保留,读出为 0 |
| 13–6 | CONVDLY,初始转换延迟,步进 2 ms,最大 510 ms | 相同 |
| 5 | TEMPCOMP,分流电阻温度补偿 | 保留,读出为 0 |
| 4 | ADCRANGE,0 为 ±163.84 mV,1 为 ±40.96 mV | 相同 |
ADCRANGE 按分流电阻上的最大压降选择。最大压降 = 最大电流 × 分流电阻。超过 40.96 mV 时必须用大量程。
4.2 ADC_CONFIG(01h)
两颗芯片这一组字段相同。
| 位 | 字段 | 作用 |
|---|---|---|
| 15–12 | MODE | 测哪些通道,以及单次还是连续 |
| 11–9 | VBUSCT | 总线电压转换时间 |
| 8–6 | VSHCT | 分流电压转换时间 |
| 5–3 | VTCT | 温度转换时间 |
| 2–0 | AVG | 平均次数 |
MODE = Fh 时连续测量分流电压、总线电压和温度。转换时间从 50 µs 到 4.12 ms。平均次数可设为 1、4、16、64、128、256、512、1024。转换时间越长、平均次数越多,读数越稳,更新越慢。
4.3 SHUNT_CAL(02h)
先选定最大预期电流 Imax,再计算 CURRENT_LSB 和 SHUNT_CAL。RSHUNT 的单位是欧姆。
| 芯片 | CURRENT_LSB | SHUNT_CAL |
|---|---|---|
| INA228 | Imax / 2^19 | 13107.2×10⁶ × CURRENT_LSB × RSHUNT |
| INA238 | Imax / 2^15 | 819.2×10⁶ × CURRENT_LSB × RSHUNT |
ADCRANGE = 1 时,上式算出的 SHUNT_CAL 再乘 4。漏乘这一步,电流会变成实际值的 4 倍。
同一套 Imax 和分流电阻,两颗芯片写入 SHUNT_CAL 的数值相同,但读 CURRENT 时要用各自的 CURRENT_LSB。
例:Imax = 20 A,RSHUNT = 1 mΩ,ADCRANGE = 0。两颗芯片的 SHUNT_CAL 都是 500。INA228 的 CURRENT_LSB 是 20 / 2^19,INA238 是 20 / 2
INA228 启用温度补偿时,把 CONFIG 的 TEMPCOMP 置 1,并按分流电阻的温度系数写 SHUNT_TEMPCO(03h)。INA238 没有这个寄存器。
4.4 读数换算
INA228 的 VSHUNT、VBUS、CURRENT 是 24 位寄存器,有效数据在 bit23–bit4,低 4 位为 0。换算前先取这 20 位。INA238 的这三项是 16 位,整寄存器就是有效数据。两颗芯片的 POWER 都是 24 位无符号数。
| 读数 | 寄存器 | INA228 | INA238 |
|---|---|---|---|
| 分流电压 | 04h | 312.5 nV / 78.125 nV | 5 µV / 1.25 µV |
| 总线电压 | 05h | 195.3125 µV | 3.125 mV |
| 温度 | 06h | 7.8125 m°C | 125 m°C |
| 电流 | 07h | CURRENT_LSB × 寄存器值 | 相同形式,LSB 不同 |
| 功率 | 08h | 3.2 × CURRENT_LSB × POWER | 0.2 × CURRENT_LSB × POWER |
| 电能 | 09h | 16 × 3.2 × CURRENT_LSB × ENERGY | 无此寄存器 |
| 电荷 | 0Ah | CURRENT_LSB × CHARGE | 无此寄存器 |
斜线左边是 ADCRANGE = 0,右边是 ADCRANGE = 1。电能和电荷溢出后从 0 重新累加。INA228 写 CONFIG 的 RSTACC 可以立即清零。
4.5 告警阈值
| 寄存器 | 地址 | 对应现象 | 转换 |
|---|---|---|---|
SOVL / SUVL | 0Ch / 0Dh | 分流过压 / 欠压 | 两颗相同:5 µV 或 1.25 µV |
BOVL / BUVL | 0Eh / 0Fh | 总线过压 / 欠压 | 两颗相同:3.125 mV |
TEMP_LIMIT | 10h | 管芯过热 | INA228 为 7.8125 m°C,INA238 为 125 m°C |
PWR_LIMIT | 11h | 功率超限 | 256 × 该芯片的功率 LSB |
PWR_LIMIT 的地址和位宽相同,但 INA228 的功率 LSB 是 3.2 × CURRENT_LSB,INA238 是 0.2 × CURRENT_LSB。同一个寄存器数值,对应的功率差 16 倍。
DIAG_ALRT(0Bh)里,bit15–bit12 用来设置锁存、转换完成是否拉 ALERT、平均完成后再比较、以及引脚极性。INA228 的 bit11 是电能溢出,bit10 是电荷溢出。INA238 的 bit11–bit10 是保留位。
4.6 器件识别
MANUFACTURER_ID(3Eh)两颗都是 5449h,也就是 ASCII 的 “TI”。DEVICE_ID(3Fh)INA228 为 2281h,INA238 为 2381h。
5. 代码设计
驱动在 reg_ina228.h、bsp_ina228.h、bsp_ina228.c、xh_ina228.h。同一套代码同时支持 INA228 和 INA238,上电读 DEVICE_ID 后自动分支。
5.1 分层
| 文件 | 职责 |
|---|---|
reg_ina228.h | 寄存器地址和复位值。DEVICE_ID 中 INA228 为 2281h,INA238 为 2381h |
bsp_ina228.c | 识别芯片、计算校准值、写阈值、把寄存器换算成物理量 |
bsp_ina228.h | 设备参数、寄存器位域,以及注册宏 REG_XH_BSP_INA228 |
xh_ina228.h | 给上层调用的接口。返回 0 表示成功,1 表示失败 |
INA238 没有的寄存器在长度表里记为 0。读电能、电荷或 SHUNT_TEMPCO 时直接返回失败,不会把保留地址读上来。
5.2 初始化
ina228_init 只在第一次读芯片:
- 读
MANUFACTURER_ID,必须是5449h。 - 读
DEVICE_ID,只比较 bit15–bit4,忽略版本号。228h记为 INA228,238h记为 INA238。最多试 3 次。 - 认不出芯片就不写任何寄存器,之后所有读取都返回失败。
- 用最大电流和分流电阻算满量程压降。小于等于 40.96 mV 用小量程,否则用 163.84 mV。压降 ≤ 0 或大于 163.84 mV,初始化失败。
- 按芯片计算
CURRENT_LSB和SHUNT_CAL。小量程时SHUNT_CAL再乘 4。 - 把过流、总线过欠压、过温和过功率阈值写进对应寄存器。阈值填 0 表示这一项不改默认值。
- 只有第一次初始化、并且是 INA228 时,才置位
RSTACC清零电能和电荷。INA238 这一位保持 0。
shunt_dir 决定过流阈值怎么映射。写 0 时,放电方向 IN+ 为高电位:放电过流进 SOVL,充电过流进 SUVL。写 1 时这两项对调。欠压阈值按补码写成负数。
5.3 注册参数
用 REG_XH_BSP_INA228 注册。必须填写的是 I2C 设备、7 位地址、分流电阻(mΩ)和最大电流(mA)。电阻与电流的乘积再除以 1000,就是满量程分流电压(mV),必须落在 (0, 163.84] 里。
| 参数 | 单位 | 作用 |
|---|---|---|
dev_addr | 7 位地址 | 由 A1、A0 决定,见 3.2 节 |
shunt_dir | 0 或 1 | 放电时 IN+ 是否为高电位 |
shunt_mohm | mΩ | 分流电阻 |
max_curr_ma | mA | 最大预期电流,用来算 CURRENT_LSB |
chg_ocp_thresh | mA | 充电过流,0 表示不设置 |
dsg_ocp_thresh | mA | 放电过流,0 表示不设置 |
bus_ovp_thresh | mV | 总线过压 |
bus_uvp_thresh | mV | 总线欠压 |
dev_otp_thresh | °C | 管芯过温 |
over_pwr_thresh | W | 过功率 |
运行中改分流电阻或最大电流,调用 xh_ina228_set_shunt_mohm、xh_ina228_set_max_curr_ma,驱动会重新初始化。改这两项不会再次清零电能和电荷。
5.4 读取
读取接口已经换成物理量。电流的符号受 shunt_dir 影响,与 get_current_ma 一致的方向也用于电荷。
| 接口 | 单位 | INA238 |
|---|---|---|
xh_ina228_get_vshunt_mv | mV | 有 |
xh_ina228_get_vbus_mv | mV | 有 |
xh_ina228_get_dietemp_c | °C | 有。有效位在 bit15–bit4 |
xh_ina228_get_current_ma | mA | 有 |
xh_ina228_get_power_w | W | 有 |
xh_ina228_get_energy_j | J | 无此寄存器,返回失败 |
xh_ina228_get_charge_c | C | 无此寄存器,返回失败 |
xh_ina228_get_diag_alrt | 寄存器原值 | 有。bit11、bit10 无定义 |
电能换算是 ENERGY × 16 × 3.2 × CURRENT_LSB,单位 J,无符号。电荷换算是 CHARGE × CURRENT_LSB,单位 C,有符号。换成 Wh、Ah 仍用 2.4 节的关系:除以 3600。