ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

零知ESP32 -- INA228 高精度电池容量分析仪

零知ESP32 -- INA228 高精度电池容量分析仪 项目概述本项目用ESP32读取INA228高精度功率监控芯片对单节锂电池做充、放电容量测量。屏幕显示电压、电流、容量mAh和能量Wh三个按键控制开始/停止ESP32 自开 WiFi 热点手机浏览器可看实时数据和折线图并导出 CSV 供 Excel 打开。INA228 不是普通的「瞬时电流计」。它带 20-bit ADC以及片内CHARGE / ENERGY累加器电荷和电能在芯片里积分。ESP32 负责校准、截止判断、显示和上网不代替芯片做长时间积分。项目亮点片内库仑计优先读 INA228 的 CHARGE、ENERGY换算为 mAh、Wh芯片读数为 0 时再用软件积分兜底。本地 网页双界面ST7789 现场看数手机连热点看蓝/绿/黄三条曲线电压、电流、容量。按键与网页同一套命令GPIO12 放电、GPIO14 充电、GPIO27 短按停止 / 长按清零网页按钮功能相同。截止带防误判电压低于约 0.8 V 视为 VBUS 未接不会当成电池耗尽必须先看到高于截止电压才允许放电截止。历史曲线可导出测试过程采样写入缓冲区网页「导出 Excel」下载 UTF-8 CSV。项目难点及解决方案难点现象解决芯片供电与被测回路混接测不到电压或烧口INA228 的 VS 只接 ESP32 3.3 V电池电流只走 VIN / VIN-VBUS 未接电池正极电压约 0.001 V屏幕 CHECK VBUS电池正极必须同时接到 VIN和VBUS未共地电压乱跳、读数接近 0ESP32、INA228、电池负极、负载负极全部共 GND片内 ENERGY/CHARGE 偶发读 0有电流但 mAh 不动mahNow()/whNow()硬件有效用硬件否则用integrate()小电流被显示成 0.0LED 十几 mA 时容量一位小数全是 0容量显示到 0.001 mAh未接电池却触发「放电截止」0 V 3.00 V 两秒后停止cutoffArmed先高于截止电压才允许截止V 0.8 V 只提示接线一、硬件系统部分1.1 硬件清单名称规格 / 说明数量ESP32 开发板3.3 V 逻辑1ESP32 扩展板方便接线1INA228 模块I2C默认地址 0x401ST7789 彩屏常见 240×240SPI1被测电池单节锂电先用带保护的 186501放电负载LED 适合通电检查1杜邦线、共地线—若干INA228 的 VS 不要接到 5 V 或电池正极。USB 给 ESP32 供电即可。1.2 接线方案原则两路电源分开。一路USB → ESP32 → 3.3 V 给 INA228 芯片和屏幕。一路电池 → VIN / VBUS → 分流电阻 → VIN- → 负载 → 电池负极。两路GND 必须相连。ESP32 ↔ INA228INA228ESP32VS / 3V33.3VGNDGNDSDAGPIO21SCLGPIO22放电回路测放出多少 mAh电池 ──► VIN 和 VBUS两根都要接 VIN- ──► 负载 负载 - ──► 电池 - ──► ESP32 GND充电回路可选充电器 ──► VIN 和 VBUS VIN- ──► 电池 电池 - ──► 充电器 - ──► ESP32 GNDGPIO5 在程序里作为可选负载 MOSFET 控制脚LOAD_PIN。不接 MOSFET 时放电负载会一直通电停止测试后请手动断开负载。1.3 硬件连接图接好后、先不要按放电键屏幕电压应为约3.74.2 V。若显示CHECK VBUS或约 0.001 V先查 VBUS 和共地。1.4 实物连接图二、软件架构设计开发环境零知派开发板零知-ESP32。热点SSIDINA228-Bat密码ina228228页面http://192.168.4.1。2.1 系统初始化setup()顺序LOAD_PIN输出并关断三个按键INPUT_PULLUP。串口打印接线与按键说明。Wire.begin(21, 22)尝试ina.begin()失败则扫描 0x400x4F。ina.reset()后配置setADCRange(false)分流 ±163.84 mV匹配 0.015 Ω、约 10 AsetMaxCurrentShunt(10.0, 0.015)写入 SHUNT_CAL连续转换母线 分流 温度平均 16 次转换时间 1052 µsI2C 降到 100 kHz提高 40-bit 累加器读取稳定性。resetMeter()清零片内累加器和软件积分。displayBegin()初始化 ST7789。WiFi.softAP()开热点注册/、/api/live、/api/history、/api/cmd、/export.csv。2.2 主循环逻辑loop()每一圈读取母线电压、电流、功率。非DONE时调用integrate()用 Δt 做软件电荷/能量累加。runControl()放电截止、充电完成、极性与 VBUS 检查。handleButtons()、server.handleClient()。放电/充电过程中histPush()记录曲线。约 400 ms 刷新屏幕约 1 s 打印串口。状态机IDLE→DISCHARGE或CHARGE→DONE。清零回到IDLE。三、代码拆分讲解工程三个文件职责分开文件作用INA228_BatteryAnalyzer.ino测量、状态机、按键、WiFi、历史与导出display.hTFT_eSPI 引脚宏、屏幕绘制web_page.h网页 HTML/CSS/JS折线图、导出3.1 测量与显示mahNow()/whNow()片内 CHARGE库仑÷ 3.6 mAhENERGY焦耳÷ 3600 Wh。硬件值过小则用软件积分。integrate()电荷 I·dt能量 P·dt。displayUpdate()状态、电压过低显示 CHECK VBUS、电流、mAh、Wh、计时。3.2 控制startTest()清零后进入放电或充电放电时拉高LOAD_PIN。stopTest()关负载、锁存最终 mAh/Wh、补最后一个历史点。runControl()放电需先cutoffArmed电压连续低于 3.00 V 达 2 s 才停止充电需电压 ≥ 4.20 V 且电流 ≤ 50 mA 维持 5 s。3.3 网页/api/live当前状态与读数。/api/history曲线点{t,v,i,m}。/export.csv带 BOM 的中文表头 CSV。前端一张 Canvas蓝/绿/黄三线各自归一化后叠画避免量纲差两个数量级画在一起看不见。四、操作过程及数据展示4.1 操作步骤按第一节接好线确认共地电池正极接到 VIN和VBUS。零知派打开INA228_BatteryAnalyzer.ino选零知-ESP32验证上传。上电屏幕出现INA228 BATTERY电压约 4 V。不要按住 GPIO12 复位。电芯请先用正规充电器充满再接到本装置。按GPIO12或网页「开始放电」。状态变为DISCHARGE电流应为正。放到约 3.0 V 自动停止或短按 GPIO27 / 网页「停止」。状态DONE记下 mAh、Wh。无 MOSFET 时停止后马上断开负载。手机连INA228-Bat/ina228228打开 http://192.168.4.1 看曲线点「导出 Excel」用 Excel 打开 CSV。充电测容量接充电器后按 GPIO14。本程序只计量不替代充电器保护。屏幕上可看到的数据状态IDLE/DISCHARGE/CHARGE/DONE电压、电流、容量 mAh、能量 Wh、测试时长网页上可看到的数据同上实时数字一张图蓝电压、绿电流、黄容量导出列时间_秒、电压_V、电流_mA、容量_mAhLED 当负载时电流小几分钟内容量可能只有 0.x mAh属正常。正式测容量请用功率电阻。4.2 演示视频零知ESP32 -- INA228 高精度电池容量分析仪五、技术原理5.1 工作原理INA228 测量分流电阻两端压差得到电流测量 VBUS 得到母线电压片内计算功率并在每次 ADC 转换后累加电荷C≈ Σ I·Δt_conv → 程序中 mAh |CHARGE| / 3.6电能J≈ Σ P·Δt_conv → 程序中 Wh |ENERGY| / 3600setMaxCurrentShunt(10, 0.015)按最大电流和分流阻值计算 CURRENT_LSB并写入校准寄存器。ADCRANGE0 时分流满量程 ±163.84 mV0.015 Ω 大约对应 10 A。ESP32 用 I2C 读结果同时用micros()做软件积分避免 40-bit 寄存器读取失败时界面一直为 0。放电截止看的是VBUS 电压不是电流。因此 VBUS 必须接到电池正极否则电压接近 0无法代表电芯状态。5.2 工作模式配置程序中的芯片配置setup()配置取值含义ADC 量程setADCRange(false)±163.84 mV分流与满量程0.015 Ω10 A与常见 15 mΩ 模块一致转换模式INA228_MODE_CONT_TEMP_BUS_SHUNT连续测温度、母线、分流平均次数16降噪响应仍够用转换时间1052 µs母线与分流各一次软件状态模式含义IDLE待机计时为 0DISCHARGE正在累计放电容量CHARGE正在累计充电容量DONE已停止屏幕/网页保持最终 mAh、Wh网页热点为 AP 模式手机连上后没有外网。折线图为离线 Canvas不依赖外部 CDN。六、常见问题指引Q1:屏幕电压约 0.001 V 或 CHECK VBUSVBUS 没接到电池正极或没有共地。用万用表量模块 VBUS 对 GND应等于电池电压。Q2:电流为负VIN / VIN- 相对电流方向反了。对调电池回路不要改 ESP32 的 3.3 V。Q3:有电压、电流接近 0负载电流没流过分流电阻。负载必须串在 VIN- 与电池负极之间不能并联在电池两端绕过模块。Q4:一按放电就提示截止旧程序会把 0 V 当成低于 3 V。请使用当前带cutoffArmed的代码并先保证电压显示 4 V 左右。
返回列表