外观
FNIRSI DPS-150:便携数控电源,从官方规格到串口直控

调试开发板时,我希望脚本能设电压、开关供电,再读回状态,不必每次伸手按面板。DPS-150 的官方上位机只支持 Windows,但社区已经整理了 USB 串口协议,Mac 上用 Python 和 pyserial 也能控制。
这里记录的是 DPS-150P、固件 V1.6、硬件 V1.0 的实测。协议来自 nasheed-x/dps150_api,不是我从零逆向的;规格和界面图来自 官方说明书。
先分清供电口和数据口
DC 与 Type-C 供电只能选一个,不能同时接电。 电脑通信走 Micro-USB 数据口,需要能传数据的线,而不是纯充电线。
接负载前先关闭输出,确认极性、目标电压和限流值。额定 30V 不等于接任意充电器都能输出 30V:它是降压电源,输入必须高于输出。本次输入 20.08V,设备报告的最大输出只有 19.88V。
| 官方规格 | 数值 |
|---|---|
| 输出范围 | 0~30V / 0~5A / 0~150W,受输入能力限制 |
| 输入 | DC 5.0~32V / 100mA~5A,支持 PD / QC |
| 屏幕 | 2.8 寸,320×240 |
| 设定分辨率 | 电压 10mV,电流 1mA |
| 设定精度 | 电压 ≤0.1%±5mV;电流 ≤0.1%±3mA |
| 回读精度 | 输入电压 ≤0.2%±5mV;输出电压 ≤0.1%±10mV |
| 负载调整率 | 0.49% |
这些是手册规格,不是本文重新测得的精度。输入边界应按自己设备的说明书核对,不要为追求输出上限盲目升高供电。
脚本发出去的是什么?
连接后枚举为 AT32 Virtual Com Port,USB VID:PID 为 2E3C:5740。通信使用 USB CDC,串口配置为 115200、8N1,RTS 拉高。
bash
system_profiler SPUSBDataType | grep -A6 "AT32 Virtual Com Port"
ls /dev/cu.usbmodem*这不是发送 VOLT 5 一类文本指令,而是二进制帧:
| 字段 | 帧头 | 命令 | 寄存器 | 长度 | 数据 | 校验和 |
|---|---|---|---|---|---|---|
| 字节数 | 1 | 1 | 1 | 1 | N | 1 |
| 内容 | 请求 F1,回包 F0 | 读或写等操作 | 目标地址 | 数据长度 | 按寄存器类型编码 | 下式 |
校验和为 (Reg + Len + sum(Data)) & 0xFF,不含帧头和命令。电压、电流等浮点数使用 IEEE754 float32 小端;开关和状态不是浮点数。
| 命令 | 用途 | 常用寄存器 | 数据 |
|---|---|---|---|
0xA1 | 读寄存器 | 0xFF 全状态 | 139 字节 |
0xB1 | 写寄存器 | 0xC1 电压、0xC2 电流 | float32 |
0xB1 | 写寄存器 | 0xDB 输出开关 | uint8,0/1 |
0xC1 | 连接 / 断开会话 | — | 会话控制 |
0xB0 | 设置波特率 | — | 通信配置 |
0xC0 | 进入 DFU 升级模式 | — | 普通控制不要发送 |
同一个数值在不同字段里含义不同:命令 0xC0 会进入 DFU,寄存器 0xC0 则是输入电压。不能把读输入电压与发升级命令混为一谈。
开关输出后,电压没有立刻跟上
我先写入 5.000V / 0.500A,回读设定一致,再空载开启输出。第一次只读到 0.763V,并不是设定失败,而是软启动还没结束。关输出同样有电容泄放时间。
图中只画原始记录里的四个采样点,不插值成连续曲线。该次空载实验约 1.5s 升到设定值、约 1.2s 放到零;不同负载下不能直接沿用这个时长。
| 读回项目 | 本次记录 |
|---|---|
| 型号 / 固件 / 硬件 | DPS-150P / V1.6 / V1.0 |
| 输入 / 温度 | 20.08V / 30.5°C |
| 稳定输出 | 5.000V,空载电流 0A,CV 模式 |
| 全状态 | 139 字节,包含设定、遥测、保护、预设与累计量 |
脚本的顺序因此应当是:关闭输出 → 写电压与限流 → 回读确认 → 开启 → 等待并检查实测值 → 关闭并检查残余电压。延时只是等待手段,不能代替回读,也不能保证负载安全。
最费时间的不是写入,而是认错回包
设备会主动推送遥测。请求全状态后,先到的可能是 12 字节输出遥测,而不是期待的 139 字节状态包。若把“第一帧”当响应,字段就全乱了。
| 遇到的现象 | 后来怎么处理 |
|---|---|
| 读全状态却只有 12 字节 | 按目标寄存器过滤回包,不能只取第一帧 |
单读 0xE2/0xE3 最大能力值为 0 | 改读全状态偏移 0x6F/0x73 的最大 V/I |
| 设不到 30V | 检查输入电压与降压限制,不反复重发设定 |
| 开输出后只有零点几 V | 先看是否仍处于软启动,再检查保护状态 |
| 面板按键失效 | 正常断开串口会话后解锁;异常断连可能需重插 |
| 输入不足、LVP 保护 | 欠压状态禁止输出,先处理供电 |
不要把命令 0xC0 当软重启。 实测它让 USB CDC 消失并进入 DFU,需要物理拔插恢复;设备没有可用的软重启命令。远程调试时,这个区别尤其重要。
手册附录:面板、预设、保护与升级


主界面显示输入电压、温度、运行状态、输出 V/A/W、累计 Wh/Ah、设定值、预设组、面板锁与 CV/CC 模式。六个按键配合滚轮调参:设置键选中数位,滚轮调整,在电压与电流间切换后保存。
M1~M6 六组预设各自保存电压和恒流设定。进入数据组页选中数位、调整、保存,即可在不同设备间切换;切换前仍要核对负载。
| 状态 | 含义 |
|---|---|
OK | 正常 |
OVP / OCP / OPP | 过压 / 过流 / 过功率 |
OTP / REP / LVP | 过热 / 反接 / 欠压 |
手册说明异常保护会关闭输出并蜂鸣。菜单可设置保护阈值、语言、界面风格、背光、音量与计量开关。

补充回读寄存器:0xC0 为输入电压,0xC3 为三项 float32 输出 V/A/W,0xDC 为保护状态,0xDD 为模式(0=CC、1=CV)。
官方 Windows 上位机可记录并缩放电压电流曲线,保存或删除记录;序列输出支持设定序号范围、循环、单步与暂停。电流扫描固定电压,电压扫描固定电流,都按步进与延时执行。


升级有两种入口:按住升级键插入数据线,或在上位机选择“固件升级 → BOOT/重启”。进入后电脑出现 U 盘,再拷入对应固件。它是专用升级流程,不是日常控制步骤。

想自己接着做
我使用的本地脚本封装了身份读取、全状态读取、设定与输出开关,只依赖 pyserial;本文没有提供这个脚本的公开下载。要复现协议,可从社区的 dps150_api 与 PROTOCOL.md 开始,先读状态,再做空载低压测试。
规格和七张图片来自 FNIRSI 产品页 与 官方说明书存档。社区协议说明与本机实测各有边界,不应把这一台 V1.6 的表现当成所有固件版本的保证。