INA228 产品页 · INA238 产品页

INA228 中文手册 · INA228 英文手册 · INA238 中文手册 · INA238 英文手册 · 寄存器计算书

1. 概述

INA228 与 INA238 是德州仪器(TI)推出的数字功率监测芯片。它们通常接在被测电源回路的分流电阻两端,通过测量分流电阻上的压差来计算电流,同时监测该路电源的总线电压,并在芯片内部完成功率、能量和电荷的换算,最终通过 I2C 总线与主控完成数据交互。

两者属于同系列产品,主要区别在于 ADC 位数、测量精度以及部分能量、电荷寄存器。INA228 适合高精度计量场景,INA238 则更适合成本敏感但仍需功率监测的应用。

项目INA228INA238
ADC20 位16 位
分流满量程±163.84 mV / ±40.96 mV相同
总线电压测量范围0 V 至 85 V相同
电能、电荷有无
分流电阻温度补偿有无
适用情况高精度计量只需电流和功率、成本更敏感

2. 主要功能

2.1 电流测量

电流由外部分流电阻上的差分压降算出。MCU 读 VSHUNT(04h)得到压降,读 CURRENT(07h)得到电流。

分流电压:

芯片ADCRANGE = 0ADCRANGE = 1
INA228VSHUNT × 312.5 nVVSHUNT × 78.125 nV
INA238VSHUNT × 5 µVVSHUNT × 1.25 µV

结果单位是 V。二进制补码,有方向:IN+ 高于 IN− 时为正,反之为负。

电流先由最大预期电流确定 CURRENT_LSB,再乘寄存器值:

芯片CURRENT_LSB电流
INA228Imax / 2^19CURRENT_LSB × CURRENT
INA238Imax / 2^15CURRENT_LSB × CURRENT

结果单位是 A。二进制补码,有方向,符号与分流电压一致。

2.2 总线电压测量

VBUS 直接测量被测点对地的电压,测量范围 0 V 至 85 V,不需要外部分压。MCU 读 VBUS(05h)。

芯片公式
INA228VBUS × 195.3125 µV
INA238VBUS × 3.125 mV

结果单位是 V。寄存器按二进制补码存放,但测量值始终 ≥ 0,没有方向。

2.3 功率

功率在芯片内部按电流 × 总线电压计算。电流校准和总线电压测量都完成后,读 POWER(08h)。

芯片公式
INA2283.2 × CURRENT_LSB × POWER
INA2380.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 分流电阻温度补偿的参考。

芯片公式
INA228DIETEMP × 7.8125 m°C
INA238DIETEMP × 125 m°C

结果单位是 °C。二进制补码,可以为负,表示零下温度。这里的符号是温度正负,不是电流方向。

2.6 告警

ALERT 是开漏输出,默认低电平有效。哪一项超限,读 DIAG_ALRT(0Bh)判断。

分流过欠压和总线过欠压,INA228 与 INA238 相同。温度阈值、功率阈值,以及电能、电荷溢出标志不同。

分流过压 SOVL(0Ch)、欠压 SUVL(0Dh)都是 16 位二进制补码,有方向,单位是 V。两颗芯片的步进和可设范围相同:

ADCRANGE步进可设范围
05 µV±163.84 mV
11.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,两者并不相同,设计时需要注意区分。

引脚名称类型作用
1A1数字输入I2C 地址选择,接到 GND、VS、SDA 或 SCL
2A0数字输入I2C 地址选择,接到 GND、VS、SDA 或 SCL
3ALERT开漏输出告警,默认低电平有效,需要上拉
4SDA输入/输出I2C 数据
5SCL输入I2C 时钟
6VS电源2.7 V 至 5.5 V,对 GND 就近放 0.1 µF 去耦电容
7GND地地
8VBUS模拟输入总线电压
9IN−模拟输入高侧使用时接分流电阻负载侧,低侧使用时接分流电阻接地侧
10IN+模拟输入高侧使用时接分流电阻电源侧,低侧使用时接分流电阻负载侧

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引脚 A0I2C 器件地址7 位地址7 位地址 + 写7 位地址 + 读
1GNDGND100 00000x400x800x81
2GNDVS100 00010x410x820x83
3GNDSDA100 00100x420x840x85
4GNDSCL100 00110x430x860x87
5VSGND100 01000x440x880x89
6VSVS100 01010x450x8A0x8B
7VSSDA100 01100x460x8C0x8D
8VSSCL100 01110x470x8E0x8F
9SDAGND100 10000x480x900x91
10SDAVS100 10010x490x920x93
11SDASDA100 10100x4A0x940x95
12SDASCL100 10110x4B0x960x97
13SCLGND100 11000x4C0x980x99
14SCLVS100 11010x4D0x9A0x9B
15SCLSDA100 11100x4E0x9C0x9D
16SCLSCL100 11110x4F0x9E0x9F

3.3 典型应用

高侧采样时,分流电阻串在电源和负载之间:IN+ 接电源侧,IN− 接负载侧。低侧采样时,分流电阻串在负载和地之间:IN+ 接负载侧,IN− 接地侧。VBUS 接到要监测的那一点对地电压上。

连续测量电流、电压和功率时,ADC_CONFIG 的 MODE 选持续转换,并且同时打开分流电压和总线电压。只做电流监测时可以不测 VBUS,但这样没有功率结果。

应用笔记见 在 AM263x 上监测总线电压和功率。

4. 寄存器配置

配置顺序:先写 CONFIG 选择分流量程,再写 SHUNT_CAL 完成电流校准,然后写 ADC_CONFIG 选择测哪些项、转换时间和平均次数,最后读结果寄存器。告警阈值可以在启动转换之前写好。

4.1 CONFIG(00h)

位INA228INA238
15RST,写 1 复位,随后自动清零相同
14RSTACC,写 1 把电能和电荷清零保留,读出为 0
13–6CONVDLY,初始转换延迟,步进 2 ms,最大 510 ms相同
5TEMPCOMP,分流电阻温度补偿保留,读出为 0
4ADCRANGE,0 为 ±163.84 mV,1 为 ±40.96 mV相同

ADCRANGE 按分流电阻上的最大压降选择。最大压降 = 最大电流 × 分流电阻。超过 40.96 mV 时必须用大量程。

4.2 ADC_CONFIG(01h)

两颗芯片这一组字段相同。

位字段作用
15–12MODE测哪些通道,以及单次还是连续
11–9VBUSCT总线电压转换时间
8–6VSHCT分流电压转换时间
5–3VTCT温度转换时间
2–0AVG平均次数

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_LSBSHUNT_CAL
INA228Imax / 2^1913107.2×10⁶ × CURRENT_LSB × RSHUNT
INA238Imax / 2^15819.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 位无符号数。

读数寄存器INA228INA238
分流电压04h312.5 nV / 78.125 nV5 µV / 1.25 µV
总线电压05h195.3125 µV3.125 mV
温度06h7.8125 m°C125 m°C
电流07hCURRENT_LSB × 寄存器值相同形式,LSB 不同
功率08h3.2 × CURRENT_LSB × POWER0.2 × CURRENT_LSB × POWER
电能09h16 × 3.2 × CURRENT_LSB × ENERGY无此寄存器
电荷0AhCURRENT_LSB × CHARGE无此寄存器

斜线左边是 ADCRANGE = 0,右边是 ADCRANGE = 1。电能和电荷溢出后从 0 重新累加。INA228 写 CONFIG 的 RSTACC 可以立即清零。

4.5 告警阈值

寄存器地址对应现象转换
SOVL / SUVL0Ch / 0Dh分流过压 / 欠压两颗相同:5 µV 或 1.25 µV
BOVL / BUVL0Eh / 0Fh总线过压 / 欠压两颗相同:3.125 mV
TEMP_LIMIT10h管芯过热INA228 为 7.8125 m°C,INA238 为 125 m°C
PWR_LIMIT11h功率超限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 只在第一次读芯片:

  1. 读 MANUFACTURER_ID,必须是 5449h。
  2. 读 DEVICE_ID,只比较 bit15–bit4,忽略版本号。228h 记为 INA228,238h 记为 INA238。最多试 3 次。
  3. 认不出芯片就不写任何寄存器,之后所有读取都返回失败。
  4. 用最大电流和分流电阻算满量程压降。小于等于 40.96 mV 用小量程,否则用 163.84 mV。压降 ≤ 0 或大于 163.84 mV,初始化失败。
  5. 按芯片计算 CURRENT_LSB 和 SHUNT_CAL。小量程时 SHUNT_CAL 再乘 4。
  6. 把过流、总线过欠压、过温和过功率阈值写进对应寄存器。阈值填 0 表示这一项不改默认值。
  7. 只有第一次初始化、并且是 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_addr7 位地址由 A1、A0 决定,见 3.2 节
shunt_dir0 或 1放电时 IN+ 是否为高电位
shunt_mohmmΩ分流电阻
max_curr_mamA最大预期电流,用来算 CURRENT_LSB
chg_ocp_threshmA充电过流,0 表示不设置
dsg_ocp_threshmA放电过流,0 表示不设置
bus_ovp_threshmV总线过压
bus_uvp_threshmV总线欠压
dev_otp_thresh°C管芯过温
over_pwr_threshW过功率

运行中改分流电阻或最大电流,调用 xh_ina228_set_shunt_mohm、xh_ina228_set_max_curr_ma,驱动会重新初始化。改这两项不会再次清零电能和电荷。

5.4 读取

读取接口已经换成物理量。电流的符号受 shunt_dir 影响,与 get_current_ma 一致的方向也用于电荷。

接口单位INA238
xh_ina228_get_vshunt_mvmV有
xh_ina228_get_vbus_mvmV有
xh_ina228_get_dietemp_c°C有。有效位在 bit15–bit4
xh_ina228_get_current_mamA有
xh_ina228_get_power_wW有
xh_ina228_get_energy_jJ无此寄存器,返回失败
xh_ina228_get_charge_cC无此寄存器,返回失败
xh_ina228_get_diag_alrt寄存器原值有。bit11、bit10 无定义

电能换算是 ENERGY × 16 × 3.2 × CURRENT_LSB,单位 J,无符号。电荷换算是 CHARGE × CURRENT_LSB,单位 C,有符号。换成 Wh、Ah 仍用 2.4 节的关系:除以 3600。