因為最近在開發 ErgoSNM v4 的核心板,但是手邊沒有可調直流電源供應器,所以想說來研究一下使用 USB PD(Power Delivery)來自己做一個看看。
現成
市面上已經有一些透過 USB PD 來供電的可調直流電源供應器,例如:
- MINIWARE MDP-P906(300W)
- FNIRSI DPS-150(150W)
- 正點原子 DP100(100W)
但我看不到這些商業化產品的內部是如何實現的,所以我需要找找 GitHub:
- CentyLab/PocketPD_HW: Hardware repo for PocketPD
- z4yx/USB-C-PPS: USB-PD charger as a programmable power supply.
- tobychui/PD-Adjustable-DC-Power-Supply: A DIY, USB PD powered, pocket sized adjustable DC / lab bench power supply for electronic makers
- wagiminator/ATtiny814-USB-PD-Adapter: USB Type-C Power Delivery Trigger and Monitoring Board
以 PocketPD 為例,它基本上就是一個 PD PPS(Programmable Power Supply)Sink,並直接向上游的 PD Source(即充電器)要求電壓和電流,這樣做有個好處就是不用實作複雜的電壓電流環控制器,通通交給上游的 PD Source 就好,壞處就是你要有支援 PD PPS 的充電器,且它要能夠提供符合你預期的電源。它所使用的關鍵零件如下:
RP2040 透過 I2C 控制 AP33772 來向 PD Source 協商電源,AP33772 有自帶電流感測但這裡沒用,AP33772 有帶 Gate driver 可以外接 FET 用來關斷 VBUS 但這裡沒用(而是靠 LM7310)。兩顆 LM3710 負責關斷電源路徑,由 RP2040 控制。INA226 透過一個 5mOhm 的 Shunt 來讀取電壓,透過 I2C 報給 RP2040,它有一個 ALERT pin 可用在故障時快速切斷 LM3710 但是這裡沒有這麼做。一個簡單的電阻分壓用來量測輸入電壓。
我的方案
可以的話儘可能滿足這些規格:
- 輸出規格:1.6V~20V, 5A, 60W
- Slew rate control
- Overvoltage protection(OVP)
- Undervoltage protection(UVP)
- Overcurrent protection(OCP)
- Short-circuit protection(SCP)
- Reverse current protection(RCP)
- Overpower protection(OPP)
- Overtemperature protection(OTP)
- Inrush current protection
- VBUS Discharge
MCU
MCU 如果有 USB 可以方便從電腦控制:
- RP2040:很便宜且規格很好,UF2 DFU 很方便,但是外圍電路偏複雜且要外接 Flash,GPIO 沒 5V-tolerant
- STM32C071G8U6:Cortex-M0+ 48MHz,QFN-28 的小型 MCU,基本外圍電路很簡單只需要 VDD 加兩個 MLCC 去耦電容,不用外接振盪器也可以用 USB 2.0 FS 12Mbps
- STM32F030C8T6:Cortex-M0 48MHz,LQFP-48。沒有 USB,但是很便宜。
但是因為考慮 PD 供電和電腦之間可能不共地,所有需要做隔離保護。最直接的方式應該是直接對要接電腦的 USB 做隔離,但是就算是 USB 2.0 12Mbps 的隔離 IC 也很貴,一個更便宜的方案是 USB 進來後先透過 USB-to-TTL 轉成 UART,再透過 UART 隔離 IC 接到 MCU,UART 隔離 IC 的價格比 USB 隔離 IC 便宜很多。如果是這樣的話那 MCU 就不用 USB PHY 了。如果需要單一通道的訊號隔離也可以透過光耦完成。
方案 A
首先最簡單的方案就是和 PocketPD 這些專案一樣,直接找個 PD Sink controller,把控制電壓電流甚至相關保護的事情都交給上游的 PD 變壓器,我們只需要負責送出協商命令即可。這樣的話基本上只需要一個 PD Sink controller 就可以了,但是畢竟目標是實驗用的電供,保護措施最好還是在前端加一下,我覺得至少 SCP 快速關斷可能要加。
找了一些看起來不錯的 PD Sink controller:
- AP33772:PocketPD 用的
- CH224:常見於所謂的平價 PD 誘騙器
- TPS25730:Sink only,無 PPS。有兩個版本,差別是有無內建的 Back-to-back FET。有 OVP 和 RCP
- TPS25751:DRP,有 PPS。有兩個版本,差別是有無內建的 Back-to-back FET。有 UVP、 OVP 和 RCP
- STUSB4500:Sink only
eFuse 可以用來提供快速的 SCP:
- TPS1663:有 SHDN pin 可以從外部關斷
- TPS2663:有 SHDN pin 可以從外部關斷。可以增加一個 N-FET 來和內部的 FET 組成 Back-to-back 來達成 RCP。Sink only 時 PP5V pin 可以接地 12。
在這個方案中,我會選擇 TPS25751 + TPS1663 的組合,RCP 由前者提供,後者就專心處理 SCP 即可,另外 TPS1663 有 SHDN pin 可以由 MCU 控制,可以可以打從電供上的 OUTPUT 按鈕功能。
這個方案的優點是簡單,因為真正的電壓電流控制都不是我們做,所以實際上的可用配置要看上游,而且也會要求上游 PD 要支援 PPS 功能。一個比較明顯的問題是可調電壓範圍,有些 PD PPS 變壓器的範圍是 5.0-20V,有些是 3.3-20V,但是 3.3V 的輸出電壓對我來說可能不夠低,我希望至少可以到 1.8V。
方案 B
由於方案 A 的電壓控制範圍完全看上游的供電控制能力,且低電壓不夠低,因此另一個方案就是由我們來控制電壓,為此我們需要一個高功率 DC/DC Converter。大部分的 Buck-boost Converter 都是直接用 Feedback 分壓電阻來控制輸出電壓,但是因為我們要可程式電壓,雖然也有利用數位電位器或 DAC 的方案,但是我還是找了有 I2C 的 IC。這些其實都是 PD PPS Source,且有內建一定的保護功能:
- MP4245
- MP8859
- TPS55288
- TPS55289
- RT6190
在這個方案中我會選擇 MP4245,因為它有明確的說到它有定電流(CC)模式,如果負載電流超過設定電流上限,則會開始控制並降低電壓,在 TI 的那兩個型號中對於 CC 的具體行為沒有更詳細的描述。
設計
最後我選擇了方案 B。PD Sink 使用 CH224 來向上游要求供電,透過一個用於 RCP 的 SS54 Schottky 連接到 MP4245,MC4245 會負責將電壓和電流控制在設定值,輸出直接接到連接器,就沒再加針對輸出的 RCP 了。MCU 使用 STM32F030C8T6,一組 UART 透過 ADuM1201AR 隔離 IC 可以用來連接電腦,沒加板載 USB-to-TTL IC 所有要外掛。MCU 的供電是從 CH224 之後的 VBUS 提供,透過 TPS5431 Buck 降壓到 3.3V,選它是因為很便宜。
如果想監控電壓和電流的話,MC4245 有 I2C Reg 可以讀。
對於 MC4245 可能的 FB 電阻組合:
- 10k / 90k: ratio=10.0,Vout 範圍 ≈ 1.00 ~ 16.380 V
- 6.2k / 80.6k: ratio=14.0,Vout 範圍 ≈ 1.40 ~ 22.932 V


大功率走線都直接鋪銅,但是這個線寬在 1oz 的 PCB 上跑 3A 其實還是不太夠。

雖然 PCB 是畫好了,但是我暫時沒有生產測試的打算,也不確定現在這個方案是不是真的可以運作,就先做個記錄,如果未來真的要做下去的話再分享。
GitHub repo: https://github.com/ziteh/pd-power-supply