ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ESP IoT Solution 电源监控实践:基于 INA236 的 16 位电流、电压与功率监测组件详解

ESP IoT Solution 电源监控实践:基于 INA236 的 16 位电流、电压与功率监测组件详解 ESP IoT Solution 电源监控实践基于 INA236 的 16 位电流、电压与功率监测组件详解【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution本指南聚焦乐鑫 ESP IoT Solution 仓库中的电源监控Power Monitor解决方案围绕 TI INA236 这颗 16 位 I2C 接口电流、电压与功率监控 IC 展开。文章将完整讲解该组件的硬件接入方式、驱动 API、寄存器级实现原理与测试用例帮助开发者在 ESP32 系列平台上快速完成对电源轨的实时电压、电流与功率监测。Power Monitor IC 是什么为什么需要它Power Monitor IC电源监控集成电路是一类专门用于监测和管理电源的芯片。它能够在实时运行中连续采集电源系统的多项关键参数——例如电压Voltage、电流Current和功率Power并把结果提供给系统使用。借助这类芯片设备可以在运行时精准掌握自身功耗状态从而支撑功耗优化、过压/过流告警、电池管理、能效统计等功能。从应用领域来看电源监控 IC 广泛出现在计算机、电源管理系统、消费电子、工业控制系统和通信设备中。无论是服务器电源轨的电压检测还是便携设备待机电流的评估电源监控 IC 都是关键的感知单元。在 ESP IoT Solution 仓库中power_monitor组件以硬件抽象层的形式封装了一款典型的电源监控 IC —— TI 的 INA236让开发者可以直接调用统一 API 完成传感器应用开发而无需关心底层 I2C 寄存器细节。适配产品一览power_monitor组件当前适配的电源监控 IC 如下表所示摘自 docs/en/sensors/power_monitor.rst名称功能总线厂商HALINA23616 位电流、电压和功率监控 ICI2CTI支持16 位分辨率INA236 是一款 16 位数字电流监控器通过外部采样电阻sense resistor两端的压降推算电流并同步报告电流、总线电压bus voltage与功率。宽总线电压兼容器件兼容 1.2 V、1.8 V、3.3 V、5.0 V 等多种数字总线电压非常适合接入不同电平的嵌入式系统。I2C 接口通过标准 I2C 总线与 MCU 通信默认器件地址为0x41定义见 ina236.h 中的INA236_I2C_ADDRESS_DEFAULT。说明该组件在仓库中以power_monitor名称管理实际源码位于 components/sensors/power_monitor/ina236/ 目录。组件版本为 0.1.2要求 IDF 版本 4.4.2并依赖本仓库的i2c_bus组件见 idf_component.yml。硬件接入I2C 引脚与采样电阻INA236 与主控之间只需 I2C 两根信号线。以组件自带测试程序ina236_test.c和 READMEREADME.md中的默认接线为例主设备ESP32GPIO21 —— I2C 数据信号 SDAGPIO13 —— I2C 时钟信号 SCL。接线方式传感器 SDA 接 GPIO21传感器 SCL 接 GPIO13无需外接上拉电阻驱动会启用内部上拉sda_pullup_en/scl_pullup_en均配置为GPIO_PULLUP_ENABLE。电路层面INA236 测量的是外部采样电阻两端的电压shunt voltage从而换算出流经采样电阻的电流电流与总线电压相乘即得到功率。因此采样电阻的阻值选择会直接影响电流量程与分辨率实际选型时需结合负载电流范围参考器件数据手册进行设计。软件架构与文件布局power_monitor组件的目录结构与职责如下components/sensors/power_monitor/ina236/ ├── include/ │ └── ina236.h # 对外 API 头文件 ├── priv_include/ │ └── ina_236_reg.h # 内部寄存器地址与位域定义 ├── ina236.c # 驱动核心实现 ├── test_apps/ # 基于 Unity 的测试工程 ├── CHANGELOG.md # 版本变更记录 ├── CMakeLists.txt # 组件构建脚本 ├── idf_component.yml # 组件清单与依赖声明 └── README.md # 组件使用说明从 CMakeLists.txt 可以看到组件仅编译ina236.c一个源文件公开头文件位于include/私有寄存器定义放在priv_include/并以REQUIRES i2c_bus声明了对 I2C 总线抽象组件的依赖。这种驱动只依赖 I2C 总线句柄的设计让 INA236 可以挂接到仓库中统一的 i2c_bus 组件之上与仓库内其他 I2C 传感器保持一致的编程模型。API 参考面向应用的硬件抽象层组件提供的硬件抽象 API 定义于 ina236.h开发者可以直接调用这一层代码编写传感器应用。核心接口如下typedef struct ina236_t *ina236_handle_t; // INA236 设备句柄 typedef void (*int236_alert_cb_t)(void *arg); // 告警回调函数类型 typedef struct { i2c_bus_handle_t bus; /*! I2C 总线对象 */ bool alert_en; /*! 是否使能告警回调 */ uint8_t dev_addr; /*! I2C 器件地址 */ uint8_t alert_pin; /*! 告警引脚号 */ int236_alert_cb_t alert_cb; /*! 告警回调函数 */ } ina236_config_t; esp_err_t ina236_create(ina236_handle_t *handle, ina236_config_t *config); // 创建并初始化对象 esp_err_t ina236_delete(ina236_handle_t handle); // 反初始化并释放内存 esp_err_t ina236_get_voltage(ina236_handle_t handle, float *volt); // 读取总线电压单位 V esp_err_t ina236_get_current(ina236_handle_t handle, float *curr); // 读取电流单位 A esp_err_t ina236_clear_mask(ina236_handle_t handle); // 清除告警引脚掩码关键设计点句柄模式ina236_create通过出参返回句柄所有后续操作都以句柄为参数内部对象在创建时一次性calloc分配见 ina236.cina236_delete负责释放避免句柄泄漏。告警可选alert_en控制是否启用告警引脚中断。使能后驱动会在alert_pin上配置下降沿中断GPIO_INTR_NEGEDGE注册 ISR 服务并挂载回调函数未使能时alert_pin传-1、alert_cb传NULL即可见 ina236.c。参数校验ina236_create对句柄指针与配置指针做了ESP_RETURN_ON_FALSE空指针检查内存分配失败返回ESP_ERR_NO_MEM见 ina236.c。完整使用示例三步读取电压与电流以组件 README 中的示例为骨架README.md完整的接入流程分三步第一步初始化 I2C 总线ina236_handle_t ina236 NULL; i2c_bus_handle_t i2c_bus NULL; i2c_config_t conf { .mode I2C_MODE_MASTER, .sda_io_num I2C_MASTER_SDA_IO, // 例如 GPIO21 .sda_pullup_en GPIO_PULLUP_ENABLE, // 使用内部上拉 .scl_io_num I2C_MASTER_SCL_IO, // 例如 GPIO13 .scl_pullup_en GPIO_PULLUP_ENABLE, .master.clk_speed I2C_MASTER_FREQ_HZ, // 例如 100000 (100 kHz) }; i2c_bus i2c_bus_create(I2C_MASTER_NUM, conf);第二步创建 INA236 设备ina236_config_t ina236_cfg { .bus i2c_bus, .dev_addr INA236_I2C_ADDRESS_DEFAULT, // 0x41 .alert_en false, .alert_pin -1, .alert_cb NULL, }; esp_err_t err ina236_create(ina236, ina236_cfg);第三步周期性读取电压与电流float voltage 0; float current 0; ina236_get_voltage(ina236, voltage); // 单位 V ina236_get_current(ina236, current); // 单位 Aina236_create成功返回ESP_OK后设备即已完成寄存器初始化可以立刻读取数据。使用结束后调用ina236_delete(ina236)释放资源。源码级原理寄存器映射与数据换算深入 ina_236_reg.h 可以看到 INA236 的寄存器布局与驱动初始化细节。寄存器地址映射enum ina236_reg_addr { INA236_REG_CFG 0x00, // 配置寄存器 INA236_REG_VSHUNT 0x01, // 分流采样电阻电压 INA236_REG_VBUS 0x02, // 总线电压 INA236_REG_POWER 0x03, // 功率 INA236_REG_CURRENT 0x04, // 电流 INA236_REG_CALIBRATION 0x05, // 校准寄存器 INA236_REG_MASK 0x06, // 告警掩码寄存器 INA236_REG_ALERT_LIM 0x07, // 告警阈值 INA236_REG_MAF_ID 0x3E, // 厂商 ID INA236_REG_DEVID 0x3F, // 器件 ID };初始化流程ina236_reg_initina236.c 中的初始化逻辑包含三步关键操作器件 ID 校验读取INA236_REG_DEVID与INA236_DEVICE_ID (0xA080)比对匹配则打印 Check ina236 id OK 日志用于确认总线上挂载的是正确的 INA236。校准寄存器写入向INA236_REG_CALIBRATION写入校准值当前实现写固定值 10该校准值决定电流与功率换算的增益。配置寄存器写入向INA236_REG_CFG写入位域组合adcrange 0ADC 量程配置avg 0采样平均次数为 1mode 0x07连续分流电压与总线电压采样模式见 ina_236_reg.h 注释 111 - Continuous shunt and bus voltagevbusct 0x02与vshct 0x02总线电压/分流电压转换时间配置。掩码寄存器写入将mask.bit.cnvr 1即使能转换完成Conversion Ready告警位。数据换算公式驱动读取原始寄存器值后在 ina236.c 中完成单位换算电压读取INA236_REG_VBUS按公式voltage vbus_raw * 0.0016换算为伏特V电流读取INA236_REG_VSHUNT按公式current (int16_t)vshunt_raw / 3970.0换算为安培A。其中电流换算把原始 16 位值先转换为有符号数(int16_t)这是 v0.1.1 版本修复负电流未正确处理问题的关键所在见 CHANGELOG.md。换算系数0.0016 与 3970.0与采样电阻阻值、校准值强相关若实际硬件更换采样电阻或需要更高精度应结合器件数据手册重新推导并调整换算参数。I2C 读写底层寄存器读写最终落到i2c_bus组件的两个接口上见 ina236.cstatic esp_err_t ina236_read_reg(ina236_t *ina236, uint8_t reg, uint16_t *data); static esp_err_t ina236_write_reg(ina236_t *ina236, uint8_t reg, uint16_t *data);读操作i2c_bus_read_bytes(dev, reg, 2, buf)连续读取 2 字节并组装为大端序(buf[0] 8 | buf[1])写操作i2c_bus_write_bytes(dev, reg, 2, data)完成寄存器写入。设备句柄在ina236_create中通过i2c_bus_device_create(config-bus, addr, i2c_bus_get_current_clk_speed(config-bus))创建ina236.c时钟频率直接沿用 I2C 总线当前配置无需单独设置。测试用例验证组件自带基于 Unity 框架的测试工程ina236_test.c覆盖了驱动的完整生命周期初始化/反初始化测试ina236_test_init/ina236_test_deinit创建 I2C 总线与 INA236 设备测试结束后调用ina236_delete与i2c_bus_delete释放资源数据读取测试ina236_test_get_data循环两次调用ina236_get_voltage与ina236_get_current以 1 秒间隔打印Voltage: x.xx V, Current: x.xx mA内存泄漏检测setUp/tearDown在测试前后统计MALLOC_CAP_8BIT与MALLOC_CAP_32BIT堆空闲内存若释放后内存回退超过阈值-460 字节则判定存在泄漏。测试通过TEST_CASE(ina236_driver, [ina236_driver])注册app_main进入 Unity 菜单驱动执行。该测试工程还配套了 sdkconfig.defaults 与独立的CMakeLists.txt可直接作为标准 ESP-IDF 测试应用编译运行。注意事项组件迁移说明根据 README.md 与 CHANGELOG.md 的说明从版本 0.1.2 起power_monitor组件已迁移至仓库中的power_measure组件之后不再单独维护。因此在新的产品设计中建议优先使用 power_measure 组件获取电源监控能力而正在使用power_monitor0.1.2 及更早版本的项目仍可正常沿用本文所述 API 与用法。若自行以组件方式引入本仓库的ina236可通过idf_component.yml声明i2c_bus依赖version: *override_path: ../../../i2c_bus来满足构建要求。小结power_monitor组件以简洁的硬件抽象为 ESP32 系列芯片接入 TI INA236 提供了完整的驱动支持统一句柄 API、可选的告警中断、寄存器级初始化与数据换算一应俱全配合仓库的i2c_bus组件与 Unity 测试框架可以在短时间内完成电源监控功能的评估与量产集成。对电压、电流与功率的实时感知正是设备功耗管理与系统健康监测的第一步。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进