外觀
FNIRSI DPS-150:便攜數控電源,從官方規格到序列埠直控

巴掌大的 FNIRSI DPS-150 數控電源(0~30V / 0~5A / 150W),官方只給 Windows 上位機。 社群已把它的 USB 序列埠協議完整逆向,一行 pyserial 就能讀遙測、設電壓電流、開關輸出。 本文前半整理官方手冊的規格與介面(含實物圖),後半是實測逆向與踩坑(DPS-150P / 韌體 V1.6),程式碼已固化成
tool/dps150.py。
官方資料
規格速查(官方手冊)
| 專案 | 值 | 專案 | 值 |
|---|---|---|---|
| 型號 / 螢幕 | DPS-150 · 2.8 寸 320×240 | 輸出電壓 / 電流 / 功率 | 0~30V / 0~5A / 0~150W |
| 輸入電壓 / 電流 | DC 5.0~32V / 100mA~5A(支援 PD / QC 快充,可用充電寶) | 滿載效率 | 高(手冊標稱,詳見 PDF) |
| 設定解析度 | 電壓 10mV · 電流 1mA | 設定精度 | 電壓 ≤0.1%±5mV · 電流 ≤0.1%±3mA |
| 回讀精度 | 輸入電壓 ≤0.2%±5mV · 輸出電壓 ≤0.1%±10mV | 負載調整率 | 0.49% |
手冊裡叫 DPS-150,實機型號是 DPS-150P(本文全程按實機型號寫)。
面板與主介面

正面是 2.8 寸屏 + 六個按鍵(滾輪可左右滑動調參):

主介面資訊量很足(對應手冊序號):輸入電壓、內部溫度、執行狀態、當前 V/A/W 與累計能量(Wh/Ah)、設定電壓(0.01V 步進)、設定電流(0.001A 步進)、預設組編號、控制面板鎖定狀態、輸出模式。
工作狀態有七類,除 OK 外檢測到任一異常都會自動關閉輸出 + 蜂鳴器報警:
| 狀態 | 含義 |
|---|---|
OVP / OCP / OPP | 過壓 / 過流 / 過功率保護 |
OTP | 過熱保護 |
REP | 反接保護 |
LVP | 欠壓保護(此狀態下禁止開啟輸出) |
預設組:裝置支援 6 組(M1~M6)預設輸出,每組都包含獨立的電壓設定與恆流設定,短按即可切換——多裝置交替供電時很實用。
輸出模式:恆壓 CV / 恆流 CC 兩種。
操作要點
- 調參:單擊設定鍵進入高亮位,滾輪左右滑動調整;再次單擊在電壓/電流設定間切換,短按儲存退出
- 選單項(電源設定 / 系統設定 / 關於):過壓/過流/過功率/過溫/欠壓保護的閾值都可單獨設,另有語言、常規↔工業風介面、背光亮度、音量、計量開關
- 預設組儲存:進入資料組頁 → 單擊出高亮位 → 滾輪調整 → 短按儲存
- ⚠️ 連上位機後控制面板自動鎖定(鎖圖示變白),斷開序列埠會話才解鎖——我們後面寫的控制工具也會觸發這個行為

上位機自帶的高階功能
官方 Windows 上位機除了基礎監控/波形記錄(電壓電流曲線可滾輪縮放、可儲存刪除),還有三塊"按程式跑輸出"的高階功能:
| 功能 | 幹什麼 |
|---|---|
| 序列輸出 | 按序號範圍和迴圈次數,定時依次輸出設定好的 V/I;支援手動單步、暫停/繼續 |
| 電流掃描 | 電壓固定,電流在起止範圍內按"步進電流 + 延時"掃描輸出(恆流模式常用) |
| 電壓掃描 | 電流固定,電壓在起止範圍內按"步進電壓 + 延時"掃描輸出(恆壓模式常用) |


韌體升級(兩條路)
- U 盤法:按住升級鍵插資料線,電腦彈出 U 盤,把韌體拷進去,裝置自動升級
- 上位機法:聯機後點「韌體升級 → BOOT/重啟」,同樣彈 U 盤複製韌體

⚠️ 注意:韌體升級走的是 DFU 模式。別把它和我們序列埠協議裡的
0xC0混淆——那是"進 DFU"的命令位元組,發錯會直接丟序列埠(見文末危險位元組)。
裝置識別
走 Micro-USB 資料口,列舉為 USB CDC 虛擬序列埠(內部主控是 Artery AT32):
bash
system_profiler SPUSBDataType | grep -A6 "AT32 Virtual Com Port" # 识别设备
ls /dev/cu.usbmodem* # 串口设备节点協議全景(社群逆向)
幀結構極簡——頭 1 位元組 + 命令 + 暫存器 + 長度 + 資料 + 校驗和:
| 0xF1 | 命令 | 暫存器 | 長度 | 資料 (0..N) | 校驗和 |
|---|---|---|---|---|---|
| Header | Cmd | Reg | Len | Data… | Sum |
校驗和 =
(寄存器 + 长度 + Σ数据) & 0xFF(頭與命令不參與);裝置回包頭0xF0;數值一律 IEEE754 float32 小端。
命令位元組:
| 命令 | 用途 |
|---|---|
0xA1 | 讀暫存器 |
0xB1 | 寫暫存器 |
0xB0 | 設波特率 |
0xC1 | 會話連線/斷開 |
0xC0 | ⚠️ 進 DFU 刷機模式——禁發(CDC 消失,需拔插恢復) |
關鍵暫存器:
| 暫存器 | 型別 | 含義 |
|---|---|---|
0xC1 | float32 | 電壓設定 |
0xC2 | float32 | 電流設定 |
0xDB | uint8 | 輸出開關(0/1) |
0xC0 | float32 | 輸入電壓 |
0xC3 | 3×float32 | 實測輸出 V/A/W |
0xDC | uint8 | 保護狀態(0=OK,1=OVP…6=REP) |
0xDD | uint8 | 0=CC / 1=CV |
0xFF | 139B | 全狀態 dump(含 6 組預設、保護閾值、Ah/Wh) |
控制閉環實測
一條命令設定並開啟輸出,軟啟動約 1.5 s 爬升到位:
| 能力 | 實測 |
|---|---|
| 讀型號/韌體/硬體 | DPS-150P · V1.6 · V1.0 |
| 讀遙測 | 輸入 20.08V、溫度 30.5°C、輸出 V/A/W 全狀態 139 位元組 |
| 寫設定 | 5.000V / 0.500A,回讀一致 |
| 開關輸出 | 開 → 5.000V(軟啟動 ~1.5s);關 → 洩放 ~1.2s 歸零 |
常用操作:
bash
python3 tool/dps150.py status # 读全状态
python3 tool/dps150.py set --voltage 12.0 --current 2.0 # 设 12V/2A(不开启)
python3 tool/dps150.py set --on # 开输出
python3 tool/dps150.py set --off # 关输出踩坑檔案
| 現象 | 根因 | 解決 |
|---|---|---|
| 讀暫存器欄位錯亂、只回 12 位元組 | 裝置主動推送遙測幀(0xC3 等)混進響應流 | 讀回按暫存器號過濾,丟棄非目標幀 |
| 單獨讀 0xE2/0xE3 返回 0 | 能力暫存器只在推送幀裡有值 | 從全狀態 dump 的 0x6F/0x73 偏移取 max V/I |
| 設 30V 設不上去 | 降壓架構:輸出上限鉗到輸入電壓以下(20V 輸入 → 19.88V max) | 想高輸出先提高輸入電壓 |
| 開輸出立刻讀電壓只有零點幾 V | 軟啟動爬升中 | 等待 ≥1.5s 再讀 |
| 面板按鍵失效 | 連上位機後自動鎖面板 | 斷開序列埠會話即解鎖 |
一個危險位元組
0xC0 不是重啟,是進 DFU 刷機模式:USB CDC 埠直接消失,必須物理拔插恢復。裝置沒有軟重啟命令。
復現與出處
- 控制工具:skill
fnirsi-dps150的tool/dps150.py(僅依賴 pyserial) - 協議出處:社群逆向 nasheed-x/dps150_api(PROTOCOL.md,交叉驗證 JS/C/Python/Rust 四份實現 + 反編譯官方 .NET 上位機)
- 官方資料:FNIRSI 官方產品頁 · 官方說明書 PDF(本文規格/介面圖均出自該手冊,已存檔本站)
- 完整暫存器表、139 位元組佈局、預設組公式見 skill
fnirsi-dps150參考文件