【开源】XT60功率计:90V/75A,24bit,触控彩屏,WiFi

开源一个能直接插进 XT60 回路的直流功率计:ESP32-S3 主控,TI ADS131M02 24bit 双通道同步采样(4kSPS),1mΩ 四端开尔文分流器 + 101:1 精密分压,测量 0~90V、额定 ±30A(峰值 ±75A)。1.83 寸 IPS 触控彩屏跑 LVGL 9,带示波器风格波形页;WiFi 连上路由器后可以用浏览器打开网页控制台看数据、看波形、改设置、导 CSV。硬件、固件、外壳、生产文件全部开源。

做航模、无人机、电池充放电测试的时候,经常需要一台能直接串在回路里的功率计。要看得清大电流下的电压跌落,要抓得住插拔瞬间的浪涌,最好还能把数据同步到电脑。市面上能买到的产品,要么屏幕小,要么没有波形,要么数据只能自己看。于是就有了这个项目。

先说清楚一件事:本项目的软件部分由 AI 开发。硬件是我自己画的,固件从架构设计到具体实现基本都交给了 AI,我再做需求定义、方案评审和实机验证。如果你介意这一点,看到这里就可以关掉;如果你更关心"能不能用、怎么复刻",那继续往下看,代码、文档、测试工具都是公开的。

:play_button: 电子/单片机技术交流QQ群:307449735

:play_button: 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 级变化照样能看。
  • 这不是计量器具。 爱好者测量和调试够用,别拿去当标准表。

实物图

XT60 功率计成品,四种外壳颜色分别显示测量、波形、设置和启动页

外观正反面

亮屏测量状态

整机与接线

机身是上盖、中框、底盖三件式 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 的。

硬件设计

系统框架

XT60 功率计硬件系统框架图

整机是上下两块 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 设计

上板 PCB

上板 PCB 底层

上板 PCB 顶层

下板 PCB

画板的时候主要盯了这几件事:

  1. 上下板叠层,板间用排针排母连接。屏幕和各种芯片放上板,大电流路径全部丢下板。
  2. ISENSE 是差分小信号,走线尽量短,离 DC-DC 电感和开关节点远一点。
  3. ADC 的 SPI 和 DRDY 走线缩短,别跟时钟线、开关噪声长距离并行。
  4. 大电流路径铜箔加粗,再配合铜排,把 30A 额定、75A 峰值下的压降和温升压下来。
  5. 模拟前端和数字部分的地 / 电源怎么分,看原理图和 PCB 工程文件,这里不展开。

外壳与组装

外壳用 SolidWorks 画的,源文件在上盖 / 中框 / 底盖三个零件加一个装配体,3MF 打印文件单独放。

装配体爆炸图

外壳零件

螺丝、热熔螺母、电池、屏幕等配件

组装顺序:

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

内部结构:下板功率板与上板主控板

内部叠层与电池布置

软件设计

固件基于 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/             字库生成脚本

测量链路

  1. ADS131M02 每 250µs 拉一次 DRDY,SPI3 + GDMA 读完整 4 字帧:STATUS / CH0 / CH1 / CRC。DRDY 下降沿中断里直接启动传输,把读窗和采样相位锁死。
  2. CRC-16/CCITT 校验通过后,按标定参数换算成电压、电流和瞬时功率。
  3. 原始样本写进 PSRAM 的三级环形缓冲,波形页回看和降采样都从这里取。
  4. 每 200ms 结算一次块均值、平均功率、峰谷值和告警,同时积分电能和容量。
  5. 每 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 页是编号卡片式文档,每张卡带一个「:play_button: 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 就亮屏了。

使用说明

功率计接入测试回路

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

使用场景 1

使用场景 2

使用场景 3

使用场景 4

功耗与测试

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

功耗测试

采样链路的验证集中在两件事上:一是连续采样的帧完整性,二是 DRDY 到 SPI 启动的时序稳定性。4kHz 档 250µs 的周期窗口很紧,一旦读帧跨越转换完成时刻,DRDY 就会被硬件抑制、频率直接掉下来。最后的做法是 20MHz SPI 缩短读窗,加 DRDY 中断里直启 GDMA 锁住相位,实测连续跑下来帧率稳定。

精度方面目前的校准手段是:空载时做电流零点自动归零,再用已知电压和标准表修正增益 / 零偏。没有做多点标定和长期漂移测试。所以本机定位是"调试工具",不是"计量仪器"。想要更高精度的可以自己补标定点,设备端设置页和网页都能改增益和零偏。

复刻说明

  1. 资料是一整套,别只下固件目录。 原理图、立创 EDA 工程、Gerber、BOM、钢网、SolidWorks 外壳、3MF 都在同一个仓库里。

  2. 打板建议板厚 1.2mm,阻抗和层压按默认工艺就行。Gerber 在 05-生产文件/01-PCB/,钢网文件是顶层底层拼在一片上的,淘宝下单激光钢网就行。

  3. 焊接走"钢网 + 加热台"路线:钢网对位固定 → 刷锡膏 → 照交互式 BOM 放器件 → 加热台或热风枪回流 → 最后焊直插件。交互式 BOM 在浏览器里打开,点位号会高亮,找元件很省事。

  4. 烧录有两种方式。装了 ESP-IDF v6.1 就用脚本:

    cd 02-Software/XT60-Power-Meter-Firmware
    .\build_fw.bat
    .\flash_fw.bat COM3
    

    不想装环境就用 Chrome / Edge 打开 ESPConnect,走 Web Serial 烧完整固件。

  5. 固件是 5 个镜像,别只烧 app。idf.py flash 会按 flash_args 自动处理;手工烧的话注意 storage.bin 在 0x830000,里面是全量中文字体。改字库必须全量烧,只走 OTA 会出现"升级成功但中文变方框"。

  6. 校准顺序别搞反:先空载做电流零点校准(设备端采样 3 秒块均值),再校准电压增益和零偏,最后串标准表校准电流。参数写 NVS,掉电和升级都保留。

  7. 外壳建议用半透明材料打印,屏幕和状态灯能透出光来,比实色好看不少。

待实现功能

  1. 完整的 OTA 升级流程。底子已经有了:双 OTA 分区、拉取式升级中间件、启动回滚校验都能跑;缺的是网页端的固件上传入口和升级后的自检门控。
  2. USB 串口上位机功能 + 配套上位机软件。现在只有 WiFi 网页这一条路,插线看数据的需求还没做。

这两个功能有空我会补,你们也可以自己做了提 PR。

目前存在的问题

USB / 电池供电时,3.3V 会倒灌到 XT60 接口。

具体路径是:3.3V 经 XT60 取电那路 Buck 芯片内部 MOS 的体二极管,再经供电控制 MOS(Q4)的体二极管,倒灌到 XT60 端子。所以即使 XT60 没接任何输入,测量界面也会显示 2.45V 左右(3.3V 减去两级体二极管压降)。

倒灌路径说明

三个解法,按改动量从小到大:

  1. 不改电路,也不用 XT60 取电:直接不焊 XT60 取电那部分 Buck,只用电池供电。
  2. 只改一个器件:在 Q4 后面再串一颗背对背 MOS,把体二极管通路断掉。这是下一版要改的地方。
  3. 干脆不用电池 / 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

许可证方面,硬件(原理图、PCB、外壳、生产文件)用 CERN OHL-S v2,强互惠开源硬件许可,衍生硬件要用同样的许可证开源;固件用 MIT。LVGL、esp_lvgl_port、Noto Sans SC 等第三方组件各自保留原许可,明细在 THIRD_PARTY.md。

免责声明

  • 本设备测量结果不作为计量认证依据。
  • 90V / ±75A 峰值属于危险电压电流,接线、焊接、测试请防短路、防触电、防反接,大电流测试用合适线径和接头。
  • 使用本项目硬件或固件造成的任何直接或间接损失,作者不承担责任。
  • 欢迎在评论区或 Gitee Issue 反馈问题与改进建议。

开源项目推荐

推荐阅读