
BQ27220 电量计接入 ESP32从接线到 CEDV 标定一次跑通【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solutionesp-iot-solution 的 bq27220 组件位于 components/sensors/battery_fuel_gauge/bq27220让你的 ESP32 通过两根 I2C 线读出一颗单节锂电的电压、电流、SoC、SoH、循环次数与剩余时间本文覆盖接线与最小示例、CEDV 参数含义、Gauging 配置位、create 内部烧写流程、只读 API、CSV 采集与 GPCCEDV 标定闭环、测试验收与构建依赖。读完你能做到三件事把 BQ27220 挂上总线并成功读出 SoC解释 create 日志里每一行的来龙去脉换一颗电芯后让读数重新可信。三个翻车现场先自查动手前先看三个最常见的现场和它们的出处现场根因去哪里查bq27220_create()返回 NULL设备号校验失败读回的 Device Number 不等于 0x0220接线/地址/上拉有问题bq27220.c 第 445–446 行的CONTROL_DEVICE_NUMBER检查日志打印Skip battery profile update但你刚换了电芯参数芯片里存的 profile 恰好与传入 CEDV 全字段一致烧写被跳过bq27220.c 第 455–459 行的bq27220_verify_profile()提前短路SoC 跳变、和万用表电压对不上示例 CEDV 是 650 mAh 电芯的默认值没做过 GPCCEDV 标定用 sample-data-app 采一份 CSV 再重算参数目录结构先认识一下后文引用都以它为准components/sensors/battery_fuel_gauge/bq27220/ ├── bq27220.c / bq27220.h # 驱动实现与公共 API ├── bq27220_data_memory.c # 数据存储器地址映射表 ├── priv_include/ │ ├── bq27220_reg.h # Standard Commands 与 Control() 子命令 │ └── bq27220_data_memory.h # Data Memory 字段枚举 ├── test_apps/ # Unity 测试工程 └── tools/sample-data-app/ # CSV 放电数据采集工程I2C 怎么接线最小示例怎么写驱动写死设备地址 0x55bq27220.c 第 20 行BQ27220_I2C_ADDRESS你不用也不该传地址参数但 SCL/SDA 必须带上拉。下面是与仓库 test_apps 用法一致的最小可运行示例// 与仓库 test_apps 用法一致SCLGPIO1, SDAGPIO2, 400 kHz i2c_config_t conf { .mode I2C_MODE_MASTER, .sda_io_num GPIO_NUM_2, .sda_pullup_en GPIO_PULLUP_ENABLE, .scl_io_num GPIO_NUM_1, .scl_pullup_en GPIO_PULLUP_ENABLE, .master.clk_speed 400 * 1000, }; i2c_bus_handle_t i2c_bus i2c_bus_create(I2C_NUM_0, conf); // 默认 CEDV650 mAh 电芯EDV03490 mVDOD 表 4147→3490 mV 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, }; // 默认 Gauging 配置 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, }; bq27220_config_t cfg { .i2c_bus i2c_bus, .cfg default_config, .cedv default_cedv }; bq27220_handle_t bq bq27220_create(cfg); if (bq NULL) { /* 通信失败或 profile 校验失败见上文排障表 */ }总线必须先用i2c_bus_create()建好再传入因为 idf_component.yml 声明espressif/i2c_bus: ^1.4是 public 依赖头文件 bq27220.h 直接包含了i2c_bus.h。成功时日志依次出现Firmware Version、Hardware Version和 profile 校验结果。CEDV 参数表怎么读配置位怎么定SoC 准不准主要取决于 CEDV 与电芯化学特性是否匹配。parameter_cedv_tbq27220.h 第 84–113 行会被整体写进芯片 Data Memory 的 CEDV Profile 1 区0x929B 起。人话版容量四件套告诉芯片这颗粒子有多大、何时算满、留多少底EDV/EMF 系告诉它放电放到哪个电压算没电C0/R0/T0/R1/TC/C1 一组系数用来按容量、倍率、温度补偿内阻DOD0~DOD100 则是电压-放电深度对照表。字段含义单位/地址示例值full_charge_cap学习到的满充容量mAh / 0x929D650design_cap设计容量mAh / 0x929F650reserve_cap保留容量mAh0near_full近满阈值mAh200self_discharge_rate自放电率索引%/天 值 × 0.0025%0~25520EDV00% SoC 放电终止电压mV / 0x92B43490EDV13% SoC 放电终止电压mV / 0x92B73511EDV2低电量百分比对应终止电压mV / 0x92BA3535EMF高于最高 EDV 阈值的无负载电压mV / 0x92A73670C0无负载、容量相关 EDV 调整因子— / 0x92A9115R0一阶倍率依赖因子阻抗— / 0x92AB968T0阻抗随温度变化调整量— / 0x92AD4547R1阻抗随容量变化调整量— / 0x92AF4764TC/C1冷态T23°C阻抗调整 / EDV0 处保留容量各 1 字节打包写 0x92B111 / 0DOD0~DOD100放电深度 0~100% 对应电压表mV / 0x92BD 起4147→3490Gauging Configuration 是 16 位位域联合体gauging_config_tbq27220.h 第 59–78 行落在 0x929B低字节低位起、高字节低位起。人话版CCT 决定百分比按哪块容量算SC 开平滑引擎避免读数抖FCC_LIM 与 FC_FOR_VDQ 约束满充学习行为IGNORE_SD 忽略自放电位名含义默认值位置CCT0按 DesignCapacity 计 CC 百分比1按 FullChargeCapacity 计1低字节 bit2CSYNC有效充电终止时把 RemainingCapacity 与 FCC 同步0低字节 bit1EDV_CMPEDV 补偿使能0低字节 bit4SC平滑引擎使能1低字节 bit5FIXED_EDV0固定 EDV0 使能0低字节 bit6FCC_LIM满充容量限制1高字节 bit0FC_FOR_VDQ使用满充电压判断 VDQ1高字节 bit2IGNORE_SD忽略自放电1高字节 bit3SME0平滑引擎模式选择0高字节 bit4bq27220_create() 初始化内部流程bq27220_create()bq27220.c 第 429–486 行不是分配个句柄就完事而是一整条验证—解锁—烧写—密封流水线参数校验 建设备四个指针判空i2c_bus_device_create()挂 0x55 地址第 431–443 行。识别设备Control()写CONTROL_DEVICE_NUMBER0x0001延迟 15 ms 后从MAC Data0x40读回必须等于 0x0220否则直接 NULL第 445–446 行。读版本CONTROL_FW_VERSION/CONTROL_HW_VERSION并打印第 448–451 行。解除密封bq27220_unseal()依次发UNSEALKEY10x0414、UNSEALKEY20x3672回读 Operation Status 确认 SEC 变为 UNSEALEDbq27220_reg.h 第 75–76 行bq27220.c 第 202–219 行。profile 比对分 3 块回读 Data Memory0x9298 起 7 字节、0x929B 起 31 字节、0x92BA 起 25 字节见s_profile_read_blocks26 个字段逐一比对全一致则打印Skip battery profile update密封后直接返回第 455–460 行。进入 Config Update先FULLACCESSKEY0xFFFF两次进 Full Access 并确认 SECFULL再写CONTROL_ENTER_CFG_UPDATE0x0090等 1100 ms 后以 20 ms 间隔轮询 CFGUPDATE 位置位最多 100 次第 463–466 行。分块写 profile26 个字段 staging 进 8 个地址块s_profile_write_blocks逐块先写Select Subclass0x3E 地址 数据再写MAC Data Sum0x60提交校验和与长度块间隔 10 msbq27220_write_dm_block()第 124–140 行。立即回读校验带满充容量在内的 26 字段全量比对第 468 行不一致报ESP_ERR_INVALID_STATE。退出并复位CONTROL_EXIT_CFG_UPDATE_REINIT0x0091等 2000 ms轮询 CFGUPDATE 位清零第 469–471 行。密封发CONTROL_SEALED0x0030等CONFIG_BQ27220_SEAL_SETTLE_MSKconfig 默认 2000 ms再确认 SEC 回到 SEALED第 472 行、Kconfig 第 3–8 行。任何一步失败都会走exit_cfg_update/err标签尽力退出 Config Update删除 I2C 设备、free 句柄并返回 NULL。三个容易踩的坑先记住电流类接口get_current、get_avgcurrent、get_average_power、get_maxload_current返回int16_t约定充电为正、放电为负其余读数是uint16_t。bq27220_get_temperature()单位是 0.1°K换算摄氏度是值 / 10 - 273test_apps/main/bq27220_test.c 第 192 行同款写法别当成 0.1°C。bq27220_set_parameter_u16()的文档注释写得很直白调用者自己负责进入 FULL ACCESS、确认 CFGUPDATE、回读验证、退出并恢复密封等级这个函数只管写提交一步。数据怎么读公共只读 API 一览所有指标都走 Standard Commands 两字节读priv_include/bq27220_reg.h 第 8–44 行底层统一是bq27220_read_u16()接口返回单位/约定bq27220_get_voltage()电池电压mVbq27220_get_current()瞬时电流mA充电为正bq27220_get_avgcurrent()平均电流mA充电为正bq27220_get_temperature()温度0.1°Kbq27220_get_state_of_charge()SoC0~100%bq27220_get_state_of_health()SoHFCC/设计容量之比0~100%bq27220_get_remaining_capacity()剩余容量mAhbq27220_get_full_charge_capacity()补偿后满充容量mAhbq27220_get_design_capacity()设计容量mAhbq27220_get_cycle_count()充放电循环次数次bq27220_get_average_power()平均功率mW充电为正bq27220_get_time_to_empty()/bq27220_get_time_to_full()预计放空/充满时间分钟bq27220_get_charge_voltage()/bq27220_get_charge_current()充电电压/电流mV / mAbq27220_get_maxload_current()/bq27220_get_standby_current()最大负载/待机电流mAbq27220_get_battery_status()16 位位域DSG、FC、FD、SLEEP 等传指针输出bq27220_get_operation_status()16 位位域SEC、CFGUPDATE、INITCOMP 等传指针输出bq27220_get_fw_version()/bq27220_get_hw_version()固件/硬件版本Control() 子命令bq27220_seal()/bq27220_unseal()密封/解除密封配置访问esp_err_tbq27220_set_parameter_u16()/bq27220_get_parameter_u16()按 Data Memory 地址读写 16 位参数地址见映射表bq27220_delete()删除 I2C 设备并释放句柄esp_err_tbattery_status_t与operation_status_t都由ESP_STATIC_ASSERT强制占 2 字节直接对应寄存器宽度判断充电中看DSG位满了看FC放空了看FD最省事。CSV 放电数据怎么采GPCCEDV 怎么闭环换电芯后让 SoC 重新可信靠仓库自带的 tools/sample-data-app。参数全部在 main/Kconfig.projbuild 里CONFIG_I2C_SCL_IO默认 1、CONFIG_I2C_SDA_IO默认 2、CONFIG_DISCHARGE_ENABLE_IO默认 4、CONFIG_END_DISCHAGE_VOLTAGE默认 3300 mV。main.c 的执行顺序建 I2C 总线并用默认 CEDV 调bq27220_create()放电使能 IO 配成输出并先拉低把 SPIFLASH 上 500K 的log分区partitions.csv 里的 FAT 区挂载到/log拉高放电使能 IO 开始放电进入循环每 2 秒读一次电压、电流、温度温度换算成摄氏度后按ElapsedTime, Voltage, Current, Temperature四列 printf 到串口电压跌破CONFIG_END_DISCHAGE_VOLTAGE默认 3300 mV后停笔、关放电、卸载文件系统。采集到的 CSV 交给 TI 的 GPCCEDVGauging Parameter Calculator算出这颗电芯专属的 CEDV回填到parameter_cedv_t下一次启动 create 时日志会打印Start updating battery profile并重烧SoC 曲线从此对得上你的电芯。工程 CMake 用EXTRA_COMPONENT_DIRS ../../../bq27220直接复用组件源码无需改动驱动。测试怎么验收依赖/构建/版本/许可test_apps 是 Unity 工程两条用例值得照抄bq27220 basic information query testcreate → 全量读状态位域、电压、电流、功率、剩余/满充容量、温度、循环次数、SoC、Time to empty/full→ delete验证命令链路200 次esp_restart()回归[manual]标签首次允许触发恰好一次 profile 更新之后每次重启必须打印 Skip、零更新验证密封后 Data Memory 跨重启保持setUp/tearDown用heap_caps_get_free_size()对比 8-bit 与 32-bit 堆空闲量阈值首轮 -110 字节、之后 0盯 create/delete 循环的内存泄漏。工程集成要点依赖idf_component.ymlespressif/i2c_bus ^1.4public、cmake_utilities 0.*、idf 4.4组件 version 0.1.2构建CMakeLists.txtSRCS 为bq27220.c与bq27220_data_memory.cREQUIRES driverpriv_include私有不对外版本CHANGELOG.mdv0.1.22026-09-07改为整块 profile 预校验、修正 DOD50 与单字节参数写入、加 Data Memory 校验传输与全量回读、确认 CFGUPDATE 转换并恢复密封另加 IDF 6.x 测试兼容与 200 次重启回归v0.1.12025-09-22把 i2c_bus 依赖改为 public 修复编译错误v0.1.02025-08-12初始版本许可bq27220.c / bq27220.h / sample-data-app main.c 为 CC0-1.0bq27220_data_memory.c / test_apps 为 Apache-2.0根目录另附 license.txt。行动清单上电确认串口出现Firmware Version/Hardware Version且 create 返回非 NULL返回 NULL 时先查设备号 0x0220 校验日志再查 0x55 地址与上拉。跑一次 sample-data-app 完整放电默认 3300 mV 截止把串口 CSV 喂给 GPCCEDV用算出的参数替换示例 CEDV确认第二次启动日志从Start updating battery profile变为Skip battery profile update。产品化前过一遍验收SoC 曲线与你的电芯放电平台吻合、温度按 0.1°K 换算、create/delete 循环无泄漏、重启不再触发烧写。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考