尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

esp-iot-solution 中的 BQ27220 电量计驱动:从 I2C 接线到 CEDV 参数配置与采样数据采集

esp-iot-solution 中的 BQ27220 电量计驱动:从 I2C 接线到 CEDV 参数配置与采样数据采集 esp-iot-solution 中的 BQ27220 电量计驱动从 I2C 接线到 CEDV 参数配置与采样数据采集【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution本指南以 components/sensors/battery_fuel_gauge/bq27220/README.md 为核心系统讲解 ESP-IDF 生态下 BQ27220 单节锂离子电池电量计Fuel Gauge驱动组件的使用方法包括 I2C 总线初始化、CEDV 电量计参数表与 Gauging 配置位的含义、驱动初始化时自动烧写电池参数的完整流程以及配套sample-data-app工具如何以 CSV 格式采集放电数据、配合 Gauging Parameter Calculator 标定电池模型。读完本文你将能够在 ESP32 等乐鑫芯片上快速接入 BQ27220读取电压、电流、剩余容量、SoC、SoH 等关键指标并为自己的电芯生成一套可用的 CEDV 参数。组件概览BQ27220 能做什么BQ27220 是 TI 出品的单节锂离子电池电量计 IC能够提供精确的电池状态监测包括荷电状态State of ChargeSoC剩余容量Remaining CapacitymAh健康状态State of HealthSoH电压、电流、温度、平均功率、循环次数、预计剩余/充满时间等一系列关键参数在 esp-iot-solution 中该组件通过 I2C 接口与主机控制器通信提供了完整的驱动实现。组件目录结构如下components/sensors/battery_fuel_gauge/bq27220/ ├── bq27220.c / bq27220.h # 驱动核心实现与公共 API ├── priv_include/ │ ├── bq27220_reg.h # 标准命令、Control() 子命令、解锁密钥定义 │ └── bq27220_data_memory.h # 数据存储器Data Memory地址映射表 ├── test_apps/ # Unity 测试工程 └── tools/sample-data-app/ # 实时采样数据采集工具其中 bq27220.h 是唯一需要用户包含的头文件bq27220_reg.h 与 bq27220_data_memory.h 为私有头文件封装了芯片寄存器与数据存储器细节。除基础功能外组件还附带了一个工具 sample-data-app可以实时监测电池状态并以 CSV 格式打印数据供 Gauging Parameter CalculatorGPCCEDV离线生成电芯的 CEDV 参数。快速开始驱动使用示例组件的使用流程非常简洁先创建 I2C 总线再定义 CEDV 参数与 Gauging 配置最后调用bq27220_create()完成设备初始化。下面是在 400 kHz I2C 主模式下的完整示例与 README.md 及 test_apps/main/bq27220_test.c 中的用法一致#define I2C_MASTER_SCL_IO GPIO_NUM_1 /*! gpio number for I2C master clock */ #define I2C_MASTER_SDA_IO GPIO_NUM_2 /*! gpio number for I2C master data */ // Default Gauging Parameter static const parameter_cedv_t default_cedv { .full_charge_cap 650, .design_cap 650, .reserve_cap 0, .near_full 200, .self_discharge_rate 20, .EDV0 3490, .EDV1 3511, .EDV2 3535, .EMF 3670, .C0 115, .R0 968, .T0 4547, .R1 4764, .TC 11, .C1 0, .DOD0 4147, .DOD10 4002, .DOD20 3969, .DOD30 3938, .DOD40 3880, .DOD50 3824, .DOD60 3794, .DOD70 3753, .DOD80 3677, .DOD90 3574, .DOD100 3490, }; // Default Gauging Config static const gauging_config_t default_config { .CCT 1, .CSYNC 0, .EDV_CMP 0, .SC 1, .FIXED_EDV0 0, .FCC_LIM 1, .FC_FOR_VDQ 1, .IGNORE_SD 1, .SME0 0, }; static i2c_bus_handle_t i2c_bus NULL; static bq27220_handle_t bq27220 NULL; i2c_config_t conf { .mode I2C_MODE_MASTER, .sda_io_num I2C_MASTER_SDA_IO, .sda_pullup_en GPIO_PULLUP_ENABLE, .scl_io_num I2C_MASTER_SCL_IO, .scl_pullup_en GPIO_PULLUP_ENABLE, .master.clk_speed 400 * 1000, }; i2c_bus i2c_bus_create(I2C_NUM_0, conf); bq27220_config_t bq27220_cfg { .i2c_bus i2c_bus, .cfg default_config, .cedv default_cedv, }; bq27220 bq27220_create(bq27220_cfg);几点关键说明I2C 地址驱动在 bq27220.c 中固定使用设备地址0x55总线创建后无需额外指定。总线依赖组件依赖espressif/i2c_bus版本1.4.*因此必须先用i2c_bus_create()创建总线句柄再传入驱动详见 idf_component.yml。硬件接线I2C 的 SCL/SDA 需配置上拉GPIO_PULLUP_ENABLE示例默认使用 GPIO1SCL与 GPIO2SDA可按实际板卡修改宏定义。深入理解 CEDV 参数表parameter_cedv_t定义于 bq27220.h是 CEDVCompensated End-of-Discharge-Voltage补偿型放电终止电压参数集这些值会被写入芯片 RAM用于针对特定电芯化学特性配置电量计。各字段含义如下字段含义full_charge_cap已学习的满充容量mAh即实际可用容量design_cap设计容量mAhreserve_cap保留容量mAhnear_full接近充满阈值mAhself_discharge_rate自放电率索引0~255自放电百分比/天 值 × 0.0025%EDV00% SoC 时的放电终止电压mVEDV13% SoC 时的放电终止电压mVEDV2电池低电量百分比对应的放电终止电压mVEMF无负载电芯电压高于计算出的最高电芯 EDV 阈值C0无负载、容量相关的 EDV 调整因子R0一阶倍率依赖因子用于补偿电池阻抗T0电池阻抗随温度变化的调整量R1电池阻抗随容量变化的调整量TC冷态T 23°C阻抗变化的调整量C1EDV0 处期望保留的电池容量DOD0 ~ DOD100放电深度Depth-of-Discharge0%~100% 对应的电压表mV从源码结构看这份示例参数对应一颗 650 mAh 的电芯design_cap 650DOD 电压表从满电的 4147 mV 平滑下降到放空的 3490 mV与 EDV0 一致。实际项目中的电芯参数应通过 TI 的 Gauging Parameter Calculator 工具见下文生成不要直接套用示例值。Gauging Config 配置位gauging_config_tbq27220.h是一个 16 位位域联合体对应数据存储器中 Gauging Configuration 寄存器地址0x929B见 bq27220_data_memory.h。各位的语义位含义CCT0 使用 DesignCapacity() 的百分比计算 CC默认1 使用 FullChargeCapacity() 的百分比CSYNC在有效充电终止时将 RemainingCapacity() 与 FullChargeCapacity() 同步EDV_CMPEDV 补偿使能SC平滑引擎Smoothing Engine使能FIXED_EDV0固定 EDV0 使能FCC_LIM满充容量限制FC_FOR_VDQ使用满充电压用于 VDQIGNORE_SD忽略自放电SME0平滑引擎模式选择默认配置中启用了CCT基于满充容量计算、SC平滑、FCC_LIM、FC_FOR_VDQ和IGNORE_SD适合大多数消费类应用。驱动初始化流程bq27220_create 内部做了什么bq27220_create()bq27220.c并非简单的句柄分配而是一次完整的设备验证与电池参数编程流程参数校验检查config、i2c_bus、cedv、cfg均非空分配驱动数据结构并在 I2C 总线上创建0x55地址的设备句柄。设备识别通过Control()子命令CONTROL_DEVICE_NUMBER0x0001请求设备号再从 MAC scratch 空间0x40读回必须等于BQ27220_DEVICE_ID0x0220否则初始化失败——这是防止 I2C 接错器件的关键保护。版本读取读取固件版本CONTROL_FW_VERSION与硬件版本CONTROL_HW_VERSION并打印日志例如启动日志中的Firmware Version 2002/Hardware Version 0004。解除密封调用bq27220_unseal()通过两个解锁密钥UNSEALKEY1 0x0414、UNSEALKEY2 0x3672bq27220_reg.h进入未密封状态以访问配置数据。参数比对与烧写先读取芯片当前的设计容量、EMF、T0、DOD20 与传入 CEDV 参数比对若完全一致则跳过烧写并打印Skip battery profile update。否则进入 Config Update 模式CONTROL_ENTER_CFG_UPDATE0x0090通过Select Subclass0x3EMAC Data0x40MAC Data Sum0x60逐项写入 Gauging Configuration、满充容量、设计容量、近满阈值、自放电率、保留容量、EDV0/1/2、EMF、C0/R0/T0/R1、TC/C1 以及 DOD0~DOD100 电压表随后用CONTROL_EXIT_CFG_UPDATE_REINIT0x0091退出并复位。校验与密封回读设计容量确认写入成功日志Battery profile update success最后执行bq27220_seal()防止配置数据被意外篡改。整个流程涉及数据存储器写操作的校验和机制bq27220_set_parameter_u16()会先发送 [地址低字节、地址高字节、值高字节、值低字节] 四个字节再发送对这四个字节求反的校验和以及固定长度 6见 bq27220.c。值得注意bq27220_create()内部会把TC与C1打包进同一个 16 位字(TC 8) | C1写入0x92B1对应数据存储器中 TC0x92B1与 C10x92B2相邻的布局。公共 API 一览读取电池关键指标bq27220.h 提供了丰富的只读查询接口全部通过标准命令Standard Commands直接读取底层实现见 bq27220.cAPI返回内容bq27220_get_voltage()电池电压mVbq27220_get_current()瞬时电流mA充电为正、放电为负bq27220_get_avgcurrent()平均电流mAbq27220_get_temperature()温度0.1°K转换为摄氏度需/10 - 273bq27220_get_remaining_capacity()剩余容量mAhbq27220_get_full_charge_capacity()补偿后的满充容量mAhbq27220_get_design_capacity()设计容量mAhbq27220_get_state_of_charge()荷电状态 SoC0~100%bq27220_get_state_of_health()健康状态 SoH0~100%满充容量/设计容量之比bq27220_get_cycle_count()充放电循环次数bq27220_get_charge_voltage()/bq27220_get_charge_current()充电电压mV/ 充电电流mAbq27220_get_average_power()平均功率mW充电为正、放电为负bq27220_get_time_to_empty()/bq27220_get_time_to_full()预计放空/充满时间分钟bq27220_get_maxload_current()/bq27220_get_standby_current()最大负载电流 / 待机电流mAbq27220_get_battery_status()电池状态位域充放电状态、FC/FD、OCV 标志等bq27220_get_operation_status()运行状态位域SEC 安全等级、CFGUPDATE、INITCOMP 等bq27220_get_fw_version()/bq27220_get_hw_version()固件/硬件版本bq27220_seal()/bq27220_unseal()密封/解除密封配置访问bq27220_set_parameter_u16()/bq27220_get_parameter_u16()按数据存储器地址读写 16 位参数bq27220_delete()释放句柄并删除 I2C 设备其中battery_status_t与operation_status_t均为位域联合体便于直接读取如DSG放电中、FC已满充、FD已满放、SEC当前安全访问等级等状态位两结构体均通过ESP_STATIC_ASSERT强制占用 2 字节以匹配寄存器宽度。sample-data-app为 GPCCEDV 采集标定数据BQ27220 的电量计精度高度依赖 CEDV 参数与真实电芯的匹配度。组件自带的 sample-data-app 工具就是为此设计的它从 BQ27220 读取数据以 CSV 格式在控制台打印放电过程数据供 TI 的 Gauging Parameter CalculatorGPCCEDV工具使用从而生成该电芯专属的 CEDV 参数。菜单配置工具参数全部通过 menuconfig 配置定义于 Kconfig.projbuild配置项默认值说明CONFIG_I2C_SCL_IO1I2C SCL 引脚CONFIG_I2C_SDA_IO2I2C SDA 引脚CONFIG_DISCHARGE_ENABLE_IO4放电使能 GPIO低电平先关闭放电初始化文件系统后再拉高开始放电CONFIG_END_DISCHAGE_VOLTAGE3300结束放电电压mV即采样记录停止的阈值默认结束放电电压为 3.3V可通过 menuconfig 修改。采集逻辑main.c 的流程是初始化 I2C 总线与 BQ27220使用与上文相同的默认 CEDV 参数与 Gauging 配置将放电使能 IO 配置为输出并拉低挂载 SPIFLASH 上的 FAT 文件系统/log分区拉高放电使能 IO 开始放电随后以 2 秒间隔调用bq27220_get_voltage()、bq27220_get_current()、bq27220_get_temperature()采集数据温度从 0.1°K 转换为摄氏度当电压低于结束放电电压默认 3300 mV时停止记录关闭放电并卸载文件系统。输出格式CSV 输出由printf直接打印到控制台表头与数据格式如下节选自 tools/sample-data-app/READMEI (311) bq27220_sample: Hello BQ27220 Battery Fuel Gauge! I (316) bq27220_sample: Discharge enable IO: 4 I (321) bq27220_sample: I2C master SCL IO: 1 I (325) bq27220_sample: I2C master SDA IO: 2 I (329) i2c_bus: i2c0 bus inited I (331) i2c_bus: I2C Bus V2 Config Succeed, Version: 1.1.0 I (370) bq27220: Firmware Version 2002 I (386) bq27220: Hardware Version 0004 I (452) bq27220: Design Capacity: 650, EMF: 3670, T0: 4547, DOD20: 3969 I (452) bq27220: Skip battery profile update I (453) bq27220_sample: End discharge voltage: 3300 -------- Start record -------- ElapsedTime, Voltage, Current, Temperature 0, 4078, -33, 27.8 2, 4077, -32, 27.7 4, 4077, -32, 27.7 6, 4077, -32, 27.8 8, 4077, -32, 27.7 10, 4077, -32, 27.7 12, 4077, -32, 27.7 14, 4077, -32, 27.8 16, 4076, -32, 27.8 18, 4077, -32, 27.8 20, 4076, -32, 27.7 22, 4076, -32, 27.8 24, 4076, -32, 27.8 26, 4076, -32, 27.7 ......采集完成后把完整的 CSV 数据交给 GPCCEDV 工具即可得到针对当前电芯的 CEDV 参数再回填到parameter_cedv_t结构中即可完成一次电芯标定闭环。工具的 CMake 通过EXTRA_COMPONENT_DIRS ../../../bq27220直接复用组件源码CMakeLists.txt并使用 partitions.csv 划分出日志分区。测试与验证组件提供了基于 Unity 的测试工程 test_apps其中 bq27220_test.c 覆盖了两类用例基础信息查询测试bq27220 basic information query test完成创建→读取电池状态、电压、电流、剩余/满充容量、温度、循环次数、SoC、平均功率、最大负载、预计时间等全量信息→删除的完整链路内存泄漏检测setUp/tearDown中通过heap_caps_get_free_size()对比 8-bit 与 32-bit 堆空闲量阈值首次为 -110 字节、之后为 0确保 create/delete 循环无内存泄漏。该测试同时验证了驱动的 I2C 时序、命令交互与资源回收正确性可作为自己项目接入时的参考模板。工程集成要点组件依赖idf_component.ymlespressif/i2c_bus 1.4.*public 依赖、cmake_utilities 0.*并要求 IDF4.4。若在组件管理器Component Manager下使用bq27220会自动拉取这些依赖。构建配置CMakeLists.txt仅需driver组件作为编译依赖priv_include目录不对外暴露。版本信息当前版本 v0.1.12025-09-22修复了 i2c_bus 依赖改为 public 导致的编译错误v0.1.02025-08-12为初始版本提供 BQ27220 基本功能详见 CHANGELOG.md。许可驱动源码以 Apache-2.0 / CC0-1.0 双许可形式发布详见各文件 SPDX 头与 license.txt。小结esp-iot-solution 的 BQ27220 组件以一次 create、自动完成设备识别—解锁—参数烧写—密封的设计把电量计接入的门槛降到了最低上层只需定义好 CEDV 参数与 Gauging 配置之后即可通过一组bq27220_get_*接口轮询电池状态。配合sample-data-app工具与 GPCCEDV 的标定流程开发者可以从零为任意一款单节锂电建立精确的电量模型。建议在正式产品中使用 GPCCEDV 基于实际电芯生成 CEDV 参数替换示例中的默认值按产品功耗与安全要求通过 menuconfig 调整结束放电电压等采样参数参考 test_apps 中的读取与泄漏检查模式把电池信息上报纳入自己的业务循环。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表