[开源固件] FRME-PM-01A 库仑计+电量表固件复刻:OpenPM01 —— libopencm3,纯自由软件技术栈
背景
用服务器电源或者13.8V磷酸铁锂电池给短波电台供电的兄弟应该都对 FRME-PM-01A 不陌生——两头XT60、带屏幕的开源电流表,在圈子里认可度挺高的。
对ham来说基础功能是够用的,但我自己用4S磷酸铁锂电池的时候,一直想要一个电量显示——不然只能自己拿电压去查表估算,挺麻烦。刚好我在 oshwhub 的评论区也看到有人在问能不能加库仑计功能。就想着干脆自己写一套固件。
可惜原固件不开源,既然要自己写,那索性把技术栈也换成完全自由软件的:PlatformIO + libopencm3,没有ST的HAL,没有任何非自由依赖和proprietary blob~
于是有了 OpenPM01。
实际展示

IC-718短波电台发射ft8

电池充电
设计思路
库仑计 + 电量表
在原有电压/电流/温湿度基础上加了:
- 软件库仑计:对电流做数值积分,累计 mAh / Ah
- 电量表:电压查表估算 SOC,在CHARGE栏,以进度条形式展示(不占地方,不需要看的时候也不
碍事)
老实说这个电量表不算精确——不同电池化学体系差异很大,硬件上又没有 EEPROM 之类的存储器,没法做累计值保存或者电量校准,只能查表硬估。但对日常判断"电池还剩多少、要不要充"这种场景,够用了。
目前只写了 4S磷酸铁锂 的查表曲线(ham圈最常见的配置),其他电池类型(3S/6S锂电、铅酸等)还没做,代码里加个 #elif 分支塞个查表就行,欢迎大家PR。
刷新率 & 调度
原固件刷新率很慢,我猜是所有逻辑塞在 main() 里用 delay() 硬等。但库仑积分和瞬时功率显示都需要比较高的采样/刷新频率,STM32F103 主频完全跟得上,于是设计了一个简单的非抢占协作式调度器。
各任务按各自周期独立触发,互不阻塞。这样库仑积分精度上去了,UI也顺带获得了更高刷新率——电压电流功率的读数变化肉眼可见地更顺滑。
告警显示
过压、过流、温度越限这些告警,原固件是在旁边小区域提示。我改成了直接在对应数值的显示框里高亮+闪烁,更醒目,如图所示。


示例:低电压/低电量警告
UI 与配色
重新设计了UI排布,空间利用率更高。顺手加了 Catppuccin 四配色主题(Mocha / Macchiato / Frappé / Latte,三暗一亮),代码里加个新色板就能扩展。另外做了四种朝向(竖屏/竖屏180°翻转/横屏/横屏翻转),编译选项控制,方便不同装壳安装方式。具体图片参见Github。
构建 & 烧录
需要 PlatformIO:
# 在 platformio.ini 中修改编译选项
platformio run
platformio run --target upload
朝向和配色通过 build_flags 编译选项选择,电池profile同理(默认4S磷酸铁锂,-DNO_BATTERY 可完全禁用电量表功能)。
GitHub releases页面提供了预编译的hex文件,大家可以自行刷入。
烧录
PCB上留有SWD引脚,不需要焊接排针,将排针怼上去用手按住即可。



声明
FRME-PM-01A 硬件由 @FrostAutumn 设计,遵循 CC-BY-NC-SA 3.0 协议。本固件是独立项目,与原厂无关联、未经背书,也没有参考过原厂固件(原厂固件本身未开源)。固件本体基于 GNU GPLv3 开源,可以自由使用(包括商用);但是如果打算做衍生产品,硬件部分仍需单独遵守原作者的CC-BY-NC-SA条款。
依赖 & 鸣谢
| 组件 | 作者 | 协议 |
| stm32f1_st7789_spi | Avra Mitra | MIT |
| INA226 library | Rob Tillaart | MIT |
| SHT30 library | LibDriver | MIT |
| libopencm3 | libopencm3 project | LGPLv3 |
| Caskaydia Cove (Cascadia Code fork) | Eli Heuer / Microsoft | SIL OFL 1.1 |
仓库
GNU GPLv3开源,欢迎复刻、PR、挑刺。目前只做了4S磷酸铁锂电量表,其他电池类型的查表曲线特别欢迎贡献。
仓库地址:https://github.com/sophiel-meow/OpenPM01
预编译固件:https://github.com/sophiel-meow/OpenPM01/releases
有板子的兄弟欢迎实测反馈喵~