⚡ Elettronica digitale · Guida 11

Livelli logici 3,3 V e 5 V e level shifter

Quando colleghiamo Arduino, ESP32, sensori e moduli digitali non basta verificare che usino tutti “0 e 1”. I dispositivi possono lavorare con tensioni logiche diverse e un livello perfettamente valido per un circuito può essere insufficiente o addirittura pericoloso per un altro. In questa guida vediamo soglie logiche, compatibilità 3,3 V/5 V e tecniche corrette di level shifting.

Livello: intermedio 3,3 V e 5 V VIH / VIL / VOH / VOL Level shifter

Cosa sono i livelli logici?

In un circuito digitale i valori 0 e 1 vengono rappresentati mediante intervalli di tensione. Non esiste quindi una sola tensione esatta per LOW e una sola tensione esatta per HIGH.

0 e 1 sono stati logici, non valori di tensione universali. Ogni famiglia logica e ogni dispositivo definiscono intervalli validi per gli ingressi e livelli garantiti per le uscite.

Per questo un’uscita da 3,3 V può essere perfettamente valida come HIGH per alcuni ingressi a 5 V, ma non per altri. La risposta corretta si trova sempre nelle specifiche elettriche del datasheet.

VIH, VIL, VOH e VOL

ParametroSignificato
VIL(max)Massima tensione garantita come ingresso LOW.
VIH(min)Minima tensione garantita come ingresso HIGH.
VOL(max)Massima tensione garantita dall’uscita quando produce LOW.
VOH(min)Minima tensione garantita dall’uscita quando produce HIGH.
LOW valido: VIN ≤ VIL(max)
HIGH valido: VIN ≥ VIH(min)
Tra VIL(max) e VIH(min) può esistere una zona indefinita. Una tensione in questa regione non è garantita né come 0 né come 1.

Margine di rumore

Per una comunicazione affidabile non basta che i livelli siano appena compatibili: è utile avere un certo margine tra ciò che l’uscita garantisce e ciò che l’ingresso richiede.

NMH = VOH(min) − VIH(min)
NML = VIL(max) − VOL(max)
Più grande è il margine di rumore, maggiore è la tolleranza ai disturbi.

3,3 V e 5 V sono automaticamente compatibili?

No. Dire che un dispositivo funziona a 3,3 V e un altro a 5 V non basta per stabilire la compatibilità logica. Bisogna controllare separatamente entrambe le direzioni della comunicazione.

3,3 → 5 V

Bisogna verificare se 3,3 V supera il VIH minimo dell’ingresso a 5 V.

5 → 3,3 V

Bisogna verificare se l’ingresso a 3,3 V tollera fisicamente 5 V.

GND comune

Per segnali single-ended serve normalmente un riferimento di massa comune.

Segnale da 3,3 V verso un ingresso a 5 V

Questa direzione può talvolta funzionare senza conversione, ma non va dato per scontato. Se il dispositivo a 5 V considera HIGH una tensione inferiore a 3,3 V, il collegamento può essere compatibile.

Esempio concettuale Se un ingresso a 5 V richiede VIH(min) = 2,0 V, un HIGH da 3,3 V è sufficiente. Se invece richiede VIH(min) = 3,5 V, 3,3 V non è garantito come HIGH.
La famiglia logica conta molto. Ingressi TTL-like e CMOS possono avere soglie molto diverse anche se entrambi sono alimentati a 5 V.

Segnale da 5 V verso un ingresso a 3,3 V

Questa è generalmente la direzione più delicata. Un GPIO a 3,3 V potrebbe non essere progettato per ricevere 5 V. Applicare una tensione superiore al limite assoluto può provocare correnti nei diodi di protezione interni o danneggiare il dispositivo.

“3,3 V” non significa automaticamente “5 V tolerant”. La tolleranza a 5 V deve essere dichiarata esplicitamente nella documentazione del pin o del dispositivo.

Se l’ingresso non è 5 V tolerant, bisogna ridurre o tradurre il livello prima di collegarlo.

Partitore resistivo: soluzione semplice per 5 V → 3,3 V

Per segnali unidirezionali relativamente lenti è possibile usare un partitore resistivo.

VOUT = VIN · R2 / (R1 + R2)
Esempio Vin = 5 V
R1 = 10 kΩ
R2 = 20 kΩ

Vout ≈ 5 × 20/(10+20) = 3,33 V.
Il partitore non è una soluzione universale. La capacità dell’ingresso e delle piste crea con le resistenze una costante di tempo che può rallentare i fronti; inoltre non è adatto a bus bidirezionali come I²C.

Level shifter bidirezionale con MOSFET

Una soluzione molto comune per bus open-drain/open-collector utilizza un piccolo MOSFET N-channel e due resistenze di pull-up, una verso la tensione bassa e una verso la tensione alta.

È particolarmente adatto a I²C. Il circuito permette ai due lati di portare la linea LOW e lascia che le rispettive pull-up ricreino il livello HIGH corretto.
Non tutti i moduli MOSFET economici sono adatti a qualsiasi protocollo. Velocità, capacità parassite, direzione del segnale e tipo di driver devono essere considerati.

Level translator integrati

Per segnali veloci, bus push-pull, molte linee o applicazioni più robuste si utilizzano spesso circuiti integrati dedicati alla traduzione dei livelli logici.

TipoQuando usarlo
Buffer/translator unidirezionaleDirezione nota e fissa.
Translator bidirezionale con DIRBus che cambia direzione sotto controllo.
Auto-direction sensingQuando l’integrato supporta il protocollo e il carico previsti.
Open-drain translatorI²C e linee cablate con pull-up.
Un translator dedicato è spesso preferibile nei progetti veloci o critici. Permette di ottenere fronti più controllati e specifiche elettriche meglio definite rispetto a soluzioni improvvisate.

I²C tra dispositivi a 3,3 V e 5 V

I²C utilizza normalmente uscite open-drain: i dispositivi portano la linea LOW, mentre le resistenze di pull-up generano il livello HIGH. Per questo la traduzione bidirezionale con MOSFET è molto diffusa.

SDA e SCL sono bidirezionali dal punto di vista elettrico. Un semplice partitore resistivo non è quindi la soluzione corretta per un bus I²C bidirezionale.

UART: RX e TX

UART utilizza normalmente due linee separate. Questo semplifica la conversione perché ogni linea è unidirezionale.

Arduino 5 V ↔ dispositivo 3,3 V TX Arduino → RX 3,3 V: può servire level shifting verso il basso.
TX 3,3 V → RX Arduino 5 V: può essere direttamente compatibile solo se 3,3 V soddisfa VIH(min) dell’ingresso.
Controllare sempre che si tratti davvero di UART TTL/CMOS. RS-232 usa livelli elettrici completamente diversi e richiede un transceiver dedicato.

SPI e level shifting

SPI utilizza segnali push-pull e può lavorare a frequenze elevate. Le linee tipiche sono SCK, MOSI, MISO e CS. La direzione di ciascuna linea è normalmente nota.

LineaDirezione tipica
SCKMaster → Slave
MOSIMaster → Slave
MISOSlave → Master
CSMaster → Slave
Per SPI veloce conviene usare translator adatti ai segnali push-pull. Il classico level shifter MOSFET pensato per I²C può introdurre fronti troppo lenti o comportarsi male ad alte frequenze.

Arduino 5 V ed ESP32 3,3 V

Questo è uno dei casi pratici più frequenti. Molte schede Arduino classiche utilizzano logica a 5 V, mentre ESP32 utilizza normalmente GPIO a 3,3 V.

Non portare direttamente un’uscita 5 V su un GPIO ESP32 salvo specifica tolleranza dichiarata per quel pin. La soluzione più prudente è usare una conversione di livello appropriata.
UART tra Arduino 5 V ed ESP32 Arduino TX → ESP32 RX: partitore o level shifter verso 3,3 V.
ESP32 TX → Arduino RX: verificare il VIH dell’Arduino; spesso 3,3 V può essere riconosciuto, ma va controllata la specifica del dispositivo.

Livelli logici 3,3 V e 5 V a confronto

Livelli logici 3,3 V e 5 V a confronto con soglie VIH VIL VOH VOL e margini di rumore
Confronto tra sistemi logici a 3,3 V e 5 V con soglie di ingresso e uscita, zone valide e margini di rumore.

Level shifter bidirezionale con MOSFET

Level shifter bidirezionale con MOSFET tra logica 3,3 V e 5 V
Schema di un level shifter bidirezionale con MOSFET N-channel e resistenze di pull-up sui lati a 3,3 V e 5 V, adatto soprattutto a bus open-drain come I²C.

Errori comuni

  • pensare che 3,3 V e 5 V siano sempre compatibili;
  • considerare 0 e 1 come tensioni fisse universali;
  • ignorare VIH e VIL;
  • collegare 5 V a un GPIO 3,3 V senza verificarne la tolleranza;
  • usare un partitore su un bus bidirezionale I²C;
  • usare un level shifter MOSFET lento su SPI ad alta velocità;
  • confondere tensione di alimentazione e soglie logiche;
  • dimenticare la massa comune tra circuiti single-ended;
  • credere che “5 V tolerant” significhi che il pin possa essere alimentato o pilotato in qualsiasi condizione;
  • ignorare pull-up già presenti sui moduli commerciali.