# Anatomia di un PDO USB Power Delivery

> Come un caricatore USB-C dichiara cosa sa erogare: i 32 bit del Power Data Object, lo scaling dei campi, e la negoziazione sink↔source che porta dai 5 V iniziali al contratto di potenza.

Pubblicato: 2026-06-23
Aggiornato: 2026-08-25
Ambito: elettronica
Riferimento normativo: Anatomia di un PDO USB Power Delivery <https://www.usb.org/document-library/usb-power-delivery>
Repository: <https://github.com/stefanofante/USBPD-Stack>

Pagina: <https://www.stline.it/wiki/usb-pd-pdo/>

---

Quando colleghi un telefono a un caricatore USB-C, prima che scorra un solo milliampere oltre i 5 V di sicurezza i due dispositivi si parlano. Il caricatore dichiara cosa sa erogare, il dispositivo sceglie, e solo allora la tensione sale. Quella dichiarazione è una lista di **Power Data Object** (PDO): parole da 32 bit, ciascuna un profilo di alimentazione. Questo strumento le decodifica e le costruisce; questa pagina spiega come sono fatte.

## Cos'è un PDO

Un **Power Data Object** è una parola di 32 bit che descrive *un* modo in cui una sorgente può alimentare. Un caricatore non offre un solo profilo ma un elenco — i suoi *Source Capabilities* — tipicamente da uno a sette PDO: 5 V, 9 V, 15 V, 20 V, magari un profilo programmabile. Il dispositivo che riceve (il *sink*) legge l'elenco e chiede quello che gli serve.

La regola di base, fissata dalla specifica: il **primo PDO è sempre 5 V Fixed**, e i PDO Fixed successivi sono in tensione crescente. È ciò che garantisce che qualunque dispositivo, anche il più semplice, trovi sempre i 5 V da cui partire.

## I cinque tipi

I **bit 30–31** di ogni PDO ne dichiarano il tipo. Sono la prima cosa da leggere, perché determinano come interpretare tutti gli altri bit:

- **Fixed Supply** (`00`) — tensione fissa, corrente massima. È il profilo classico: "5 V fino a 3 A", "20 V fino a 5 A".
- **Battery** (`01`) — sorgente a batteria, espressa come intervallo di tensione e **potenza** massima.
- **Variable Supply** (`10`) — tensione variabile non regolata, espressa come intervallo di tensione e corrente massima.
- **Augmented PDO / APDO** (`11`) — i profili "intelligenti" introdotti dalle revisioni più recenti. Un ulteriore campo di sottotipo (bit 28–29) distingue:
  - **SPR PPS** — *Programmable Power Supply*: la tensione si regola con continuità in un intervallo, per la ricarica adattiva.
  - **EPR AVS** — *Adjustable Voltage Supply*: il profilo ad alta potenza (oltre 100 W) della Extended Power Range.

## Lo scaling dei campi: le unità di misura

Qui sta l'errore più comune nel leggere un PDO a mano. I campi non contengono volt e ampere: contengono **numeri interi**, e ogni tipo di PDO usa un fattore di scala diverso. Sbagliare il fattore significa leggere "5 V" dove ci sono "10 V".

Per i PDO **Fixed, Variable e Battery**:

$$
\begin{array}{lcl}
\text{Tensione: } 50\,\text{mV/unità} & \rightarrow & \text{valore}\times 0{,}05 = \text{V} \\[4pt]
\text{Corrente: } 10\,\text{mA/unità} & \rightarrow & \text{valore}\times 0{,}01 = \text{A} \\[4pt]
\text{Potenza: } 250\,\text{mW/unità} & \rightarrow & \text{valore}\times 0{,}25 = \text{W} \quad (\text{solo Battery})
\end{array}
$$

Un PDO Fixed da 5 V / 3 A porta quindi nel campo tensione il numero **100** (100 × 50 mV = 5 V) e nel campo corrente **300** (300 × 10 mA = 3 A).

Per gli **APDO** (PPS e AVS) lo scaling **cambia**, ed è il secondo inciampo classico:

$$
\begin{array}{lcl}
\text{Tensione: } 100\,\text{mV/unità} & \rightarrow & \text{valore}\times 0{,}1 = \text{V} \\[4pt]
\text{Corrente: } 50\,\text{mA/unità} & \rightarrow & \text{valore}\times 0{,}05 = \text{A}
\end{array}
$$

Stesso bit, significato diverso a seconda del tipo: è il motivo per cui un decoder deve sempre leggere *prima* i bit 30–31, e solo dopo interpretare il resto.

## La struttura bit per bit

Lo strumento mostra, per ogni PDO, una mappa dei 32 bit con i campi evidenziati. Il Fixed PDO è quello che si incontra più spesso, e la sua mappa **completa** è qui sotto — tutti e trentadue i bit attribuiti, senza buchi:

| Bit | Campo | Significato |
|---|---|---|
| 31–30 | PDO type | `00` = Fixed |
| 29 | Dual-Role Power | può sia erogare sia ricevere |
| 28 | USB Suspend Supported | rispetta la sospensione USB |
| 27 | Unconstrained Power | alimentazione non limitata (rete) |
| 26 | USB Comms Capable | sa parlare USB, non solo alimentare |
| 25 | Dual-Role Data | può essere host o device |
| 24 | Unchunked Ext Msg | messaggi estesi senza chunking |
| 23 | EPR Mode Capable | sa entrare in modalità EPR |
| 22 | Reserved | deve essere 0 |
| 21–20 | **Peak Current** | **sovracorrente ammessa — vedi sotto** |
| 19–10 | Voltage | 50 mV/unità |
| 9–0 | Max Current | 10 mA/unità |

Gli otto bit di flag (29–22) comunicano le capacità del dispositivo, non un profilo di alimentazione: descrivono *chi* è il dispositivo. Vanno letti solo sul **primo** Fixed PDO della lista, dove per specifica sono significativi; nei PDO successivi sono ignorati.

### I bit che si dimenticano: il Peak Current

I due bit **21–20** sono quelli che le descrizioni sommarie saltano, e dicono una cosa che a un progettista serve: quanta **sovracorrente istantanea** la sorgente ammette oltre la corrente massima dichiarata, e per quanto.

| Codice | Sovracorrente ammessa |
|---|---|
| 00 | 100 % |
| 01 | 110 % / 130 % / 150 % |
| 10 | 125 % / 150 % / 200 % |
| 11 | 150 % / 175 % / 200 % |

I tre valori di ogni riga corrispondono a tre finestre temporali diverse (dall'impulso brevissimo al sovraccarico prolungato). Il significato pratico è che un PDO da 3 A con codice `11` tollera picchi fino a 6 A per intervalli brevi: informazione decisiva per dimensionare il condensatore di ingresso di un sink, o per capire perché un caricatore «da 3 A» non protesta a 4,5 A. Con codice `00` non c'è alcun margine, e il limite dichiarato è il limite vero.

### Un esempio di decodifica

Prendiamo il valore `0x0002D12C`. I bit 30–31 valgono `00` → è un **Fixed PDO**. Il campo tensione (bit 19–10) contiene 180: 180 × 50 mV = **9 V**. Il campo corrente (bit 9–0) contiene 300: 300 × 10 mA = **3 A**. Il PDO dichiara quindi “9 V fino a 3 A”. Costruirlo è l'operazione inversa: 9 V / 50 mV = 180 nel campo tensione, 3 A / 10 mA = 300 nel campo corrente, tipo `00`.

## PPS ed EPR: due estensioni diverse

Le due sigle si confondono spesso, ma rispondono a esigenze opposte.

**PPS** (*Programmable Power Supply*, dalla USB-PD 3.0) serve a regolare la tensione **con precisione e con continuità** entro un intervallo, in genere sotto i 21 V. È pensato per la ricarica adattiva: il caricatore segue la curva di carica della batteria invece di imporre gradini fissi. Un dettaglio che genera confusione: la regolazione runtime avviene a passi di **20 mV**, ma i *limiti* dell'intervallo nel PDO sono codificati a passi di **100 mV**. Sono due cose diverse — la granularità con cui si regola, e la risoluzione con cui si dichiarano gli estremi.

**EPR** (*Extended Power Range*, dalla USB-PD 3.1) serve invece ad **andare oltre i 100 W**, fino a 240 W, introducendo tensioni Fixed a 28, 36 e 48 V e il profilo **AVS**. Nell'AVS la corrente non è fissa: varia con la tensione, perché il vincolo è la potenza. Per questo lo strumento, per i profili AVS, mostra la **potenza** invece di una corrente massima — riflette il modo in cui la sorgente effettivamente ragiona.

### I due layout APDO non si somigliano

Dire che «per gli APDO lo scaling cambia» copre le unità, ma non basta: PPS e AVS hanno **confini di campo completamente diversi**, e usare il layout dell'uno sull'altro produce numeri plausibili e sbagliati.

| Bit | SPR PPS (sottotipo 00) | EPR AVS (sottotipo 01) |
|---|---|---|
| 31–30 | PDO type = `11` | PDO type = `11` |
| 29–28 | sottotipo = `00` | sottotipo = `01` |
| 27 | PPS Power Limited | Peak Current |
| 27–26 | — | Peak Current |
| 26–25 | Reserved | — |
| 25–20 | — | Reserved |
| 24–17 | Max Voltage (100 mV/u) | — |
| 19–10 | — | Max Voltage (100 mV/u) |
| 16 | Reserved | — |
| 15–8 | Min Voltage (100 mV/u) | — |
| 9 | — | Reserved |
| 8–0 | — | PDP (1 W/u) |
| 7 | Reserved | — |
| 6–0 | Max Current (50 mA/u) | — |

Due asimmetrie. L'AVS non codifica una tensione minima: il minimo è fissato dalla specifica a **15 V** e non compare nei bit — uno strumento deve saperlo, perché non c'è nessun campo da leggere. E l'AVS non porta una corrente ma la **PDP** (Power Delivery Power) in watt: coerentemente, la corrente ammessa varia con la tensione scelta.

### I sottotipi riservati

Il campo sottotipo è di **due** bit, quindi ha quattro valori possibili, ma la R3.1 ne definisce due: `00` SPR PPS e `01` EPR AVS. I valori `10` e `11` sono **riservati**.

Uno strumento ha due modi di comportarsi davanti a un sottotipo riservato, e uno solo è corretto: può rifiutare il PDO, oppure decodificarlo *best-effort* con il layout più vicino — ma in questo secondo caso deve dichiarare nella mappa dei bit il valore **vero** del campo, marcandolo come riservato. Mostrare `01 (EPR AVS)` su bit che valgono `10` sarebbe mentire sui bit, che è esattamente ciò che un decoder non deve fare. Questo strumento decodifica best-effort e segnala il campo come *Reserved*.

### Quanto ci sta in un campo

I campi hanno un numero fisso di bit, quindi un tetto:

| Campo | Bit | Passo | Valore massimo esprimibile |
|---|---|---|---|
| Fixed — tensione | 10 | 50 mV | 51,15 V |
| Fixed — corrente | 10 | 10 mA | 10,23 A |
| Battery — potenza | 10 | 250 mW | 255,75 W |
| PPS — tensione | 8 | 100 mV | 25,5 V |
| PPS — corrente | 7 | 50 mA | 6,35 A |
| AVS — tensione | 10 | 100 mV | 102,3 V |
| AVS — PDP | 9 | 1 W | 511 W |

Il tetto della tensione Fixed — **51,15 V** — è comodamente sopra i 48 V dell'EPR, mentre quello della corrente, **10,23 A**, è il motivo per cui oltre i 5 A si sale in tensione e non in corrente. Il campo corrente del PPS è il più stretto di tutti (7 bit, massimo 6,35 A): PPS ed EPR non sono estensioni sovrapponibili, e questo è uno dei punti in cui si vede.

## La negoziazione: dal PDO all'RDO

Decodificare la lista è solo metà del lavoro. La parte viva del protocollo è la **negoziazione**: il sink esamina i PDO offerti e ne sceglie uno, costruendo un **Request Data Object** (RDO) che rimanda alla sorgente. L'RDO non contiene una tensione: contiene la **posizione** del PDO scelto nell'elenco (l'*Object Position*, da 1 a 13 in EPR) più la corrente operativa e massima richieste.

La logica di selezione segue una priorità: un match esatto su un PDO Fixed ha la precedenza, poi i profili programmabili (PPS/AVS) quando la tensione cade nel loro intervallo, infine i fallback. Se nessun profilo soddisfa la richiesta, il sink resta sui 5 V di sicurezza. Lo strumento, in modalità negoziazione, mostra quale PDO verrebbe scelto e perché, e costruisce l'RDO corrispondente.

## I limiti di questo strumento

È uno strumento didattico e di lavoro, non un validatore di conformità. Decodifica e codifica PDO e RDO secondo lo scaling della specifica, ma **non** verifica i CRC dei pacchetti, **non** simula il livello fisico del protocollo (BMC, messaggi di controllo, timer), e copre i tipi di PDO d'uso comune — non ogni caso particolare delle revisioni più recenti. I valori che produce sono corretti al bit per la struttura del PDO; per una verifica di conformità reale servono un analizzatore di protocollo e la specifica ufficiale.

## Riferimenti

- **USB Implementers Forum (USB-IF)** — [usb.org](https://www.usb.org), ente che pubblica e mantiene la specifica.
- **USB Power Delivery Specification** — il documento normativo (revisioni 3.1 / 3.2), disponibile nell'area documenti di [usb.org/documents](https://www.usb.org/documents).
- **USBPD-Stack** — il nostro stack USB Power Delivery open source per il controller PTN5110, che implementa la decodifica e la negoziazione descritte qui: [github.com/stefanofante/USBPD-Stack](https://github.com/stefanofante/USBPD-Stack).
- **Strumento correlato** — il [decoder/encoder PDO](/tools/usb-pd-decoder/) mette in pratica tutto questo: incolla un PDO e vedi i campi, o costruiscilo dai valori.
