开源一个能直接插进 XT60 回路的直流功率计:ESP32-S3 主控,TI ADS131M02 24bit 双通道同步采样(4kSPS),1mΩ 四端开尔文分流器 + 101:1 精密分压,测量 0~90V、额定 ±30A(峰值 ±75A)。1.83 寸 IPS 触控彩屏跑 LVGL 9,带示波器风格波形页;WiFi 连上路由器后可以用浏览器打开网页控制台看数据、看波形、改设置、导 CSV。硬件、固件、外壳、生产文件全部开源。
做航模、无人机、电池充放电测试的时候,经常需要一台能直接串在回路里的功率计。要看得清大电流下的电压跌落,要抓得住插拔瞬间的浪涌,最好还能把数据同步到电脑。市面上能买到的产品,要么屏幕小,要么没有波形,要么数据只能自己看。于是就有了这个项目。
先说清楚一件事:本项目的软件部分由 AI 开发。硬件是我自己画的,固件从架构设计到具体实现基本都交给了 AI,我再做需求定义、方案评审和实机验证。如果你介意这一点,看到这里就可以关掉;如果你更关心"能不能用、怎么复刻",那继续往下看,代码、文档、测试工具都是公开的。
电子/单片机技术交流QQ群:307449735
eeClub-电子工程师社区: https://bbs.eeclub.top/
资料下载地址在文章末尾。
设计参数
| 项目 | 参数 |
|---|---|
| 主控 | ESP32-S3-WROOM-1-N16R8(16MB Flash + 8MB 八线 PSRAM,双核 240MHz) |
| 计量 ADC | TI ADS131M02,24bit Σ-Δ,双通道同步采样,4 kSPS |
| 电压量程 | 设计测量 0~90V(101:1 分压链路理论满量程 ±121V,受辅助电源 100V 输入上限限制) |
| 电压分辨率 | 约 14.5 µV/LSB |
| 电流量程 | 峰值 ±75A(ADC 满量程);额定 ±30A(XT60 接口限制) |
| 电流分辨率 | 约 8.94 µA/LSB |
| 电流采样 | 1mΩ / 5W 四端开尔文分流器,PGA 16x |
| 显示 | 1.83 寸 IPS,240×284(横屏 284×240),NV3030B,QSPI 4bit |
| 触摸 | CST816D 电容触摸,I2C |
| 传感器 | AHT20 温湿度、SC7A20HTR 三轴加速度计(自动转屏) |
| 通信 | WiFi 2.4GHz,STA/AP,HTTP + WebSocket |
| 供电 | XT60 输入 / USB-C / 单节锂电池三路供电,TPS2116 优先 USB,TP4057 以 400mA 充电 |
| 自身功耗 | 约 0.7W |
| 外壳 | 上盖 / 中框 / 底盖三件式 3D 打印,SolidWorks 源文件 + 3MF |
| 固件 | v0.6.9,ESP-IDF v6.1 + LVGL 9.6 |
先说几个容易被误读的点:
- ±75A 是 ADC 满量程,不是可持续电流。 1mΩ 分流器额定到 70A(70A 时压降 70mV、功耗 4.9W),但 XT60 接口只到 30A(30A 时压降 30mV、功耗 0.9W)。所以整机额定写 ±30A,想长期跑更大电流得自己改底板换 XT90。
- 90V 也不是分压链路的极限。 分压本身能到 ±121V,是辅助电源(XT60 取电那路 Buck)最高输入 100V 把整机卡在了 90V。
- 电流小于 2mA 时显示 0 是正常的。 1mΩ 分流器的小信号噪声不小(单帧 σ≈2mA),固件用 200ms 块均值加 2mA 死区压住空载跳动;波形页用的是原始样本,mA 级变化照样能看。
- 这不是计量器具。 爱好者测量和调试够用,别拿去当标准表。
实物图




机身是上盖、中框、底盖三件式 3D 打印外壳,M2.5 螺丝固定。正面一块 1.83 寸 IPS 屏,屏幕左侧是状态指示灯和复位按键,机身侧面有 K1/K2 两颗实体按键(K2 长按可以呼出快速菜单)。Type-C 口旁边那个开关用来切供电:一边是电池 / USB,一边是 XT60 取电。
屏幕界面
屏幕上是三页滑动结构:测量、波形、设置,首末页到头即止。触屏和纯按键都能操作。
| 测量主界面 | 示波器风格波形页 |
|---|---|
![]() |
![]() |
| 电压 / 电流 / 功率大数字,底部是电能、温湿度、峰谷值 | V/I/P 多模式,1s~10min 六档时间窗,自动量程 |
| 设置页 | 上拉快速菜单 |
|---|---|
![]() |
![]() |
| 测量、显示、蜂鸣器、WiFi、电能统计、告警、关于、恢复出厂 | 数据刷新率、清除电能统计(二次确认) |
几个用起来比较顺手的细节:
- 首页底部那条电能数据可以点,在 Wh 和 Ah 之间切换。
- 波形页纵轴刻度按 1-2-5 标准格值锚定,直接心算就能读数;刻度还做了去尾零处理,显示 3V / 0.2A 而不是 3.00V / 0.200A。
- 弹窗宽度跟着屏幕方向走(横屏 260px、竖屏 216px),竖屏不会左右被裁。
- 无操作 15 / 30 / 60 秒(可设)背光降到 10%,触摸或按任意键立刻恢复。
- 上面这些界面图是用项目自带的 PC 端 LVGL 模拟器(
tools/ui_sim)生成的,和真机共用同一份界面源码,不是 P 的。
硬件设计
系统框架

整机是上下两块 PCB 叠起来的:
- 上板:主控、屏幕、触摸、传感器、按键、蜂鸣器、电压分压、电源管理。
- 下板:XT60 输入输出、1mΩ 分流器、大电流铜排。
电池夹在两层板中间,贴上上板背面(也就是 ESP32-S3 模组那一面)。
| 模块 | 主要器件 | 职责 |
|---|---|---|
| 主控 | ESP32-S3-WROOM-1-N16R8 | 采样调度、UI 渲染、WiFi 通信、数据存储 |
| 计量前端 | ADS131M02 + LRA8551A | 电压 / 电流同步采样,24bit,4kSPS |
| 显示交互 | NV3030B LCD + CST816D + K1/K2 + 蜂鸣器 | 本地显示与操作 |
| 传感器 | SC7A20HTR + AHT20 | 屏幕方向、机内温湿度 |
| 电源 | SY8511BADC / TLV62084 / TPS2116 / TP4057 | 三路输入切换、3.3V 稳压、电池充电 |
| 存储升级 | 16MB Flash + 双 OTA 分区 | 固件、字体资源、OTA 与回滚 |
电压采样

电压通道用 101:1 精密分压(100kΩ / 1kΩ,±0.1% 薄膜电阻),分压后经零漂移运放 LRA8551A 缓冲,再进 ADS131M02 的 CH1(PGA 1x)。
分压链路本身理论满量程 ±121V,但整机辅助电源最高输入 100V,所以设计测量范围取 0~90V。按这个量程折算,单 LSB 约 14.5µV。
电流采样


电流通道是 1mΩ / 5W 四端开尔文分流器,电压引出点独立于大电流走线,避免铜箔电阻串进测量回路;信号经 RC 滤波后直接进 ADS131M02 的 CH0(PGA 16x)。
PGA 16x 下 ADC 满量程对应 ±75A 峰值,1 LSB≈8.94µA。
为什么选 1mΩ?要覆盖 ±75A 峰值和 30A 额定,又要把分流器自身发热压在 5W 以内,1mΩ 是这几个约束交叉出来的结果。代价就是小信号噪声偏大,靠固件的块均值和死区来补。
电源与电池管理

- XT60 取电:SY8511BADC 降到 3.3V / 1A。
- USB / 电池:TLV62084 降到 3.3V / 2A。V2 板用 TPS2116 在 USB 和电池之间自动切换,优先 USB。
- 充电:TP4057,400mA,单节锂电池。电池电压经 1:1 分压进 ESP32-S3 的 ADC,用来显示电量。
- V1 板还做过一版用分立 MOS 实现电源切换的方案,两版原理图都开源了。
PCB 设计




画板的时候主要盯了这几件事:
- 上下板叠层,板间用排针排母连接。屏幕和各种芯片放上板,大电流路径全部丢下板。
- ISENSE 是差分小信号,走线尽量短,离 DC-DC 电感和开关节点远一点。
- ADC 的 SPI 和 DRDY 走线缩短,别跟时钟线、开关噪声长距离并行。
- 大电流路径铜箔加粗,再配合铜排,把 30A 额定、75A 峰值下的压降和温升压下来。
- 模拟前端和数字部分的地 / 电源怎么分,看原理图和 PCB 工程文件,这里不展开。
外壳与组装
外壳用 SolidWorks 画的,源文件在上盖 / 中框 / 底盖三个零件加一个装配体,3MF 打印文件单独放。



组装顺序:
- 中框上的 8 个螺丝孔压入热熔螺母,用烙铁加热压就行。
- 下板装进底盖,注意中框方向,放上中框后拧底盖的四颗螺丝。
- 电池包一层青稞纸绝缘,接好电池座,用双面胶粘在上板底面(ESP32 模组那一面)。
- 对准板间排针,把上板连同电池扣到中框上。
- 盖上上盖。
- 最后接屏幕,屏幕背面贴双面胶固定。


软件设计
固件基于 ESP-IDF v6.1 + LVGL 9.6,分层依赖只能自上而下,业务代码不许直接调裸外设 API。
main/ 启动流程、任务创建、参数下发
components/
├── drivers/ ads131m02 / lcd_nv3030b / touch_cst816d / key_button
│ buzzer / imu_sc7a20h / aht20 / battery_adc / status_led
├── middleware/ data_store(seqlock)/ web_console / wifi_manager
│ lvgl_port / fs_storage / event_bus / ota_update
└── services/ power_measure / ui / settings / orientation / device_ctrl
tools/
├── ui_sim/ PC 端 LVGL UI 模拟器(走查 + 回归截图)
└── fonts/ 字库生成脚本
测量链路
- ADS131M02 每 250µs 拉一次 DRDY,SPI3 + GDMA 读完整 4 字帧:STATUS / CH0 / CH1 / CRC。DRDY 下降沿中断里直接启动传输,把读窗和采样相位锁死。
- CRC-16/CCITT 校验通过后,按标定参数换算成电压、电流和瞬时功率。
- 原始样本写进 PSRAM 的三级环形缓冲,波形页回看和降采样都从这里取。
- 每 200ms 结算一次块均值、平均功率、峰谷值和告警,同时积分电能和容量。
- 每 25ms 产出一帧 40Hz 快照,UI 和网页都只读快照,不直接碰测量数据。
双核分工:Core 1 跑采样和测量,Core 0 跑 LVGL 渲染、按键和 WiFi/HTTP 服务。为什么不把测量放 Core 0?WiFi 协议栈会周期性吃掉不少 CPU,和 4kHz 采样抢核会造成采样抖动,直接反映到读数上。仪器类固件用硬件资源换时序确定性,是常规做法。
网页控制台


网页是直接编进固件的,不依赖外部 CDN,断网也能打开。五个页签:实时数据 / 波形图 / 设置 / API / 日志。
- WebSocket
/ws以 15Hz 推快照,断线自动退化成轮询并每 5s 重连一次。 - 读数刷新率可以设 15 / 10 / 5 / 2 / 1 Hz,低档位会对收到的多帧做平均,读数更稳;设备发送速率和波形缓冲不受影响。
- 波形页是 Canvas 手绘,V/I/P 三通道叠加、十个时间窗、暂停、拖动回看、十字光标、量程锁定、CSV 导出都有。
- 设置页打开就从设备回读当前值,不会显示前端默认值;标定参数(电压 / 电流的增益和零偏)网页上能直接读写。
- API 页是编号卡片式文档,每张卡带一个「
Test」,点了就地发真实请求,显示状态码、耗时和响应正文。
主要接口:/api/state、/api/config(GET/POST)、/api/info、/api/wifi/scan、/api/export.csv、/ws。
工程化
- 双 OTA 分区 + 启动回滚:
ota_update_start(url)拉取式升级写备用分区,启动失败自动退回旧版本。网页控制台目前还没做固件上传入口,救砖还是以 USB / 串口烧录为准。 - coredump:崩溃现场写到独立分区,方便事后导出分析。
- PC 端 UI 模拟器:
tools/ui_sim用同一份界面源码在 Windows 上渲染并批量截图,烧录前先跑一遍布局回归。 - 主机端单元测试:纯逻辑部分(补码扩展、标定换算、电能积分、按键状态机、AHT20 CRC)不依赖硬件就能测。
- 字库子集化:主界面用 GB2312 一级+二级 6763 字,两个字重约 4.2MB,放独立的 storage 分区;启动页另用一套约 197 字的极小子集直接编进 app,首帧就是完整中文。
顺带说个踩坑记录:启动页以前要等文件系统挂载、全量字库加载完才显示,屏幕点亮要 1.42s。把显示链路(LCD / 触摸 / LVGL / IMU / 方向)前移到第 9~13 步、fs_storage 后移之后,现在大约 1.09s 就亮屏了。
使用说明

- 接线:XT60 输入端接电源或电池,输出端接负载,注意正负极。输入输出方向可以对调,反向电流会显示成负数。
- 开机:开关拨到 USB / 电池这档就能开机。要是切在 XT60 取电档,输入得给到 5V 以上才起得来。
- 测量:主界面看电压、电流、功率、电能。点一下底部电能行可以在 Wh 和 Ah 之间切。
- 波形:滑到波形页,上滑呼出快捷菜单,切时间窗和 V/I/P 模式。
- 快速菜单:测量页上滑或者长按 K2,能调刷新率、清电能统计(清之前会二次确认)。
- 配网:设置 → WiFi 与热点 → 搜索 WiFi → 输密码。也可以让它开热点,手机连上设备热点再进网页配网。
- 网页:配网成功后,同一局域网的手机或电脑访问设备 IP 就行。
- 充电:USB-C 接 5V,TP4057 以 400mA 充,状态栏能看到电量。




功耗与测试
整机自身功耗实测大约 0.7W。这是设备自己吃掉的功率,测量的时候会叠加在被测回路上,低功耗待测设备的测试要留意这个本底。

采样链路的验证集中在两件事上:一是连续采样的帧完整性,二是 DRDY 到 SPI 启动的时序稳定性。4kHz 档 250µs 的周期窗口很紧,一旦读帧跨越转换完成时刻,DRDY 就会被硬件抑制、频率直接掉下来。最后的做法是 20MHz SPI 缩短读窗,加 DRDY 中断里直启 GDMA 锁住相位,实测连续跑下来帧率稳定。
精度方面目前的校准手段是:空载时做电流零点自动归零,再用已知电压和标准表修正增益 / 零偏。没有做多点标定和长期漂移测试。所以本机定位是"调试工具",不是"计量仪器"。想要更高精度的可以自己补标定点,设备端设置页和网页都能改增益和零偏。
复刻说明
-
资料是一整套,别只下固件目录。 原理图、立创 EDA 工程、Gerber、BOM、钢网、SolidWorks 外壳、3MF 都在同一个仓库里。
-
打板建议板厚 1.2mm,阻抗和层压按默认工艺就行。Gerber 在
05-生产文件/01-PCB/,钢网文件是顶层底层拼在一片上的,淘宝下单激光钢网就行。 -
焊接走"钢网 + 加热台"路线:钢网对位固定 → 刷锡膏 → 照交互式 BOM 放器件 → 加热台或热风枪回流 → 最后焊直插件。交互式 BOM 在浏览器里打开,点位号会高亮,找元件很省事。
-
烧录有两种方式。装了 ESP-IDF v6.1 就用脚本:
cd 02-Software/XT60-Power-Meter-Firmware .\build_fw.bat .\flash_fw.bat COM3不想装环境就用 Chrome / Edge 打开 ESPConnect,走 Web Serial 烧完整固件。
-
固件是 5 个镜像,别只烧 app。
idf.py flash会按flash_args自动处理;手工烧的话注意storage.bin在0x830000,里面是全量中文字体。改字库必须全量烧,只走 OTA 会出现"升级成功但中文变方框"。 -
校准顺序别搞反:先空载做电流零点校准(设备端采样 3 秒块均值),再校准电压增益和零偏,最后串标准表校准电流。参数写 NVS,掉电和升级都保留。
-
外壳建议用半透明材料打印,屏幕和状态灯能透出光来,比实色好看不少。
待实现功能
- 完整的 OTA 升级流程。底子已经有了:双 OTA 分区、拉取式升级中间件、启动回滚校验都能跑;缺的是网页端的固件上传入口和升级后的自检门控。
- USB 串口上位机功能 + 配套上位机软件。现在只有 WiFi 网页这一条路,插线看数据的需求还没做。
这两个功能有空我会补,你们也可以自己做了提 PR。
目前存在的问题
USB / 电池供电时,3.3V 会倒灌到 XT60 接口。
具体路径是:3.3V 经 XT60 取电那路 Buck 芯片内部 MOS 的体二极管,再经供电控制 MOS(Q4)的体二极管,倒灌到 XT60 端子。所以即使 XT60 没接任何输入,测量界面也会显示 2.45V 左右(3.3V 减去两级体二极管压降)。

三个解法,按改动量从小到大:
- 不改电路,也不用 XT60 取电:直接不焊 XT60 取电那部分 Buck,只用电池供电。
- 只改一个器件:在 Q4 后面再串一颗背对背 MOS,把体二极管通路断掉。这是下一版要改的地方。
- 干脆不用电池 / USB:开关切到 XT60 供电档,就没有倒灌路径了,但必须接着 XT60 才能开机。
另外几条已知限制:
- 切到 XT60 供电时,输入最低 5V 才能启动。
- 电流 |I| < 2mA 按 0 处理,这是设计行为不是故障。
- 网页控制台没有 OTA 上传入口,升级还得插线。
- 测量结果是直流口径的块均值,不是真有效值(RMS)。要测交流或纹波得另做。
原理图




完整的原理图 PDF(上板 V1 / V2、下板)和立创 EDA 工程在仓库 01-Hardware/ 下。
资料下载地址
提供的资料有 立创 EDA 工程文件、上板/下板原理图 PDF、Gerber 制板文件、钢网文件、BOM 表、位号图、交互式焊接辅助 HTML、SolidWorks 外壳源文件、3MF 打印文件、全部器件数据手册、ESP-IDF 固件完整工程(含架构文档、烧录指南、引脚表、PC 端 UI 模拟器)。
仓库目录结构:
XT60-Power-Meter/
├── 01-Hardware/ 硬件设计
│ ├── 01-XT60功率计-立创EDA工程.epro2
│ ├── 02-上板原理图_V1.pdf / V2.pdf
│ └── 02-下板原理图.pdf
├── 02-Software/
│ └── XT60-Power-Meter-Firmware/ ESP-IDF 固件工程
│ ├── main/ 启动与任务编排
│ ├── components/ 驱动 / 中间件 / 服务
│ ├── docs/ 架构、烧录、引脚文档
│ └── tools/ 字体工具、UI 模拟器
├── 03-Datasheet/ 器件数据手册与屏幕资料
├── 04-外壳设计/ SolidWorks 源文件与 PCB 模型
├── 05-生产文件/
│ ├── 01-PCB/ Gerber 与手工焊接钢网
│ ├── 02-贴片/ BOM、位号图、交互式焊接辅助
│ └── 03-外壳3D打印文件/ 3MF 打印文件
├── LICENSE 硬件 CERN OHL-S v2
├── README.md
└── README.en.md
- Gitee 开源地址:https://gitee.com/zeruns/xt60-power-meter(开发用
develop分支) - GitHub 仓库地址:https://github.com/zeruns/xt60-power-meter
- 立创开源平台地址:https://oshwhub.com/zeruns/xt60-power-meter-esp32
- 演示视频:https://www.bilibili.com/video/BV1pNWU6qE3P/
许可证方面,硬件(原理图、PCB、外壳、生产文件)用 CERN OHL-S v2,强互惠开源硬件许可,衍生硬件要用同样的许可证开源;固件用 MIT。LVGL、esp_lvgl_port、Noto Sans SC 等第三方组件各自保留原许可,明细在 THIRD_PARTY.md。
免责声明
- 本设备测量结果不作为计量认证依据。
- 90V / ±75A 峰值属于危险电压电流,接线、焊接、测试请防短路、防触电、防反接,大电流测试用合适线径和接头。
- 使用本项目硬件或固件造成的任何直接或间接损失,作者不承担责任。
- 欢迎在评论区或 Gitee Issue 反馈问题与改进建议。
开源项目推荐
- 做了个三相电量采集器开源出来,可以方便监测家里用电情况: https://blog.zeruns.com/archives/771.html
- 基于STM32的同步整流Buck-Boost数字电源 开源: https://blog.zeruns.com/archives/791.html
- 基于CH32V307的智能电子负载开源,嵌入式大赛作品开源: https://blog.zeruns.com/archives/785.html
- 【开源】基于SC8703的升降压DCDC可调电源(Buck-Boost),电压电流可调,支持PD快充输入:https://blog.zeruns.com/archives/929.html
- 开源 140W+65W升降压PD3.1快充模块(2C+1A口),IP6557+IP6538,205W桌面充电器:https://blog.zeruns.com/archives/801.html
- 【开源】24V3A反激式开关电源(基于UC3842,含电路和变压器参数计算过程):https://blog.zeruns.com/archives/910.html
- 开源TypeC拓展坞,4个10Gbps的USBA口+2.5G网卡+读卡器: https://blog.zeruns.com/archives/868.html
推荐阅读
- 高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html
- 我的世界开服教程:https://blog.zeruns.com/tag/mc/
- 跨境电商独立站搭建教程,WordPress外贸建站指南:https://blog.zeruns.com/archives/889.html
- Hermes Agent 部署全指南,手把手教你搭建你的第一个AI助手:https://blog.zeruns.com/archives/939.html
- 绿联(Ugreen)DXP4800Pro NAS 开箱评测与拆解:https://blog.zeruns.com/archives/949.html
- Discourse论坛搭建教程,零基础部署Discourse开源社区论坛网站:https://blog.zeruns.com/archives/919.html



