Skip to content

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

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)校驗和
HeaderCmdRegLenData…Sum

校驗和 = (寄存器 + 长度 + Σ数据) & 0xFF(頭與命令不參與);裝置回包頭 0xF0;數值一律 IEEE754 float32 小端。

命令位元組:

命令用途
0xA1讀暫存器
0xB1寫暫存器
0xB0設波特率
0xC1會話連線/斷開
0xC0⚠️ 進 DFU 刷機模式——禁發(CDC 消失,需拔插恢復)

關鍵暫存器:

暫存器型別含義
0xC1float32電壓設定
0xC2float32電流設定
0xDBuint8輸出開關(0/1)
0xC0float32輸入電壓
0xC33×float32實測輸出 V/A/W
0xDCuint8保護狀態(0=OK,1=OVP…6=REP)
0xDDuint80=CC / 1=CV
0xFF139B全狀態 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 參考文件
這篇裡有不清楚的地方,或者想聊類似的東西?私訊我 →