C'è qualche cambio di livello bidirezionale 5v-3.3v?


27

Esiste un CI che interfaccia qualsiasi ingresso / uscita da 3,3 V a uscita / ingresso a 5 V? Ne ho bisogno principalmente per un Arduino Due, ma se ci fosse un IC bidirezionale che funziona così sarebbe fantastico.

Alcune persone mi hanno consigliato di utilizzare i circuiti integrati SN74AHC125 e CD4050, ma non capisco come funzionano o come interfacciarli.


2
Qual è la gamma di frequenza prevista?
alexan_e,

1
Ad esempio, suppongo di voler collegare un dispositivo 5V a un arduino 3.3V. Non sono riuscito a capire dove collegare l'uscita 5V e l'ingresso 3.3V. E che dire dell'uscita di un 3.3V da un arduino per esempio a un dispositivo 5V? Cosa intendi per gamma di frequenza?
3bdalla,

1
Non sono sicuro di aver capito il tuo punto, non ho mai affrontato le frequenze prima, il mio scopo è l'elettronica semplice: |
3bdalla,

3
sparkfun ha una scheda, si chiama "convertitore di livello"
geometrikal,

1
Di solito utilizzavo circuiti integrati di strumenti texas. Le serie TXS e TXB hanno traduttori di tensione bidirezionali (ad es. TXS0102 hanno due canali)
frarugi87

Risposte:


44

Un traduttore di livello bidirezionale molto semplice può essere creato con un singolo N-mosfet:

inserisci qui la descrizione dell'immagine

Il mosfet utilizzato dovrebbe essere un modello con una soglia Vgs bassa, in modo che possa avere un Rds-ON (resistenza ON) relativamente basso al livello di tensione di ingresso previsto (3,3 v in questo caso).
BSS138 in uno di questi esempi, ha un Vgs-th di 1,5 v max ed è specificato per avere una bassa resistenza di drain-source con tensioni Vgs fino a 2,5 v (forse anche leggermente inferiore).

L'esempio mostrato usa una traduzione 3.3v <-> 5v ma può anche funzionare con 2,5v <-> 3.3v o 2.5v <-> 5v, anche tra 2,5v <-> 12v. La gamma è limitata solo dalle caratteristiche del mosfet utilizzato.

Il circuito mostrato si basa su una nota applicativa del
cambio di livello bidirezionale NXP AN97055 per bus I2C e altri sistemi
Nuova versione più corta: AN10441 Tecniche di spostamento di livello nella progettazione bus I2C

Quando L1 è alto (3v3) o R1 fluttuante mantiene spento il mosfet, quindi R2 tira il lato di scarico in alto (a 5v).

Quando L1 viene abbassato, il mosfet si dirige e lo scarico diventa basso.

Quando un livello basso (0) viene applicato a H1, la tensione viene trasferita attraverso il diodo del substrato sul lato sorgente (L1)

Si noti che le dimensioni della resistenza possono influire sulla velocità ( sorgente dell'immagine )

inserisci qui la descrizione dell'immagine

Soluzione alternativa a transistor inserisci qui la descrizione dell'immagine


Articoli pertinenti che potresti trovare utili:


11

Poiché la domanda sembra orientata verso un circuito integrato che fornisce il cambio di livello bidirezionale, considerare la famiglia di componenti TXB010x di Texas Instruments: TXB0102 ha 2 canali, TXB0104 ha 4 canali e TXB0108 ha 8 canali.

La caratteristica distintiva di questa famiglia di circuiti integrati è che la direzione del segnale viene rilevata automaticamente, quindi non è necessario un pin di impostazione della direzione separato.

Le velocità di commutazione fino a 10 MHz funzionano in modo affidabile. La velocità massima teorica potrebbe essere più alta - i fogli dati non sono espliciti al riguardo da ciò che posso determinare.

Ho un TXB0108 che funziona tra un Launchpad MSP430 da 3,6 Volt e un Arduino Nano da 5 Volt, quindi il caso d'uso della domanda è coperto.

Allo scopo di provarlo, Adafruit offre un modulo precompilato che incorpora il TXB0108 , che consente di risparmiare il problema di saldare una parte SMD. Potrebbero esserci opzioni simili per 0102 e 0104 da loro o da altri.

Convertitore di livello logico bidirezionale a 8 canali - TXB0108

Se l'intento è di spostare di livello un segnale I2C , che non è ideale per i circuiti integrati della serie TXB, un'opzione che si rivolge in modo specifico alla resistenza di pull-up e alla topologia a collettore aperto di I2C è un modulo come questo , ancora venduto da Adafruit e altri fornitori.

Cambio di livello I2C

Questo modulo utilizza MOSSS BSS138 nel modo descritto nella risposta di alexan_e . Anche se non è un singolo circuito integrato come quello che la domanda richiede, forse soddisfa lo scopo previsto. In alternativa, è semplice costruire questo circuito da soli utilizzando MOSFET.


+1 Bella scoperta! ... Il tuo collegamento a TXB0102 è in realtà a TXS0102. Non ho determinato la differenza, ma questo è notato nel foglio dati del TXS0102: "Il suo uso principale dell'applicazione di destinazione è per l'interfaccia con i driver open-drain sugli I / O dei dati come I2C o 1-wire, dove i dati è bidirezionale e non è disponibile alcun segnale di controllo. TXS0102 può essere utilizzato anche in applicazioni in cui un driver push-pull è collegato agli I / O dei dati, ma TXB0102 potrebbe essere un'opzione migliore per tali applicazioni push-pull. " Ecco il link effettivo a TXB0102
Tut

@Tut Oops, errore, grazie. Le mie esigenze sono soddisfatte dal TXB0108, quindi le altre sono più "belle da conoscere" per me. :-)
Anindo Ghosh,

10

Un'altra cosa che dovresti considerare è se hai davvero bisogno di cambiare livello. Molti chip hanno pin di ingresso tolleranti a 5 V anche quando funzionano a una tensione inferiore come 3.3. La CPU atmega interpreta anche qualsiasi cosa al di sopra di 0,6 * Vcc o 3V per un arduino come un livello logico alto, quindi un segnale 3.3V può guidare direttamente un pin Arduino senza spostamento di livello.

Supponendo che tu stia utilizzando un arduino a 5 V e abbia bisogno di parlare con una parte a 3,3 V, se la parte ha input tolleranti a 5 V (molti lo fanno al giorno d'oggi), collegali e funzionerà. Se la tua linea bidirezionale è un design a collettore aperto, come i2c in cui i dispositivi abbassano solo la linea, collega semplicemente le resistenze di pull up a 3,3 V anziché 5 V e le cose funzioneranno.

Altrimenti tutto ciò che devi fare è assicurarti che la linea non superi i 3,3 V, puoi farlo con un resistore e uno zener, mettere un resistore sulla linea arduino quindi uno zener per fissare la tensione a 3,3 V. (fonte: repetae.net )morsetto del resistore zener

Potresti essere tentato di vivere pericolosamente e usare solo la resistenza da 10k e nient'altro. La ragione per cui questo (a volte!) Funziona è che c'è un diodo di serraggio all'interno del chip ricevente che devia la tensione in eccesso a Vcc o 3,3 V. Questo diodo si esaurirà se si tenta di tirare l'intera linea da 3,3 V fino a 5 V attraverso di essa (oltre a qualsiasi danno causato dall'estrazione di tale linea a 5 V), tuttavia con il resistore non scorrerà molta corrente e assumendo la linea da 3,3 V ha un carico non banale su di esso non cambierà sostanzialmente il livello della linea elettrica ma ci sono molti avvertimenti. Quindi, in generale, non farlo a meno che tu non abbia un bus locale 3.3V isolato e davvero non puoi risparmiare i due centesimi in più per lo zener. Lo dico solo perché lo vedrai negli schemi per schede di breakout economiche sporche che ottieni su eBay e potresti essere tentato di copiarlo, semplicemente non lasciare che passi di soppiatto oltre la breadboard in un progetto di produzione. :)

Modifica ha appena notato che stavi usando il nuovo arduino 3.3V, quindi inverti quello che ho detto sopra, il trucco della resistenza zener funzionerà comunque anche se apparentemente alcune delle linee di I / O sul dovuto potrebbero essere tolleranti 5v, sembra esserci un disaccordo sui forum. Teensy 3.1 è anche una bella scheda ARM che ha tutti i pin tolleranti a 5 V ed è meno della metà del costo dell'IMHO dovuto e meglio progettato http://www.pjrc.com/store/teensy31.html


3

Dal reparto di soluzioni economiche [er?], Il FET (dalla risposta accettata basata sulla nota NXP) può essere sostituito con un diodo BJT e Schottky come nei Silicon Labs AN883 . Il loro schema è un po 'complicato con altre cose, quindi ho estratto il bit essenziale qui e riorientato in modo che appaia nella risposta accettata per un facile confronto dei due schemi:

inserisci qui la descrizione dell'immagine

Il BJT traduce solo nella direzione bassa> alta ... esattamente come discusso nel cambio a singolo transistor . Schottky sostituisce il diodo corporeo del FET per la traduzione alta> bassa.

Di seguito è riportato il loro ingrandimento della misura dell'oscilloscopio per un traduttore 3,3 <-> 1,8 V; propongono anche questo schema per la traduzione 5 <-> 1.8V ecc. Quando si esegue una traduzione 3.3 <-> 1.8V, un MMBT3904 ha avuto un calo di soli 150mV (saturazione). Il diodo BAS40 aveva una caduta di 350 mV nella direzione opposta. Questi offset influenzano (ovviamente) l'uscita di livello logico basso sul lato basso e rispettivamente alto del traduttore.

inserisci qui la descrizione dell'immagine

Avevano simpatici dispositivi CMOS su entrambi i lati, quindi l'impedenza di ingresso non era un grosso problema. Non c'è stato alcun degrado / offset visibile dei margini logici nella loro traccia 1V / div, quindi non mi sono preoccupato di includerlo qui. L'impedenza di ingresso dei loro dispositivi era almeno 1Mohm da quello che posso dire da una simulazione. I margini logici elevati iniziano a degradare al di sotto dell'impedenza di ingresso di 100 K circa.

Inoltre, raccomandano questo traduttore basato su BJT solo fino a circa 300 KHz.

Non sono sicuro di quale di queste soluzioni sia più economica in pratica, FET o Schottky + BJT ... ma questa sicuramente ha bisogno di più parti ... a meno che non si usi uno di quei pacchetti diodo + transistor, che esistono, ad esempio PZMT1101 . Ma hai bisogno anche di 3 resistori.


Qual è il consumo di corrente / assorbimento di corrente atteso per questo metodo rispetto al metodo basato su FET?
KyranF,

@KyranF: Non li ho confrontati, ma se sei preoccupato per quello o non sarà roseo a causa dei pull-up. Le versioni CMOS a bassa potenza sembrano m.eet.com/media/1103155/Fig2.gif Questo è tratto da eetimes.com/document.asp?doc_id=1231111 che è un buon articolo che confronta vari approcci.
Fizz,

Grazie per i collegamenti. Sospetto che l'approccio BJT sarebbe molto potente rispetto ai tempi in cui la base è satura. Il carico costante di resistori di pull-up è davvero preoccupante per qualsiasi progetto, in particolare quelli a batteria.
KyranF,

@KyranF: L'ho visto in simulazione: il transistor e il diodo dissipano uW di potenza mentre i resistori dissipano mW. In realtà il BJT dissipa circa 100uW, il diodo 1uW. FET o BJT non contano qui ... i resistori che hanno un percorso verso terra per la dissipazione statica è ciò che conta. Questo è con impedenze di ingresso 1Meg.
Fizz,

@KyranF: Ho provato a utilizzare il modello BSS138LT1 di ON, ma questo dà una dissipazione di potenza media negativa in LTspice (di -63uW) ... quindi penso che il loro modello possa essere problematico. Immondizia dentro ... spazzatura fuori. Inoltre ha iniziato a oscillare (a una frequenza molto più alta del segnale) quando guidato dal lato alto. È un modello subckt piuttosto che un semplice modello MOS, quindi è difficile capire cosa sta succedendo. [continua]
Fizz il


2

Inoltre, se stai cercando un grande isolamento elettrico e una funzionalità di spostamento del livello bidirezionale, consiglierei ISO1541 . È abbastanza economico e offre una buona protezione attraverso l'isolamento.



1

La soluzione più semplice è far funzionare tutti i circuiti a 3.3V. I chip HC funzioneranno felicemente a quel livello.

Quando ciò non è possibile, puoi rendere le cose molto più semplici quando ti limiti a una direzione. Un chip HCT a 5 V accetterà bene i livelli di 3,3 V e un semplice divisore a due resistori può ridurre da 5 V a 3,3 V. Alcuni uC sono tolleranti a 5 V sui loro pin, quindi non è necessario il divisore. E se si inseriscono pullup a 5 V sui pin e si passa da terra a aperto (= input), si ha un'uscita passabile 0-5V.

Per accoppiare bus a collettore aperto (I2C, dallas 1-wire) il trucco BS138 è un modo per andare. Ci sono piccoli chip per I2C che mettono i due FET in un unico alloggiamento. (PCA9306 ecc.)

Ma se vuoi davvero la traduzione a livello di bi-drection: tali chip esistono, controlla ad esempio TXB0108.


-4

Una soluzione semplice sta usando SN74LVC244AN. Può essere alimentato con 3V3 ed è tollerante a 5V sugli ingressi.


5
Non è bidirezionale.
Matt Young,

No, ma il 74LVC4245 lo è.
Bregalad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.