PMBus 系列約 5 分鐘

PMBus 數值格式深度解析:Linear、VID 與 Direct Mode 完整比較

PMBus 三大數值格式一次搞懂:LINEAR11 / LINEAR16 的指數與尾數、VID 模式的 Intel VR12 / VR12.5 與 AMD SVI2 碼表公式、Direct 模式的 m、b、R 係數換算與 COEFFICIENTS (30h),附格式選擇指南與 MCU 整數運算注意事項。

📘 參考規格書PMBus · PMBus Power System Management Protocol Specification Part II原廠文件 ↗

一頁速覽:三大格式對照表

格式主要應用主控端運算負擔特點
Linear通用電源、CRPS 伺服器電源、POL 晶片低(位移與整數乘法)最普遍、最簡單。指數與尾數組成,解析度由指數決定
VIDCPU / GPU 供電(Intel VR12 / VR12.5 / VR13、AMD)低(查表或固定步階)為動態調壓設計,電壓有固定步階,只用於輸出電壓相關命令
DirectHot-Swap 控制器、電源監控 IC中高(需處理 m、b、R 係數)能充分利用 ADC 解析度,但主控端要維護每個命令的係數

想知道某個命令用哪種格式,可以用 QUERY (1Ah) 查詢:回應的 b[4:2] 為 000b 是 Linear、011b 是 Direct、101b 是 VID。

1. Linear Mode(線性模式)

Linear 是 PMBus 最常用、最核心的格式,又分為 LINEAR11(一般物理量)和 LINEAR16(輸出電壓專用)。

A. LINEAR11

用於 READ_VIN、READ_IIN、READ_TEMPERATURE_1、READ_POUT 等一般量測命令。

  • 資料長度:2 Bytes
  • b[15:11]:指數 N,5 位元二補數
  • b[10:0]:尾數 Y,11 位元二補數
X=Y×2NX = Y \times 2^{N}

範例:READ_VIN (88h) 回傳 F0A0h

  1. N = b[15:11] = 11110b → −2
  2. Y = b[10:0] = 000 1010 0000b → +160
  3. VIN=160×2−2=40.0 VV_{\text{IN}} = 160 \times 2^{-2} = 40.0\ \text{V}

完整解析(負數處理、常見錯誤、C 語言編解碼):LINEAR11 格式與 READ_* 量測讀取

B. LINEAR16

專用於輸出電壓相關命令(VOUT_COMMAND、READ_VOUT、VOUT_MAX、VOUT_MARGIN_HIGH/LOW 等)。

  • 資料長度:2 Bytes,整個 16 位元都是尾數(無號數)
  • 指數 N 不在資料裡,而是在 VOUT_MODE (20h) 的 b[4:0](5 位元二補數)
VOUT=Vvalue×2NV_{\text{OUT}} = V_{\text{value}} \times 2^{N}

範例:VOUT_MODE 的 N = −9(2−9=15122^{-9} = \tfrac{1}{512}),READ_VOUT 讀到 1800h(6144):

VOUT=6144×2−9=6144512=12.00 VV_{\text{OUT}} = 6144 \times 2^{-9} = \frac{6144}{512} = 12.00\ \text{V}

完整解析(指數解析度速查、C 語言換算):VOUT_MODE (20h) + VOUT_COMMAND (21h) 與 LINEAR16 格式

2. VID Mode(Voltage Identification)

VID 格式是為 **CPU / GPU 供電(VRM)**設計的,輸出電壓用一個 VID 碼表示,對應到固定的電壓步階。

  • 啟用條件:VOUT_MODE (20h) 的 b[7:5] = 001b,b[4:0] 指定使用哪一種 VID 碼表
  • 作用範圍:只影響輸出電壓相關命令,例如 VOUT_COMMAND 寫入的是 VID 碼而不是電壓值

常見 VID 碼表

規範步階換算公式(VID ≠ 0)VID = 0
Intel VR125 mVV=0.25+(VID−1)×0.005V = 0.25 + (\text{VID} - 1) \times 0.005輸出關閉
Intel VR12.510 mVV=0.50+(VID−1)×0.010V = 0.50 + (\text{VID} - 1) \times 0.010輸出關閉
AMD SVI26.25 mVV=1.55−VID×0.00625V = 1.55 - \text{VID} \times 0.00625(遞減)1.55 V

例如 VR12 的 VID = 65h(101):V=0.25+100×0.005=0.75 VV = 0.25 + 100 \times 0.005 = 0.75\ \text{V}。

Intel VR13 依操作模式有 5 mV 與 10 mV 兩種步階,實際碼表請以 VR 規範和控制器規格書為準。

3. Direct Mode(直接模式)

Direct 格式常見於 Hot-Swap 控制器與電源監控 IC(例如 ADM1275、LM25066)。數值直接對應 ADC 的量測結果,再用直線方程式的係數換算成物理量。

  • 啟用條件:VOUT_MODE (20h) 的 b[7:5] = 010b(輸出電壓相關命令),或規格書指定該命令使用 Direct 格式

換算公式

符號意義型別
X實際物理量(V、A、W、°C)—
Y匯流排上傳送的數值16 位元二補數
m斜率(Slope)16 位元二補數
b偏移(Offset)16 位元二補數
R十進位縮放指數(Exponent)8 位元二補數

換算範例(假設係數)

假設某電壓命令的係數為 m = 8、b = 0、R = 2,讀到 Y = 2580h(9600):

X=18(9600×10−2−0)=968=12.0 VX = \frac{1}{8}\left(9600 \times 10^{-2} - 0\right) = \frac{96}{8} = 12.0\ \text{V}

這裡的係數只是示範用,實際係數依晶片與命令而不同,同一顆晶片的電壓、電流、功率命令通常各有一組係數。

係數從哪裡來

mm、bb、RR 不會跟著資料一起傳送,取得方式有兩種:

  1. 產品規格書:大多數晶片直接在規格書列出每個命令的係數表。
  2. COEFFICIENTS (30h):用 Block Write-Block Read Process Call 查詢,寫入要查的命令碼與「讀取用 / 寫入用」旗標,讀回 5 Bytes:m(2 Bytes)、b(2 Bytes)、R(1 Byte)。這個命令是選配的,不是每顆晶片都支援。

C 語言:Direct 整數換算

#include <stdint.h>

static int64_t pow10_i64(int e)
{
    int64_t p = 1;
    while (e-- > 0)
        p *= 10;
    return p;
}

/* 有號整數除法,四捨五入(遠離 0) */
static int64_t div_round(int64_t num, int64_t den)
{
    if (den < 0) {
        num = -num;
        den = -den;
    }
    return (num >= 0 ? num + den / 2 : num - den / 2) / den;
}

/* Direct → 千分之一單位:X = (Y * 10^-R - b) / m */
int64_t direct_to_milli(int16_t y, int16_t m, int16_t b, int8_t r)
{
    if (r >= 0) {
        int64_t p = pow10_i64(r);
        return div_round((int64_t)y * 1000 - (int64_t)b * 1000 * p, (int64_t)m * p);
    }
    return div_round(((int64_t)y * pow10_i64(-r) - b) * 1000, m);
}

direct_to_milli(9600, 8, 0, 2) 回傳 12000(12.0 V)。

實務選擇指南

flowchart TD
    S["這個電源 / 晶片用哪種格式?"] --> A["CRPS / 通用電源 / POL"]
    S --> B["CPU / GPU 供電(VRM)"]
    S --> C["Hot-Swap / 電源監控 IC"]
    A --> L["Linear<br>VOUT 用 LINEAR16,其他用 LINEAR11"]
    B --> V["VID(輸出電壓)<br>其他量測通常仍是 Linear"]
    C --> D["Direct<br>需要 m、b、R 係數"]

結論

  • Linear:最普遍。LINEAR11 的指數在資料內,LINEAR16 的指數在 VOUT_MODE。
  • VID:用 VID 碼表示輸出電壓,各規範的公式不同,要確認 VOUT_MODE 指定的碼表。
  • Direct:X=1m(Y×10−R−b)X = \frac{1}{m}(Y \times 10^{-R} - b),係數從規格書或 COEFFICIENTS (30h) 取得。
  • 不確定格式時,用 QUERY (1Ah) 查詢,或讀 VOUT_MODE 確認輸出電壓的格式。

延伸閱讀: