Tutorials - Elettronica

 

 

Bus open collector


Una configurazione comune che permette una trasmissione di dati seriali su una sola linea fisica è quella detta open collector.

Come dice il nome, vari dispositivi sono "appesi" alla linea del bus attraverso transistor NPN in configurazione a collettore aperto (open collector) o con transistor MOSFET nell' equivalente open drain.

Su una stessa linea possono essere collegati teoricamente un numero illimitato di dispositivi.

La linea è mantenuta a livello alto da una resistenza di pull-up. Questa, per migliorare le prestazioni in velocità di commutazione potrà essere sostituita con vantaggio da un generatore di corrente.

Poiché la resistenza di pull-up è esterna ai dispositivi, dal punto di vista teorico non è necessario che la V+ sia quella di alimentazione dei chip: basta che non sia superiore alla tensione commutabile da parte degli switches. In generale, però si tenderà ad utilizzare spesso proprio la tensione di alimentazione (Vdd) dei semiconduttori, per ragioni di comodità, dato che, ad esempio, in un microcontroller si utilizzeranno i GPIO interni configurabili come open drain.
Comunque è anche diffuso l' impiego di tensioni più elevate dei classici 5V, quando gli switches possono commutare queste tensioni, ad esempio 12 V.

Un altro vantaggio di questa configurazione è che, essendo la corrente sul bus indipendente dal numero delle unità collegate, per inserirne una nuova basterà semplicemente "appenderla" al bus.

I semiconduttori sono utilizzati essenzialmente come interruttori che passano dal blocco completo alla saturazione.

Le unità trasmittenti sono dotate dei transistor-switch che, chiusi, mandano a livello basso la linea.

Però ogni unità potrà avere anche un gate di ricezione: la sua presenza, essendo un ingresso ad elevata impedenza, non influenza lo stato impostato sul bus dagli switches o dal pull-up.

Si tratta quindi di un sistema di trasmissione e ricezione su una unica linea fisica.

Sappiamo che le cifre del sistema binario sono solo due : 0 e 1 e che esse corrispondono, nel circuito elettrico equivalente, a due livelli di tensione ben determinati:

0 1
basso alto
Gnd Vcc
Vss Vdd

In effetti, per motivi costruttivi, si avrà questa equivalenza:

0 1
"quasi" Gnd "quasi" Vcc

che, in forma grafica, possiamo rappresentare così:

  • VIL — la massima tensione su un pin di ingresso che verrà letta come un basso logico. 
  • VIH — la minima tensione su un pin di ingresso che verrà letta come un alto logico. 
  • Forbidden region — la regione "indeterminata" tra il livello di tensione VIL e VIH

    Tensioni di ingresso in questo intervallo possono essere lette come basse o alte a seconda di fattori casuali e costruttivi. 

Come ingresso di un sistema logico è ovvio che un livello produrrà un risultato piuttosto che il livello opposto; quindi, è fondamentale che gli ingressi del circuito logico siano ben determinati nel loro valore.

Allo scopo di determinare una uscita precisa del ricevitore, esso sarà possibilmente a Trigger di Schmitt per ripulire il segnale da incertezze e disturbi.

Una particolarità di questa configurazione è che non esiste,  tra le varie unità trasmittenti, la possibilità di conflitto che determini problemi fisici al bus.
Come abbiamo visto nello schema precedente, se nessuno degli switches a semiconduttore è chiuso, nel bus non passa altro che la minima corrente di perdita delle giunzioni e la resistenza del pull-up mantiene il bus a livello alto.

Se un semiconduttore è portato in saturazione, costituisce un collegamento a bassissima resistenza verso la massa.

Attraverso di esso passa una corrente limitata dalla resistenza del pull-up:

Id = V / R1

I ricevitori sul bus individueranno la variazione di tensione e la riporteranno alle loro uscite.

Quindi, aprendo e chiudendo gli switches, potrò inviare sequenze di bit 1 e 0.

Ogni unità ricevente avrà a disposizione questi dati, così ottenuti:

  • il bus sarà a livello 0 quando uno switch andrà in conduzione. Il livello 0 è ottenuto dallo switch che chiude verso massa. 
     
  • il bus sarà a livello 1 quando nessuno switch è in conduzione. Il livello 1 è garantito dal pull-up

A seconda dello stato dei gate di comando degli switches e della polarità dei ricevitore, si potrà parlare di configurazioni "wired AND" (a logica positiva) o "wired OR" (logica negativa). Una "wired  AND" si comporta come l' AND booleano di due (o più) porte.  Una "wired OR" Si comporta come il booleano OR per la logica negativa.
Normalmente si fa riferimento ad una logica positiva, ovvero:

  • Se solo una porta ha l’uscita bassa (FALSE), la linea va a massa e l’uscita è bassa (FALSE).
  • Per ottenere un’uscita alta (TRUE), tutte le porte devono avere uscita alta (TRUE).

Nel nostro caso, l' uscita bassa equivale allo switch chiuso e l' uscita alto allo switch aperto (livello alto imposto dal pull-up).

Può però determinarsi un caso particolare.

Per qualche ragione, più di uno switch va in conduzione.

Il risultato è che la corrente nel bus NON può in ogni caso superare il valore di:

Id= V / R1

dato che è limitata dal pull-up. 
Quindi, anche quando, per errore, due o più unità vadano in conduzione allo stesso tempo, non si verifica alcuna condizione di sovra corrente.
La corrente Id si ripartirà sui vari switches in conduzione.

Ovviamente, se questo non rappresenta alcun pericolo per il bus e per le unità collegate, il concorrere di più unità sul bus danneggia il dato trasmesso: se l' unità che in quel momento sta trasmettendo un livello 1 (bus rilasciato) si trova ad avere in parallelo un' altra unità che cerca di trasmettere uno 0, il bus andrà a livello basso e il dato a 1 sarà danneggiato.
Si dice che è un bus con la priorità al livello basso.

Quindi occorrerà che siano introdotti sistemi di sicurezza prima che un dispositivo inizi a trasmettere. Ad esempio, il trasmettitore che vuole inserirsi sul bus, dovrà verificare che linea sia a livello alto per un certo periodo prima di iniziare; e da parte dell' unità che sta trasmettendo occorrerà verificare che i suoi dati a 1 siano effettivamente tali sul bus. In caso di errore sarà necessario implementare qualche sistema di recovery.
Queste situazioni di collisione accadono in sistemi in cui siano possibili più unità trasmittenti sul bus (multi-Master), come ad esempio I2C, dove esistono simili verifiche.

I bus open collector, per la loro semplicità costruttiva e di gestione, sono abbastanza diffusi.
Appartengono a questo genere di struttura:

  • I2C
  • SMBus
  • Access.Bus
  • PS/2 (tastiera e mouse dei PC)
  • LIN
  • M-Bus
  • vari bus per domotica
  • One-Wire 

 


Microcontroller e bus open collector

E' veramente opportuno considerare che la grande diffusione dei microcontroller embedded per impieghi generici fa si che con essi si realizzi una enorme quantità di applicazioni.
Tra queste sono presenti anche le comunicazioni seriali su bus diversi (RS-232, 485, SPI, I2C, USB, CAN, LIN, ecc.).

In genere, i microcontroller più recenti e di fascia medio-alta dispongono di periferiche integrate che consentono una gestione diretta di queste comunicazioni, con pin che si adeguano alle specifiche dei vari sistemi.

Resta però comunque la possibilità di realizzare accessi a questi bus e protocolli attraverso tecniche di bit-banging, anche in microcontroller che non dispongano dei moduli integrati. E spesso questi microcontroller non dispongono neppure dei pin adeguati a comandare una linea open-collector.

Se vari microcontroller hanno la possibilità di programmare un GPIO come open drain, i PIC dispongono in genreale di un solo elemento open drain, tipicamente RA4, mentre tutti gli altri pin sono dei totem-pole.

Un totem pole è composto da una coppia complementare N-P. Questo offre due possibilità:
  • quando è in conduzione l' elemento N, il pin è collegato a massa. 
  • Quando è in conduzione l' elemento P, il pin è collegato alla Vdd.

Se entrambi non sono in conduzione, il pin è ad alta impedenza.

Ovviamente non è ammesso che entrambi gli switches vadano in conduzione contemporaneamente, dato che si genererebbe un corto circuito tra Vdd e Vss.

Per evitare questa situazione, la logica interna che comanda i gate dei due MOSFET è organizzata in modo tale da impedirne la conduzione allo steso istante.

Ma non è possibile inserire questo genere di port in un bus open collector senza particolari considerazioni. Infatti è presente un grave rischio:

Vediamo ora il diagramma precedente come un array di interruttori e sarà semplice comprendere di cosa si tratta.

Se tutti gli interruttori sono aperti, il bus è appeso alla V+ attraverso il pull-up e nessuna corrente attraversa R1.

Questa situazione si può ottenere nei dispositivi open drain non comandando il gate del MOSFET.

Nei dispositivi totem-pole, invece, se sono configurati come uscite, avranno applicata alla logica di controllo un livello logico 1 o 0 a seconda di quanto programmato nel registro del port.

Ovvero il pin in uscita digitale potrà assumere esclusivamente un livello pari alla Vdd o alla Vss: uno dei due MOSFET sarà chiuso e questo collegherà il pin a una o all' altra delle barre di alimentazione.
E, ricordiamo, si cerca di fare in modo tale che la resistenza di conduzione dei MOSFET sia la minore possibile.

Se consideriamo il totem-pole come uscita programmata a livello 0, sarà in conduzione il MOSFET  N e il bus sarà tirato a livello basso. Qualsiasi altro dispositivo open drain che porti pure a livello basso il bus, non creerà alcun problema di corrente: si avrà una collisione come visto in precedenza (la corrente dipende non dal numero degli switch chiusi, ma dalla R1).

Se però abbiamo impostato il totem pole per uscita = 1, si sarà chiuso il MOSFET P.

Questo forza la Vdd a collegarsi direttamente al bus, attraverso la minima resistenza di conduzione del MOSFET stesso.

Se, per errore, entra in conduzione un' altra unità, il suo switch chiude verso massa: si genera un corto circuito diretto tra la Vdd e la massa attraverso:

Vdd - Mosfet P- bus - open drain - massa

E' chiaro che questa connessione sarà molto probabilmente mortale per i dispositivi interessati, dato che la corrente sarà limitata solo dalla resistenza degli switches, che, per costruzione, è la più bassa possibile.

Non essendo i GPIO, configurati in modo di uscita digitale, dotati di funzione di 3-state, l'unico modo per non avere uno dei due switch chiusi è quello di programmare il pin come ingresso: in tal caso entrambi i MOSFET saranno disattivati e al pin sarà presente solo il carico dovuto al gate di ingresso, che ha impedenza elevata e quindi non influisce sulla tensione imposta dal pull-up.

Dunque, volendo collegare un pin totem pole ad un bus open collector ci potranno essere due via:

  • aggiungere un semiconduttore esterno open drain - open collector
  • utilizzare una manovra software

La prima soluzione è la più semplice, ma richiede l' aggiunta di un paio di componenti esterni.

Per un transistor NPN occorrerà una resistenza di limitazione della corrente di base (R2) e, opzionale, una resistenza di pull-down (R3) per tenere il transistor interdetto nel caso di 3-state del GPIO.

Il MOSFET N dovrà essere un logic-gate. La R4 è un pull-up per la conduzione del gate.

La logica è invertita: comandando a livello alto la base/gate del transistor, esso va in conduzione e il livello del bus va basso.

In  questo modo è possibile comandare un bus o.c. con una V+ diversa dalla Vdd.

R2 potrà essere qualche k , dipendentemente dal guadagno del transistor (1-10k). Serve a mandarlo in saturazione. R3, opzionale, terrà bloccato il transistor con il GPIO impostato come input. Il tranistor è un comune NPN per usi generali (BC357, 2N2222, ecc)
Per il MOSFET (su un bus a bassa corrente, sarà del genere VN2222, BS170 e simili), R4 potrà essere 10-22k. 

La seconda soluzione consiste in quanto segue:

  • se vogliamo imporre un livello 0 al bus, programmiamo il pin come uscita dopo aver programmato il registro del port a livello 0. Questo collegherà il pin  al bus con il MOSFET N chiuso e il P aperto
     
  • se vogliamo applicare un livello 1 al bus, ovvero lasciare libero il bus al livello imposto dal pull-up. programmeremo il pin come ingresso. Questo disabilita i MOSFET di uscita e lascia collegato solo il gate di ricezione; il pin si porta in stato di alta impedenza e R1 tira su (pull-up) la tensione del bus.

Ad esempio, in Assembly per PIC Microchip:

; driver per pin di controllo su o.c. bus
; pin RC1 a livello 0

out_0  MACRO
      bcf  LATC,1       ; preset del registro di uscita a 0
      bcf  TRISC,1      ; direzione pin in uscita
       ENDM

; pin RC1 a livello 1
out_1  MACRO
      bsf  TRISC,1      ; direzione pin in ingresso
       ENDM

Inoltre, abbiamo citato un altro fatto molto importante: totem pole lavora a livello della Vdd, tensione positiva che alimenta il chip. 

La tensione V+ del bus può essere diversa dalla Vdd, ad esempio maggiore. Il suo limite è dato solamente dalla tensione sopportabile dagli open drain - open collector collegati.

Quindi ne risulta che il totem pole NON può essere collegato al bus open collector se questo ha una tensione diversa da Vdd, non solo nel senso del valore assoluto, ma anche della sorgente.

Dunque, se, come abbiamo visto, è possibile emulare da programma un collegamento con il bus open collector, questo va fatto a ragion veduta e dopo aver chiare quale sono le implicazioni.

 


Il bus fisico

La struttura fisica del bus è determinante per la qualità dello scambio di dati e presenta alcune problematiche.
In particolare, la connessione fisica risulta afflitta da una certa capacità parassita dovuta all' esetensione dei conduttori e alle capacità proprie dei dispositivi collegati.

La capacità, assieme alla resistenza di pull-up, costituisce una rete RC che si oppone alle variazioni di tensione dovute alle commutazioni.
Ne risulta la necessità tipica di aumentare la corrente sul bus all' aumentare della frequenza. Questo comporta un maggior consumo a frequenze elevate.
Inoltre, la capacità dei cavi, solitamente superiore a 50-100 pF/m pone un limite alla distanza che la connessione può coprire.
E, generale, maggiore è la distanza/capacità, minore sarà la frequenza applicabile al bus.
Ovvero, se la velocità non è un limite, riducendo la frequenza si otterrà la copertura di distanze maggiori.

Per ovviare al rallentamento dei tempi di salita e discesa dei segnali, può essere utile inserire al posto del pull-up un generatore di corrente. 
Ad esempio, ecco l' effetto positivo sulla forma d'onda dei segnali in un bus I2C ottenuta inserendo l' integrato LT4311 di Linear Technology.


Quanto maggiore sarà la lunghezza delle connessioni
, tanto maggiori saranno le probabilità di captare un disturbo. Probabilità che diventa certezza quando il circuito è inserito in ambienti elettricamente rumorosi, con presenza di relè, elettromagneti, trasformatori, motori, ecc., sopratutto in montaggi disordinati. In questi casi sono soluzioni comuni la schermatura dei cavi, il twistaggio dei conduttori (segnale + massa), l' inserzione i bus exterder o buffer e l' isolamento galvanico.

 


Quale valore per il pull-up ?

Ci si può porre il problema di quale valore scegliere per la R1 di pull-up per il bus open collector.

In modo molto sintetico possiamo dire che il valore del pull-up  R1 deve essere in grado di portare a livello alto la tensione sul pin. Questo dipende dalla corrente assorbita dal pin e dalla famiglia logica a cui appartiene il dispositivo: da famiglia a famiglia i livelli accettati come alto e basso variano.

Va considerato che il circuito equivalente dell' ingresso può essere sintetizzato come una resistenza. 

Quando il contatto è chiuso, il pin è collegato direttamente alla massa attraverso la bassa resistenza del contatto stesso e del suo cablaggio, per cui il livello è sicuramente basso.

Quando l' interruttore è aperto, il livello di tensione al pin è quello stabilito dal partitore composto da R1 e dalla resistenza dell' ingresso Rinput.

O, in altre parole, la caduta di tensione su R1 determinata dalla corrente che affluisce al pin dalla Vcc (attraverso R1) deve essere tale da non scendere al di sotto del livello "alto" per quel dato dispositivo.

Vanno fatte due considerazioni:

  • Quando il contato è chiuso, attraverso R1 passa una corrente data da Vcc / R1. Se il valore di R1 è basso, la corrente sarà elevata e questo non è di alcuna utilità al circuito, anzi, è condizione che si cerca di evitare nelle realizzazioni che richiedono un basso consumo
  • Quando l' interruttore è aperto, il valore di R1 e della corrente assorbita dal pin Iin determina la tensione al pin stesso data da R1 * Iin, oppure alla tensione derivata dal partitore R1- Rinput. Se R1 ha un valore troppo alto, la tensione al pin non arriverà al livello alto

Quindi, la prima condizione tende a cercare valori di R1 il più alto possibile, mentre la seconda tende ad abbassarne il valore.

Dal punto di vista pratico, per il calcolo delle resistenze di pull-up per i vari standard, è opportuno ricorre alle informazioni fornite dai costruttori ed alle relative note applicative.


 

  

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 15/01/12 .