简介INA226功率测量模块相关工程资料面向嵌入式开发者与STM32F103学习者适合具备一定嵌入式基础的读者参考围绕高精度电流、电压与功率监测场景解决INA226与MCU集成时的I2C通信、寄存器配置、采样换算及硬件连接问题。压缩包约59.3MB文件总数与具体类型明细上游暂未提供使用时可结合目录自行梳理。已有3392人学习下载说明该主题在电源管理与嵌入式监测方向具有一定参考价值。内容涉及STM32F103的I2C时序初始化、INA226量程与采样率设置、测量数据解析和功率计算也包含AD硬件设计中的分流电阻选型、电源与接地处理以及PCB布局中缩短走线、去耦降噪和信号完整性等实践要点。借助Seasky_INA226示例思路读者可对照完成从驱动编写到板级调试的完整链路并积累电力监控项目的排错与优化经验。1. 结论先行功率寄存器的数字是算出来的不是测出来的把 INA226 功率测量模块接到 STM32F103 上读 0x03 寄存器会拿到一个数很多人默认它是“测”出来的。实际上芯片内部只做了两件事把分流电阻上的差分压降、总线对地电压各转换一次然后用校准寄存器里那个整数把电流和功率乘出来。乘数填错后面所有读数都会整体偏而且偏得很有规律于是现场经常出现“硬件查了三遍、代码也翻了一遍就是不知道错在哪”的局面。这条从 µV 级差分信号到功率寄存器的计算链是理解 INA226 的关键前端决定你能测多准后端决定你算得对不对。STM32F103 这边的一次 I2C 读取只是把结果搬出来真正决定精度的是采样链路、校准系数和 PCB 布局这三件事。2. 分流采样链路±81.92 mV 的差分信号如何变成 16 位数字2.1 高边采样与固定满量程为什么 INA226 不给可编程增益INA226 的典型接法是把分流电阻串在电源正端和负载之间IN 接电源侧IN- 接负载侧芯片测的是这两点之间几十毫伏以内的压差。这个位置的共模电压等于总线电压可以高到 36 V而差模信号只有 mV 级共模抑制比和输入失调直接决定了小电流段还能不能看。和同系列早期型号不同INA226 的分流通道满量程是固定的 ±81.92 mVLSB 固定 2.5 µV没有可编程增益档位。这个选择带来的后果很直接分辨率不随量程变化软件上少了一层“换档”的状态机但也意味着小电流精度只能靠加大分流电阻来换。分流电阻的取值有一条实用公式让最大电流时的压降落在满量程的 60%80%。比如最大 2 A取 R 0.03 Ω压降 60 mV功耗 I²R 0.12 W选 2512 封装的 1 W 电阻留足余量。如果图省事用 0.01 Ω压降只有 20 mV等于只用掉四分之一量程白白丢掉两位有效分辨率。分流电阻2 A 时压降占满量程电阻功耗适用场景0.01 Ω20 mV24%0.04 W大电流、压降敏感0.03 Ω60 mV73%0.12 W通用 2 A 档0.1 Ω200 mV超量程0.4 W仅小电流需换量程表里第三行是新手最容易踩的0.1 Ω 在 2 A 下压降 200 mV早就超了 ±81.92 mV 的输入范围读数会直接卡在正满量程附近不动看起来像“芯片坏了”。实际上这是输入饱和不是器件故障。2.2 寄存器地图与补码负电流是怎么表示的INA226 对外只有 9 个有效寄存器全部 16 位、大端传输也就是高字节先出。理解这张表后面所有换算都能自己推。地址名称属性刻度说明0x00Configuration读写—复位、 averaging、转换时间、工作模式0x01Shunt Voltage读2.5 µV有符号±81.92 mV0x02Bus Voltage读1.25 mV无符号满量程 40.96 V0x03Power读25 × Current_LSB无符号0x04Current读Current_LSB有符号0x05Calibration读写—决定上面两行的刻度0x06Mask/Enable读写—报警、转换完成标志、溢出标志0x07Alert Limit读写—报警阈值0xFE / 0xFF厂商 ID / 芯片 ID读—固定常量用于握手自检0x01 和 0x04 是有符号补码这一点在双向测量里非常关键。分流电压原始值 0xFFFE 表示 -2对应 -5 µV电流同理充电和放电的符号就是靠这个区分的。麻烦在于失调芯片输入失调在 10 µV 量级全温区最坏情况能到几十 µV换算成 0.03 Ω 上就是几百 µA 到 1 mA。当真实电流接近零时读数的符号会随着噪声随机翻转看着像“电流在正负之间跳”。这是物理限制不是软件 bug。0x02 是无符号的LSB 1.25 mV满量程 40.96 V但器件推荐工作电压不超过 36 V做设计时按 36 V 留余量别拿 40.96 V 当设计上限去用。还有一个容易被忽略的自检手段上电后先读 0xFE 和 0xFF正常应分别返回 0x5449 和 0x2260。这两个常量对不上说明 I2C 根本没通或者地址错了不用再往下查换算逻辑。地址由 A0、A1 两个引脚决定可选 0x40 到 0x4F 共 16 个多路并联时靠它区分。2.3 转换时间与 averaging什么时候读到的数才是“新的”INA226 内部是两路轮流转换总线电压一路、分流电压一路各自的转换时间由配置寄存器 0x00 的 VBUSCT 和 VSHCT 决定然后整体做 AVG 次平均。一次完整更新的时间约为t_update (t_bus t_shunt) × AVG两个时间字段都是 3 位对应 140 µs、204 µs、332 µs、588 µs、1.1 ms、2.116 ms、4.156 ms、8.244 ms 八档AVG 也是 3 位对应 1、4、16、64、128、256、512、1024 次。默认配置 0x4127 是两路各 1.1 ms、AVG1、连续转换更新周期约 2.2 ms。这个公式决定了两件事。一是你能拿到多快的动态响应做电机堵转检测、想抓毫秒级的电流尖峰就得把转换时间压到 140 µs 档、AVG 取 1代价是噪声变大。二是你读数的时刻是否有效连续模式下寄存器一直在被覆盖如果刚好在转换中途读 0x01读到的可能是上一次的结果也可能是被清了一半的值表现为偶发的“跳变坏点”。想确定数据新鲜度有两条路。一是用 0x06 里的 CVRF 位转换完成标志它会在每次转换结束后置位读一次 0x06 就清零可以轮询它再读数据。二是干脆用触发模式把配置里的 MODE 写成单次分流总线0b011芯片转一轮就停读完再触发下一次时序完全可控代价是软件要主动驱动。批量采样、事后离线分析的项目里第二种更省心。提示上电复位后先写 0x8000 做一次软复位再写配置和校准否则芯片可能还停在默认的 1.1 ms/AVG1 状态你算的等待时间全对不上。3. 校准寄存器0.00512 这个常数决定了你所有读数的刻度3.1 Current_LSB 的选法与 CAL 的推导INA226 内部没有“电流”这个物理量它只有分流电压。要让 0x04 寄存器里出现电流值必须告诉芯片一个换算系数这就是 0x05 校准寄存器的作用。推导过程不复杂值得完整走一遍。设分流电阻为 R分流电压原始码为 Shunt_raw则实际电流为I Shunt_raw × 2.5e-6 / R芯片内部计算电流寄存器的公式是Current_raw Shunt_raw × CAL / 2048我们希望I Current_LSB × Current_raw两式联立Current_LSB × Shunt_raw × CAL / 2048 Shunt_raw × 2.5e-6 / R CAL 2048 × 2.5e-6 / (R × Current_LSB) 0.00512 / (R × Current_LSB)那个看起来像玄学的 0.00512就是 2048 × 2.5 µV 的结果其中 2048 是内部移位系数2.5 µV 是分流通道的 LSB。搞清来源之后换任何一款同架构的芯片都能自己推不用死记。Current_LSB 通常取“最大预期电流 / 32768”再向上圆整到一个好算的数。比如最大 2 ACurrent_LSB 2 / 32768 61.035 µA圆整到 100 µA此时量程 ±3.2768 A分辨率 0.1 mA读出来的数乘以 100 µA 就是安培值口算都行。用 61.035 µA 这种非整数值当然也可以但后续调试时人会疯。3.2 溢出与截断CAL 写不下的时候该怎么办把 Current_LSB Imax / 32768 代回 CAL 公式能得到一个非常干净的判据CAL 0.00512 × 32768 / (Imax × R) 167.77 / (Imax × R)校准寄存器是 16 位有符号最大 32767所以要求Imax × R ≥ 0.00512 V翻译成人话最大电流在分流电阻上的压降低于 5.12 mV 时CAL 一定溢出写进去会被截断成别的值读数整体偏小且毫无规律。这是新手最常撞的墙而且症状特别迷惑因为 I2C 通信完全正常ID 也读得到。举个例子测 200 mA 的小模块随手抓了个 0.01 ΩImax × R 2 mV算出来 CAL 83885超了。三种解法第一种把 R 加大到 0.1 Ω压降 20 mVCAL 8388.5能装下但功耗和压降要重新评估。第二种主动把 Current_LSB 放大接受更粗的分辨率比如取 1 mACAL 直接缩小 10 倍。第三种换用内部增益更高的型号不在 INA226 上硬扛。除了溢出截断误差也要算。CAL 是整数取整带来的相对误差约 1/(2×CAL)。CAL 上万时误差在 0.005% 量级可以忽略CAL 只有几百时误差就到千分之一以上了。所以别把 CAL 用到极小值那等于主动放弃精度。0x06 寄存器里的 OVF 位是数学溢出标志当内部乘法结果超出 16 位表示范围时会置位。调试阶段建议每次读数据都顺手判一下这位比事后对着一堆偏小的数字猜要快得多。3.3 功率寄存器为什么正好是电流刻度的 25 倍功率寄存器 0x03 是芯片内部算好的它把电流寄存器和总线电压寄存器相乘再右移 15 位除以 20000手册给的等效写法。推导一下刻度P I × V (Current_LSB × I_raw) × (1.25e-3 × V_raw) Power_raw I_raw × V_raw / 20000 P Current_LSB × 1.25e-3 × 20000 × Power_raw 25 × Current_LSB × Power_raw所以Power_LSB 25 × Current_LSB是结构决定的不是随便定的常数。Current_LSB 取 100 µA 时Power_LSB 2.5 mW读出来的功率码乘 2.5 mW 就是瓦特。这个 25 倍关系在实践中有一个副作用功率寄存器是“电流 × 电压”的乘积两路的误差会累加而且它没有额外的平均噪声比单独看电流要大。要抓细节还是分别读 0x04 和 0x02 自己乘只在看趋势时用 0x03。另外功率寄存器是无符号的负电流放电时算出来的功率符号没有意义得靠电流寄存器自己判方向。4. STM32F103 侧I2C 时序与一次完整读数的实现4.1 硬件 I2C 与软件 I2C 的取舍STM32F103 的硬件 I2C 外设功能齐全但在实际项目里的口碑不算好总线被从机拉住不放、BUSY 位卡死、错误标志置位后需要完整重新初始化才能恢复这些都是血泪经验里反复出现的场景。INA226 本身是个很守规矩的从机问题往往出在总线电平、上拉强度和多主竞争上。软件 I2CGPIO 模拟的好处是每一拍都可见可以加超时、可以在异常时强制发 9 个时钟解锁总线、可以换任意引脚避开 PCB 改版调试时用逻辑分析仪一看就明白卡在哪。代价是占用 CPU以及速率上不去。算一下开销400 kHz 下读 2 个字节大约 50 µs1 kHz 的采样率也只占用 5% 的 CPU对 F103 来说完全可以接受。真正需要高吞吐的场合比如 10 kHz 以上采样做波形分析才值得去把硬件 I2C 调稳。软件 I2C 的延时用 DWT 周期计数器或者 NOP 循环都行关键是别用HAL_Delay()那是毫秒级会把总线拉到几 kHz。开漏输出必须配外部上拉典型 2.2 kΩ4.7 kΩ上拉接到 3.3 V 而不是 INA226 的 5 V 供电否则 F103 的 IO 会被倒灌。4.2 从复位到读数的完整时序一次可靠的读数分五步上电延时、软复位、写配置、写校准、等转换完成后突发读。每一步都有坑。上电延时不能省。电源建立到 INA226 内部基准稳定需要时间手册给的等待时间是 ms 级实际工程里保守给 10 ms 更踏实。软复位写 0x8000 到 0x00然后等几毫秒让芯片回到默认状态顺便验证 I2C 是否真的通了。写配置时按目标更新周期算好字段。要 20 ms 更新一次可以取两路各 1.1 ms、AVG8更新 17.6 ms或者两路各 588 µs、AVG1618.8 ms。后者单次转换快对电流尖峰更敏感。写校准是唯一一个“写错就全盘皆错”的步骤。写完立刻回读一次 0x05确认写进去的值和算出来的一致——这一步能挡掉一半的低级错误。读数据时用突发读从 0x02 开始连读 3 个寄存器总线电压、功率、电流INA226 的地址指针会自动递增。这样三个值来自同一个转换窗口手工用“电压 × 电流”验算时才对得上。分三次单独读中间隔了一次转换算出来的功率和 0x03 对不上是必然的很多人在这里怀疑芯片坏了。等待时间按(t_bus t_shunt) × AVG算完再加 20% 余量。触发模式下更稳的做法是轮询 CVRF 位读到置位再取数。4.3 代码实现软 I2C 原语与寄存器换算下面这段是软 I2C 的骨架和 INA226 的读写封装省略了 GPIO 初始化只保留和机制相关的部分。/* 软 I2C开漏输出SCLPB6, SDAPB7外部 2.2k 上拉到 3.3V */ static inline void scl_h(void){ GPIOB-BSRR GPIO_PIN_6; } static inline void scl_l(void){ GPIOB-BRR GPIO_PIN_6; } static inline void sda_h(void){ GPIOB-BSRR GPIO_PIN_7; } static inline void sda_l(void){ GPIOB-BRR GPIO_PIN_7; } static inline uint8_t sda_r(void){ return (GPIOB-IDR GPIO_PIN_7) ? 1 : 0; } static void i2c_dly(void){ for (volatile int i 0; i 40; i) {} } /* 约 400kHz */ /* 返回 0 成功1 从机 NACK2 总线超时 */ static uint8_t i2c_start(void) { sda_h(); scl_h(); i2c_dly(); if (!sda_r()) return 2; /* SDA 被拉住总线异常 */ sda_l(); i2c_dly(); scl_l(); i2c_dly(); return 0; } static void i2c_stop(void) { sda_l(); scl_h(); i2c_dly(); sda_h(); i2c_dly(); } static uint8_t i2c_wbyte(uint8_t b) { for (int i 0; i 8; i) { if (b 0x80) sda_h(); else sda_l(); b 1; i2c_dly(); scl_h(); i2c_dly(); scl_l(); i2c_dly(); } sda_h(); i2c_dly(); scl_h(); i2c_dly(); /* 释放 SDA 等 ACK */ uint8_t nack sda_r(); scl_l(); i2c_dly(); return nack; /* 0 从机应答 */ } static uint8_t i2c_rbyte(uint8_t ack) { uint8_t v 0; sda_h(); for (int i 0; i 8; i) { scl_h(); i2c_dly(); v (v 1) | sda_r(); scl_l(); i2c_dly(); } if (ack) sda_l(); else sda_h(); /* 主机拉低表示还要继续读 */ scl_h(); i2c_dly(); scl_l(); i2c_dly(); sda_h(); return v; } #define INA226_ADDR 0x40 /* 写 16 位寄存器高字节在前 */ uint8_t ina226_wreg(uint8_t reg, uint16_t val) { if (i2c_start()) return 1; if (i2c_wbyte(INA226_ADDR 1) || i2c_wbyte(reg)) { i2c_stop(); return 1; } if (i2c_wbyte(val 8) || i2c_wbyte(val 0xFF)) { i2c_stop(); return 1; } i2c_stop(); return 0; } /* 从 reg 起连读 len 个 16 位寄存器地址指针自动递增 */ uint8_t ina226_rregs(uint8_t reg, uint16_t *out, uint8_t len) { if (i2c_start()) return 1; if (i2c_wbyte(INA226_ADDR 1) || i2c_wbyte(reg)) { i2c_stop(); return 1; } if (i2c_start()) return 1; /* 重复起始 */ if (i2c_wbyte((INA226_ADDR 1) | 1)) { i2c_stop(); return 1; } for (uint8_t i 0; i len; i) { uint8_t hi i2c_rbyte(1); /* 中间字节都 ACK */ uint8_t lo i2c_rbyte(i len - 1 ? 0 : 1); /* 最后一字节 NACK */ out[i] ((uint16_t)hi 8) | lo; } i2c_stop(); return 0; }这段代码里有三处值得说明。i2c_start()里检查 SDA 是否为低是为了兜住上一种情况“上一次传输卡在从机拉低 SDA”没有这个检查后面所有读都会超时而且看不出原因。i2c_rbyte()的参数 ack 决定最后一个字节回 NACK这是 I2C 规范要求主机在结束前主动 NACK回错了从机会一直占着 SDA。突发读时地址指针自动加一所以只要给起始地址 0x02 和长度 3就能一口气取到电压、功率、电流。校准与换算部分typedef struct { float r_shunt; /* 分流电阻单位 Ω */ float i_lsb; /* 电流刻度单位 A */ uint16_t cal; /* 实际写入的校准值 */ } ina226_cfg_t; /* 返回 0 成功2 表示 CAL 溢出分流压降 5.12mV */ uint8_t ina226_set_cal(ina226_cfg_t *c, float r_shunt, float i_max) { c-r_shunt r_shunt; /* 先按满量程选刻度再向上圆整到 0.1mA 的整数倍读数好算 */ float lsb i_max / 32768.0f; lsb ceilf(lsb * 10000.0f) / 10000.0f; if (lsb 1e-5f) lsb 1e-5f; float cal 0.00512f / (r_shunt * lsb); if (cal 32767.0f) { /* 压降太小必须换电阻或放大刻度 */ lsb 0.00512f / (r_shunt * 32767.0f); cal 32767.0f; } c-i_lsb lsb; c-cal (uint16_t)(cal 0.5f); return ina226_wreg(0x05, c-cal); } /* 把原始码换算成物理量注意 0x04 是有符号的 */ void ina226_convert(const ina226_cfg_t *c, const uint16_t *raw, float *bus_v, float *cur_a, float *pwr_w) { *bus_v (raw[0] 0x7FFF) * 1.25e-3f; /* 0x02 无符号 */ *pwr_w raw[1] * 25.0f * c-i_lsb; /* 0x03 无符号 */ *cur_a (int16_t)raw[2] * c-i_lsb; /* 0x04 有符号必须强转 */ }ina226_set_cal()里的溢出分支不能省当算出的 CAL 超过 32767 时它把 Current_LSB 反向推导成刚好让 CAL 卡在上限的值保证读数“粗但不假”同时还能从返回值看出来量程被压缩了比默默写个截断值要好得多。ina226_convert()里对 0x04 强制转换成int16_t是必须的直接用uint16_t乘负电流会变成一个 6 万多的大正数这种错误在调试时极其隐蔽。关于参数r_shunt用实测值比用标称值好普通厚膜电阻精度 1%直接引入 1% 系统误差i_max要给到真实可能出现的最大值留 20% 余量否则重构或者堵转一下就饱和了。5. 排查与避坑五条让功率曲线飘起来的现场记录5.1 先看模拟前端µV 级信号最怕什么INA226 的分辨率是 2.5 µV这个量级上PCB 上任何一段走线的压降都能算作“信号”。最容易犯的错是直接在分流电阻的两个焊盘上取压因为焊盘本身有面积电流在焊盘内是扩散的取压点位置的微小差异就能带来几十 µV。正确做法是开尔文连接从分流电阻两个端子的内侧单独引出细线走差分对全程不穿过大电流回路。地平面处理同样关键。INA226 的 GND 必须和负载的功率地单点相连不能形成“大电流从芯片地线下面流过”的格局否则几百毫安的电流在几十毫欧的走线上产生的压降会直接叠加到测量结果里。输入端串电阻做 RC 滤波要非常克制。芯片输入端有 µA 级偏置电流串 100 Ω 就会额外产生上百 µV 的压降等于凭空多了几十毫安的电流读数。真要滤电阻控制在 10 Ω 以内电容用 0.1 µF 以内而且要保证 IN 和 IN- 两路的参数完全对称否则共模转差模。分流电阻自身的温漂也不能忽略。普通厚膜电阻的 TCR 在 100 ppm/°C 量级温升 40 °C 就是 0.4% 的误差加上自热2 A 下 0.03 Ω 消耗 0.12 W长期跑下来读数缓慢上升是必然的。要求高的场合用低 TCR 的合金电阻四端子封装更好。5.2 五条踩坑记录现象、原因与解决第一条小电流时读数正负乱跳。现象是空载或轻载时电流在 ±2 mA 之间随机跳动功率同理。原因是输入失调在 µV 量级除以 0.03 Ω 之后被放大成几百 µA再叠加噪声就出现了符号翻转属于物理层的正常现象。解决分两层软件上做零点校准在确定无电流时连续读 64 次取平均把这个偏移存下来之后每次读数减掉硬件上如果小电流段是重点就得换更大的分流电阻并接受压降损失或者改用更高分辨率的方案。指望靠滤波把这部分“滤干净”是不现实的因为它是直流失调不是高频噪声。第二条I2C 读得到 ID但电流一直是 0。现象是 0xFE/0xFF 返回值正确配置也能回读唯独 0x04 和 0x03 恒为零。原因是校准寄存器没写或者写错芯片内部的乘法链路没有系数输出自然是 0另一种情况是 CAL 溢出被截断成一个很小的值读数看起来接近零。解决是写完 0x05 立刻回读比对同时在初始化里加一道断言检查 CAL 是否落在 132767 之间并在每次读数据时判 0x06 的 OVF 位。第三条总线偶发卡死复位才能恢复。现象是跑几个小时之后 I2C 完全没响应SDA 被拉在低电平MCU 复位后正常。原因是某次传输被中断比如中断服务里插了一次 GPIO 操作从机停在输出 ACK 的状态等时钟主机却不发了。解决是给每次传输加超时超时后手动发 9 个 SCL 脉冲把从机的移位寄存器走完再补一个 STOP最后重新初始化同时检查上拉电阻2.2 kΩ 在长排线上偏弱可以降到 1.5 kΩ 试试另外把 I2C 相关操作放进临界区别被中断打断。第四条功率寄存器和“电压 × 电流”对不上。现象是手工用 0x02 乘 0x04 算出来的数和 0x03 差几个百分点反复核对公式也没错。原因是三次读不在同一个转换窗口中间芯片已经刷新过一次数据了。解决是改成从 0x02 起突发读 3 个寄存器保证同源另外确认 0x03 的换算用的是 25 × Current_LSB而不是 25 × 分流 LSB这两个差得很远。还有个小概率情况是 0x03 溢出内部乘积超过 16 位无符号范围此时读到的值会回绕需要靠 OVF 位判断。第五条温度一上来读数就整体偏高。现象是冷机校准好跑十分钟后电流读数缓慢上涨 1%3%。原因是分流电阻温漂加上铜箔走线被算进了采样回路采样点如果落在焊盘外侧那段铜箔的电阻温度系数约 3900 ppm/°C会跟着一起漂。解决是严格开尔文取样、用低 TCR 电阻、把分流电阻的功耗控制在额定值的 30% 以内必要时在固件里加一个一阶温度补偿用板上已有的温度传感器做参考。提示这五条里第一、五条属于模拟前端第二、四条属于换算链路第三条属于数字接口。排查时先确定问题落在哪一层比从头到尾重读一遍手册要快得多。6. 设计取舍为什么是“分流器 专用芯片”而不是 MCU 内部 ADCSTM32F103 自带 12 位 ADC看起来“免费”就能测电流实际做一遍就知道代价在哪。分流电阻上的信号是几十毫伏、共模几十伏的差分信号直接进 ADC 需要先分压再差分放大分压网络引入的误差和温漂会直接吃掉精度F103 的 ADC 参考电压来自 VDDA噪声和精度都在 1% 量级12 位有效位数在噪声下往往只剩 910 位。要达到 INA226 的 16 位、2.5 µV 等效分辨率前端至少要一颗精密运放加若干精密电阻成本未必更低校准工作量却大得多。选 INA226 的核心理由是它把 PGA、Σ-Δ ADC、乘法器和 I2C 全部集成出厂校准过的失调和增益误差都在 µV 级开发者只需要处理一件事选好分流电阻、算对校准值。这是典型的“用集成度换开发时间”。代价也很明确。第一固定满量程 ±81.92 mV 意味着小电流场景要么牺牲压降、要么牺牲分辨率不能像可编程增益那样两头兼顾。第二校准寄存器是整数约束CAL 溢出和小 CAL 的截断误差是绕不过去的设计边界选电阻时必须先把 5.12 mV 这条线画出来。第三它是高边采样共模到 36 V好处是不破坏负载地坏处是对 PCB 布局和共模抑制的要求比低边方案高。如果项目要求隔离测量、或者母线电压远超 36 V那就不是 INA226 的战场得走隔离放大器或霍尔方案精度和成本都要重新权衡。反过来如果是几十伏以内、需要双向、精度要求 1% 以内的场合这颗芯片的性价比很难被替代。验证方法我一般用两步。第一步用电子负载在恒流模式下取两个点比如 10% 和 90% 量程把读数和负载显示值比对算增益和偏置这一步能立刻发现 CAL 算错和分流电阻标称值偏差。第二步用已知阻值的功率电阻做交叉验证电压用万用表读、电流用 I V/R 推和芯片读数对照能区分“电压通道准不准”和“电流通道准不准”。两轮下来问题基本定位得清清楚楚。从那以后我每次画 INA226 的板子都会先把“最大电流 × 分流电阻”算一遍确认压降落在 5.12 mV 到 81.92 mV 之间再动笔画封装和走线固件里则强制保留 CAL 回读比对和 OVF 检查这两个动作哪怕看起来多余。踩过的坑不用记太多把这两条守住功率曲线基本就不会再飘。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?