01 · Punto de partida
Un bit es una tensión
Hasta ahora hablamos de bits como si fueran valores abstractos. En el cable, un bit es una tensión medida respecto de la masa: un valor «alto» representa el 1 y uno «bajo» representa el 0, aunque el significado se invierte en algunos estándares. Lo que sale del pin de un chip nunca es exactamente 0 V ni exactamente el voltaje de alimentación, y lo que un chip receptor considera un 1 depende de cómo esté construida su entrada.
En software este problema no existe: un true es un true en cualquier lenguaje. En hardware, dos dispositivos que «hablan» el mismo protocolo pueden no entenderse por sus niveles de tensión, o algo peor: uno puede dañar al otro. Un pin de 3,3 V que recibe 5 V durante un tiempo prolongado puede quedar inutilizado, y un nivel alto de 3,3 V que no alcanza el umbral de un chip de 5 V se lee como un 0 intermitente.
02 · Cuatro tensiones
Umbrales y márgenes de ruido
Las hojas de datos describen los niveles con cuatro valores. Dos corresponden a lo que el chip entrega y dos a lo que reconoce:
- VOH (output high): la tensión mínima que garantiza una salida cuando está en nivel alto.
- VOL (output low): la tensión máxima de una salida en nivel bajo.
- VIH (input high): la tensión mínima que una entrada reconoce con seguridad como un 1.
- VIL (input low): la tensión máxima que una entrada reconoce con seguridad como un 0.
Entre VIL y VIH hay una zona prohibida: ahí la entrada puede leer 0, 1 o oscilar, y la salida de un componente nunca debería quedar en ese rango. Para que dos chips se entiendan sin riesgo, el nivel alto garantizado del emisor tiene que superar el umbral del receptor, y lo mismo con el nivel bajo. La diferencia es el margen de ruido:
Un margen positivo significa que, aunque aparezca ruido en la línea, el receptor seguirá leyendo bien mientras el ruido no supere el margen. Un margen negativo indica que el nivel que entrega el emisor puede caer en la zona prohibida del receptor: la conexión funcionará «a veces», con las peores condiciones de temperatura, carga y alimentación.
03 · Familias lógicas
Familias lógicas: TTL y CMOS
Los niveles dependen de la tecnología con que se fabrica el chip y de su tensión de alimentación. Las familias que vas a encontrar en electrónica de aficionados y en sistemas embebidos son:
- TTL (lógica transistor-transistor, serie 74LS y similares): alimentación de 5 V y umbrales bajos, con VIH = 2,0 V y VIL = 0,8 V. Es la que define el «nivel TTL» que mencionan muchas hojas de datos.
- CMOS de 5 V (74HC y la mayoría de los microcontroladores): las entradas conmutan cerca de la mitad de la alimentación, y las salidas llegan casi hasta 0 V y hasta VCC con carga ligera.
- 74HCT: tecnología CMOS con entradas compatibles con TTL (VIH = 2,0 V). La «T» es la clave para recibir señales de 3,3 V en un chip alimentado a 5 V.
- LVTTL y LVCMOS de 3,3 V, 1,8 V y menos: la tendencia es bajar la tensión para reducir el consumo (la potencia dinámica crece con el cuadrado de la tensión) y permitir transistores más pequeños y rápidos.
| Familia (alimentación) | VIL máx. | VIH mín. | VOL máx. | VOH mín. |
|---|---|---|---|---|
| TTL 74LS (5 V) | 0,8 V | 2,0 V | 0,5 V | 2,7 V |
| CMOS 74HC (5 V) | 1,5 V | 3,5 V | 0,1 V | 4,4 V |
| 74HCT (5 V) | 0,8 V | 2,0 V | 0,1 V | 4,4 V |
| LVTTL (3,3 V) | 0,8 V | 2,0 V | 0,4 V | 2,4 V |
| ATmega328P (5 V) | 1,5 V (0,3 × VCC) | 3,0 V (0,6 × VCC) | 0,9 V a 20 mA | 4,2 V a 20 mA |
| ESP32 (3,3 V) | 0,825 V (0,25 × VDD) | 2,475 V (0,75 × VDD) | 0,33 V (0,1 × VDD) | 2,64 V (0,8 × VDD) |
Dos observaciones. Primero, los umbrales de un microcontrolador se expresan como fracción de la alimentación: el mismo ATmega alimentado a 3,3 V tendría VIH = 0,6 × 3,3 ≈ 2,0 V. Segundo, las cifras de salida del ATmega están garantizadas con una carga de 20 mA, que es mucho; cuando el pin alimenta una simple entrada lógica, que consume microamperios, la salida queda casi en 0 V y casi en VCC. El laboratorio usa esos valores típicos con carga ligera para los microcontroladores.
Las placas más comunes se reparten así: Arduino Uno, Nano y Mega funcionan a 5 V; ESP32, ESP8266, STM32 y la Raspberry Pi (incluida la Pico) funcionan a 3,3 V; y muchos sensores modernos, memorias y chips de comunicación inalámbrica, a 3,3 V o 1,8 V. Por eso el problema de unir mundos de distinta tensión aparece constantemente.
04 · El problema habitual
Conectar 3,3 V con 5 V
Hay cuatro combinaciones posibles entre un emisor y un receptor de 5 V y de 3,3 V, y cada una plantea una pregunta distinta:
| Emisor → receptor | Pregunta | Resultado típico |
|---|---|---|
| 3,3 V → 3,3 V | Ninguna especial | Compatible |
| 5 V → 5 V | Ninguna especial | Compatible |
| 3,3 V → 5 V | ¿El nivel alto de 3,3 V supera el VIH del chip de 5 V? | Depende de la entrada: con VIH = 2,0 V (TTL, 74HCT) funciona con amplio margen; con 3,5 V (74HC) no se garantiza; con 3,0 V (ATmega) el margen es mínimo |
| 5 V → 3,3 V | ¿La entrada soporta 5 V sin dañarse? | En general no: los diodos de protección de la entrada conducen y circula una corriente que puede destruir el pin o el chip |
La combinación peligrosa es la última. Un pin de un ESP32 o de una Raspberry Pi tiene un valor máximo absoluto en entrada de VDD + 0,3 V (unos 3,6 V). Si le aplicás 5 V, el diodo de protección hacia la alimentación se polariza en directo, absorbe corriente y eleva la alimentación de 3,3 V por encima de lo permitido. Puede no fallar de inmediato, pero acorta la vida del chip o lo destruye. Algunos chips de 3,3 V toleran 5 V en ciertas entradas (se indica como 5 V tolerant en la hoja de datos); el ESP32 y la Raspberry Pi no lo hacen.
05 · Soluciones
Cómo adaptar los niveles
Cuando la conexión directa no es segura o no tiene margen, hay cuatro soluciones, de la más simple a la más general.
1. Divisor resistivo (5 V → 3,3 V, un solo sentido)
Dos resistencias en serie reducen la tensión: la salida del divisor es Vsal = Vent × R2 / (R1 + R2). Con R1 = 1 kΩ y R2 = 2 kΩ, un nivel alto de 5 V se convierte en 5 × 2 / 3 ≈ 3,33 V, y el nivel bajo sigue siendo prácticamente 0 V.
El divisor es barato y adecuado para una señal que viaja en un solo sentido, como el TX de un Arduino hacia el RX de un ESP32. Tiene dos limitaciones: solo baja la tensión (no sirve para subir de 3,3 V a 5 V) y forma, con la capacidad de la entrada, un filtro pasabajos. Con R1 || R2 ≈ 667 Ω y unos 10 pF de capacidad, el tiempo de subida es de 2,2 × 667 Ω × 10 pF ≈ 15 ns: despreciable para una UART (un bit dura 8,7 µs a 115 200 baudios) pero ya significativo para un SPI de 20 MHz, donde cada bit dura 50 ns.
2. Transistor o MOSFET (buses de colector abierto, ambos sentidos)
Los buses con salidas de colector abierto, como I²C y 1-Wire, necesitan una adaptación bidireccional. La solución clásica es un MOSFET de canal N (por ejemplo, el BSS138) con la puerta a la tensión baja (3,3 V), la fuente en el lado de 3,3 V y el drenador en el lado de 5 V, más una resistencia de pull-up a cada lado. Si cualquiera de los lados baja la línea, el MOSFET conduce y la baja en el otro; si ninguno la baja, cada pull-up la sube a su propia tensión. Es el circuito de los módulos baratos de cuatro canales para Arduino y la forma habitual de conectar un sensor I²C de 3,3 V a un Uno.
Como la subida de los flancos depende de las pull-ups, este método sirve para señales lentas o moderadas: va bien en I²C a 100 y 400 kHz, y no para SPI a varios megahertz.
3. Circuitos integrados traductores
Para señales rápidas o con varias líneas, se usan buffers dedicados:
- Subir de 3,3 V a 5 V: un buffer 74HCT o 74AHCT (por ejemplo, el 74HCT125 o el 74AHCT1G125) alimentado con 5 V. Como su VIH es 2,0 V, reconoce el nivel de 3,3 V y entrega 5 V completos. Es la solución habitual para las tiras de LED WS2812, cuya entrada exige cerca de 0,7 × VDD.
- Bajar de 5 V a 3,3 V: un buffer de la familia LVC (como el 74LVC245) alimentado con 3,3 V, cuyas entradas toleran 5 V.
- Traductores de doble alimentación (como los 74LVC1T45 o los TXB0108): reciben las dos tensiones y adaptan cada línea, algunos con detección automática del sentido. Los de sentido automático tienen problemas con cargas fuertes o con pull-ups, por lo que conviene leer sus notas de aplicación antes de usarlos en I²C.
4. Elegir componentes compatibles
La mejor adaptación es la que no hace falta. Muchos módulos comerciales traen su regulador y sus traductores de nivel, y muchos chips aceptan entradas de 5 V aunque se alimenten a 3,3 V. Revisar este dato al elegir el componente ahorra todo el circuito de adaptación.
| Método | Sentido | Velocidad | Cuándo usarlo |
|---|---|---|---|
| Divisor resistivo | Un sentido, solo bajar | Moderada (kHz a pocos MHz) | TX de un 5 V a RX de un 3,3 V, botones, señales lentas |
| MOSFET con pull-ups | Bidireccional | Hasta 400 kHz–1 MHz | I²C, 1-Wire y otras líneas de colector abierto |
| Buffer 74HCT/74AHCT | Un sentido, subir | Alta | 3,3 V a 5 V, tiras WS2812, relojes |
| Buffer 74LVC | Un sentido, bajar | Alta | 5 V a 3,3 V en SPI o buses paralelos |
| Traductor de doble alimentación | Configurable | Alta | Muchas líneas, mezcla de 1,8 V, 3,3 V y 5 V |
06 · Cómo se maneja una línea
Salidas push-pull y de colector abierto
Hay dos formas de construir la salida de un pin. En una salida push-pull (contrafase), dos transistores forman un par: uno conecta el pin a VCC para el nivel alto y el otro lo conecta a masa para el nivel bajo. El pin siempre está forzado a uno de los dos niveles. En una salida de colector abierto (o drenador abierto), solo existe el transistor hacia masa: el chip puede forzar el nivel bajo, pero para el alto simplemente suelta la línea, y es una resistencia externa (pull-up) la que la sube.
Push-pull
Fuerza tanto el 0 como el 1. Flancos rápidos y simétricos, consumo sin resistencia. Pero dos salidas conectadas a la misma línea pueden pelearse: una intenta poner 1 y la otra 0, y circula una corriente de cortocircuito. Es el caso de UART TX, SPI y de los pines normales de un microcontrolador.
Colector abierto
Solo fuerza el 0; el 1 lo pone la pull-up. Varios dispositivos pueden compartir la línea sin dañarse: si cualquiera baja, la línea baja (un «Y cableado»). Los flancos de subida son más lentos. Es el caso de I²C, 1-Wire y de las líneas de interrupción compartidas.
El colector abierto es lo que permite que muchos dispositivos compartan un bus y, a la vez, facilita la adaptación de niveles: cada lado puede tener su pull-up a su propia tensión. Los valores típicos de pull-up van de 1 kΩ a 10 kΩ, y el equilibrio es el siguiente: una resistencia menor sube más rápido pero consume más corriente cuando la línea está baja, y una resistencia mayor ahorra corriente pero hace los flancos más lentos.
Entradas flotantes
Una entrada CMOS tiene impedancia altísima. Si no está conectada a nada, capta ruido y su lectura oscila de manera impredecible; además, puede aumentar el consumo porque los transistores quedan a medias. Por eso toda línea de entrada debe tener un nivel definido: una pull-up (resistencia a VCC) o una pull-down (resistencia a masa). Los microcontroladores traen pull-ups internas, de unos 20 a 50 kΩ en un ATmega, que se activan por software y bastan para un pulsador, pero que son demasiado débiles para un bus rápido o largo.
07 · Contra el ruido
Señales diferenciales
Hasta ahora, cada señal fue una tensión medida contra la masa (single-ended). Eso las hace vulnerables: cualquier ruido que se sume a la línea, o cualquier diferencia de potencial entre las masas de los dos extremos, se suma al valor que el receptor interpreta. En distancias largas y entornos con motores o relés, ese ruido puede alcanzar volts.
La alternativa es la señal diferencial: la información viaja por dos conductores que llevan señales opuestas, y el receptor mide la diferencia entre ambos, no la tensión de cada uno respecto de la masa. Si un ruido se acopla por igual a los dos cables, lo que se llama ruido de modo común, la diferencia no cambia y el ruido se cancela. Para que el acoplamiento sea parejo, los dos conductores se trenzan en un par trenzado, de forma que ambos reciben las mismas interferencias.
| Situación | Línea A | Línea B | Lo que lee el receptor |
|---|---|---|---|
| Par diferencial, sin ruido | 3,5 V | 1,5 V | A − B = +2 V → 1 |
| Par diferencial, con +4 V de ruido común | 7,5 V | 5,5 V | A − B = +2 V → 1 (igual) |
| Línea única 0/3,3 V, enviando un 0, sin ruido | 0 V | — | 0 V → 0 |
| Línea única, enviando un 0, con +4 V de ruido | 4 V | — | 4 V → se lee 1 (error) |
El receptor diferencial solo necesita que la tensión de modo común (el promedio de A y B) esté dentro de su rango admisible; en RS-485, de −7 V a +12 V. Dentro de ese margen, el ruido ya no importa. Estas son las señales diferenciales que vamos a encontrar:
| Estándar | Cómo se representa un bit | Se estudia en |
|---|---|---|
| RS-422 y RS-485 | Umbral del receptor de ±200 mV entre A y B; el emisor entrega al menos ±1,5 V; modo común de −7 a +12 V | Temas 23 y 24 |
| CAN (ISO 11898-2) | Recesivo: CANH = CANL ≈ 2,5 V (diferencia ≈ 0). Dominante: CANH ≈ 3,5 V y CANL ≈ 1,5 V (diferencia ≈ 2 V) | Temas 27 y 28 |
| USB | Par D+ y D−, con niveles de 3,3 V | — |
| Ethernet por cable de cobre | Pares trenzados acoplados con transformador, de aproximadamente ±1 V | Tema 29 |
| LVDS | Diferencia de unos 350 mV, para señales muy rápidas dentro de equipos | — |
| RS-232 (para contraste) | Referido a masa: de +3 a +15 V es un 0 lógico y de −3 a −15 V es un 1 (lógica negativa) | Tema 22 |
Los enlaces diferenciales cuestan un conductor más por señal y requieren transceptores especiales, pero ganan distancia (RS-485 llega a 1,2 km) y robustez. Por eso son la elección de los buses industriales y automotrices.
08 · Detalles que rompen enlaces
Masa común y velocidad de los flancos
La masa es la referencia
Una tensión solo tiene sentido respecto de otra. Cuando dos placas se comunican con señales referidas a masa, las masas deben estar unidas. Si cada placa se alimenta con su propia fuente y no hay conexión de masa, el receptor no tiene un cero común: puede leer cualquier cosa, o nada. La solución mínima es un cable de masa junto con las señales. En los enlaces diferenciales la masa común es menos crítica, aunque la tensión de modo común debe seguir dentro de los límites del receptor.
El tiempo de subida y la pull-up
En una línea de colector abierto, el flanco de subida lo traza la carga de la capacidad de la línea a través de la pull-up, con un tiempo de subida (del 10 % al 90 %) de aproximadamente:
Con una pull-up de 4,7 kΩ y 100 pF de capacidad (cables y entradas de varios dispositivos), tr ≈ 2,2 × 4700 × 100·10−12 ≈ 1,03 µs. La especificación de I²C admite como máximo 1000 ns a 100 kHz y 300 ns a 400 kHz, así que ese bus en modo rápido no cumple. Para 400 kHz con 100 pF hace falta R ≤ 300 ns / (2,2 × 100 pF) ≈ 1,36 kΩ. Es una de las razones por las que un bus I²C que funciona con dos dispositivos falla al sumarle más módulos y más cable.
09 · Con el microcontrolador
Pull-ups, colector abierto y niveles en el código
Por software controlás algunas de estas decisiones. Dos son muy frecuentes: activar la pull-up interna de un pin de entrada y emular una salida de colector abierto.
const byte PIN_BOTON = 2;
void setup() {
pinMode(PIN_BOTON, INPUT_PULLUP); // pull-up interna (≈ 20–50 kΩ): el pin nunca queda flotante
Serial.begin(9600);
}
void loop() {
bool presionado = (digitalRead(PIN_BOTON) == LOW); // el pulsador conecta a masa: LOW = activo
Serial.println(presionado ? "presionado" : "suelto");
delay(100);
}
Un pin de un AVR no tiene modo de colector abierto, pero se emula alternando su dirección: para «bajar» la línea, se lo configura como salida en nivel bajo; para «soltarla», como entrada, de modo que lo único que la sube es la pull-up externa. Es el mecanismo que usan las bibliotecas de I²C y 1-Wire por software (bit-banging):
// Emulación de colector abierto en un AVR. Nunca se escribe un 1 en la línea.
void bajarLinea(byte pin) {
digitalWrite(pin, LOW); // se deja el latch de salida en 0…
pinMode(pin, OUTPUT); // …y recién ahora se activa la salida: baja a 0 V
}
void soltarLinea(byte pin) {
pinMode(pin, INPUT); // alta impedancia: la pull-up externa sube la línea
}
El orden de las instrucciones en bajarLinea importa: si se activara la salida con el latch en 1, el pin forzaría un nivel alto durante un instante y, si otro dispositivo estuviera bajando la línea, sería un cortocircuito momentáneo. En el ESP32 el núcleo de Arduino ofrece directamente pinMode(pin, OUTPUT_OPEN_DRAIN).
10 · Analogía con programación
Verificar la compatibilidad antes de conectar
La verificación de niveles se puede automatizar como una función. El programa describe cada familia con su alimentación, sus niveles de salida y de entrada y la tensión máxima soportada, y decide si un emisor puede conectarse a un receptor, con o sin un divisor resistivo de relación 2/3. Los márgenes se calculan con los valores VOH y VOL, que para los microcontroladores son los típicos con carga ligera.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
FAMILIAS = {
# nombre: (VCC, VOH, VOL, VIH, VIL, máximo absoluto en una entrada)
"ATmega328P 5 V": (5.0, 4.9, 0.1, 3.0, 1.5, 5.5),
"ESP32 3,3 V": (3.3, 3.2, 0.1, 2.475, 0.825, 3.6),
"74LS (TTL) 5 V": (5.0, 2.7, 0.5, 2.0, 0.8, 7.0),
"74HC 5 V": (5.0, 4.4, 0.1, 3.5, 1.5, 5.5),
"74HCT 5 V": (5.0, 4.4, 0.1, 2.0, 0.8, 5.5),
}
def evaluar(emisor, receptor, escala=1.0):
vcc_e, voh, vol, *_ = FAMILIAS[emisor]
_, _, _, vih, vil, maximo = FAMILIAS[receptor]
alto_max = vcc_e * escala # lo más alto que llega a ver la entrada
margen_alto = voh * escala - vih
margen_bajo = vil - vol * escala
if alto_max > maximo:
return f"PELIGRO: llegan {alto_max:.2f} V a una entrada que soporta {maximo} V"
if margen_alto < 0:
return f"no garantiza el 1 (margen alto {margen_alto:+.2f} V)"
if margen_bajo < 0:
return f"no garantiza el 0 (margen bajo {margen_bajo:+.2f} V)"
if min(margen_alto, margen_bajo) < 0.3:
return f"justo (márgenes {margen_alto:+.2f} V y {margen_bajo:+.2f} V)"
return f"compatible (márgenes {margen_alto:+.2f} V y {margen_bajo:+.2f} V)"
pares = [
("ATmega328P 5 V", "ESP32 3,3 V", 1.0),
("ATmega328P 5 V", "ESP32 3,3 V", 2 / 3), # con divisor de 1 kΩ y 2 kΩ
("ESP32 3,3 V", "ATmega328P 5 V", 1.0),
("ESP32 3,3 V", "74HC 5 V", 1.0),
("ESP32 3,3 V", "74HCT 5 V", 1.0),
]
for emisor, receptor, escala in pares:
extra = " con divisor 2/3" if escala < 1 else ""
print(f"{emisor} -> {receptor}{extra}: {evaluar(emisor, receptor, escala)}")
Resultado: del ATmega al ESP32 sin adaptar, el programa avisa de PELIGRO (5,00 V en una entrada que soporta 3,6 V); con el divisor 2/3 pasa a «compatible» con márgenes de +0,79 V y +0,76 V. Del ESP32 al ATmega el margen alto es de solo +0,20 V: «justo». Hacia el 74HC la señal de 3,3 V no se garantiza (−0,30 V), pero hacia el 74HCT sí (+1,20 V). Agregá otras familias o cambiá la escala y comprobá cómo cambian los veredictos.
El modelo compara valores garantizados y no considera el ruido real, la carga ni la temperatura. Es un filtro para descartar conexiones inviables antes de armar el circuito, no un reemplazo de la lectura de las hojas de datos.
11 · Exploración interactiva
Niveles lógicos y ruido de modo común
El laboratorio tiene dos herramientas. La primera aplica la lógica del programa anterior: elegís el emisor, el receptor y la adaptación, y verás qué tensiones llegan a la entrada, los márgenes de ruido y si hay riesgo de daño. La segunda compara una línea referida a masa con un par diferencial cuando se les suma ruido de modo común.
1. ¿Se entienden estos dos dispositivos?
Elegí emisor, receptor y adaptación.
2. Ruido de modo común: línea única frente a par diferencial
| Bit enviado | Línea única: tensión | Línea única: lectura | Par: A | Par: B | Par: A − B | Par: lectura |
|---|
Mové el deslizador para sumar ruido de modo común.
En la primera herramienta, el «nivel alto garantizado» usa el VOH del emisor (típico con carga ligera en los microcontroladores) y la «tensión máxima» es la que alcanza el emisor en reposo alto, comparada con el máximo absoluto de la entrada del receptor. El traductor se modela como un circuito que entrega al receptor los niveles de su propia familia.
Recorrido guiado
- Con los valores iniciales (ATmega a 5 V hacia un ESP32 de 3,3 V, conexión directa), el veredicto es «Daña el receptor»: el emisor puede entregar 5 V a una entrada cuyo máximo es 3,6 V. Los márgenes de ruido parecen excelentes, y eso es un engaño: el margen solo importa si no se destruye la entrada.
- Elegí el divisor. Ahora llegan como máximo 3,33 V y los márgenes son +0,79 V y +0,76 V: «Compatible».
- Invertí la conexión: emisor ESP32, receptor ATmega, conexión directa. No hay riesgo de daño, pero el margen alto es de +0,20 V: «Justo». Funciona en la práctica porque el VIH del ATmega es 0,6 × VCC = 3,0 V, pero un poco de ruido o carga lo pone en riesgo.
- Probá el divisor en este sentido: el margen alto se vuelve −0,87 V. El divisor solo sirve para bajar tensión; aplicado al revés, empeora el problema.
- Con emisor ESP32, cambiá el receptor a 74HC: el margen alto es −0,30 V (no garantiza el 1). Cambiá a 74HCT: +1,20 V. La «T» de HCT es la diferencia.
- Volvé a 74HC y elegí el traductor: queda compatible. El traductor resuelve cualquier combinación porque entrega al receptor los niveles de su propia familia.
- Probá 74LS TTL → LVTTL: «Daña el receptor» (5 V a una entrada de 3,3 V). Y 74LS → 74HCT: «Compatible», pero el margen en bajo es de apenas 0,30 V, el borde del criterio «justo».
- En la segunda herramienta, con ruido en 0 V, ambos esquemas leen bien. Subí el ruido a +1 V: la línea única, al enviar un 0, queda en 1 V (entre 0,8 V y 2,0 V) y se lee «?»; el par sigue leyendo igual.
- Con +2,5 V, la línea única lee un 0 como 1 (error); el par diferencial sigue correcto, porque A − B vale ±2 V. Subí hasta +10 V: el par aguanta mientras la tensión de modo común (2,5 V + ruido) no supere los +12 V, o sea, hasta +9,5 V inclusive; a +10 V el modo común llega a 12,5 V y falla.
Desafío: ruido negativo
Con la herramienta 2, poné el ruido en −2 V. La línea única, al enviar un 1, queda en 3,3 − 2 = 1,3 V: zona prohibida, lectura «?». ¿Hasta qué ruido negativo lee correctamente el par? La tensión de modo común es 2,5 V + ruido y su límite inferior es −7 V, así que el par funciona hasta un ruido de −9,5 V (modo común de −7 V). A −10 V el modo común queda en −7,5 V, fuera de rango.
12 · Método de trabajo
Cómo conectar dos dispositivos
- Anotá la tensión de alimentación de cada dispositivo y el tipo de salida de cada pin (push-pull o colector abierto).
- Buscá en las hojas de datos VOH, VOL, VIH, VIL y el máximo absoluto de las entradas. Las cifras garantizadas están en las tablas de características eléctricas.
- Verificá la seguridad primero. ¿La tensión máxima que puede entregar el emisor supera el máximo de la entrada del receptor? Si es así, adaptá obligatoriamente.
- Verificá la lectura después. Calculá los dos márgenes de ruido. Si alguno es negativo o muy pequeño (menos de unas décimas de volt), adaptá.
- Elegí la adaptación según el caso: divisor para señales lentas que bajan de 5 V a 3,3 V; MOSFET con pull-ups para buses de colector abierto; buffers HCT, LVC o traductores integrados para señales rápidas o varias líneas.
- Definí todos los niveles en reposo. Pull-ups o pull-downs para cada entrada que pueda quedar al aire y para las líneas de colector abierto.
- Unificá las masas. Un cable de masa junto con las señales, o una referencia común si el enlace es diferencial.
- Para distancias largas o ruido, pasá a diferencial (RS-485, CAN), con par trenzado.
- Medí. Con un osciloscopio o un analizador lógico mirá la amplitud real de los niveles alto y bajo y el tiempo de subida, en las peores condiciones.
Si una comunicación falla, empezá por aquí: masa, tensión de alimentación de ambos lados, niveles reales en el pin del receptor y estado de reposo de la línea. La mayoría de los problemas «de software» en un enlace nuevo resultan ser de niveles.
13 · Comprensión
Confusiones frecuentes
«Un pin de 3,3 V aguanta 5 V porque lo probé y no se rompió»
El daño por sobretensión puede ser acumulativo o depender de la corriente que circule por el diodo de protección. Un chip puede sobrevivir semanas con una entrada a 5 V y fallar después, o afectar la alimentación de todo el sistema. Si la hoja de datos no dice que la entrada es tolerante a 5 V, no lo es.
«Si el nivel alto es mayor que el umbral, el margen de ruido es suficiente»
Hay que usar el valor garantizado del peor caso y no el valor típico. Un margen de 0,2 V que funciona en la mesa de trabajo se pierde con 0,3 V de ruido o con un pin cargado.
«Un divisor resistivo sirve para pasar de 3,3 V a 5 V»
Un divisor solo puede reducir la tensión. Para subir se necesita un circuito activo: un buffer HCT alimentado con 5 V, un MOSFET con pull-ups o un traductor integrado.
«Las pull-ups de I²C son opcionales si el módulo ya las trae»
Hay que sumar el efecto de todas: varios módulos con sus propias pull-ups las ponen en paralelo y el valor equivalente puede ser demasiado bajo para los drivers. Y si ninguno las trae, el bus no funciona. Conviene contar cuántas hay y calcular la resistencia resultante.
«Las señales diferenciales no necesitan masa»
El receptor mide la diferencia, pero la tensión de modo común de cada línea debe permanecer dentro del rango que admite, y para eso las masas de los equipos no pueden estar a potenciales muy distintos. Por eso en RS-485 se recomienda llevar también un hilo de referencia.
«El nivel lógico 1 es siempre la tensión alta»
Es la convención más común, pero hay estándares con lógica negativa: en RS-232, un 1 lógico es una tensión negativa. Y en bus I²C el estado «dominante» es el nivel bajo. Siempre hay que mirar la especificación.
14 · Práctica guiada
Predecí antes de comprobar
1. Márgenes de ruido
Calculá los márgenes de ruido en alto y bajo de una conexión 74HC → 74HC, y de una 74LS (TTL) → 74LS, con los valores de la tabla de familias. ¿Cuál es más inmune al ruido?
Ver solución
74HC → 74HC: NMH = 4,4 − 3,5 = 0,9 V; NML = 1,5 − 0,1 = 1,4 V. 74LS → 74LS: NMH = 2,7 − 2,0 = 0,7 V; NML = 0,8 − 0,5 = 0,3 V. El CMOS tiene márgenes mayores, sobre todo en bajo: la TTL es más sensible al ruido en nivel bajo.
2. Un divisor para el TX
Querés conectar el TX de un Arduino Uno (5 V) al RX de un ESP32. Con R1 = 1 kΩ, ¿qué R2 da exactamente 3,3 V? ¿Qué corriente circula por el divisor con el nivel alto? Con R1 = 10 kΩ y R2 = 20 kΩ, ¿qué pasa con el tiempo de subida si la entrada tiene 10 pF?
Ver solución
R2 = 3,3 × R1 / (5 − 3,3) = 3,3 × 1000 / 1,7 ≈ 1,94 kΩ; con el valor normalizado de 2 kΩ resultan 3,33 V. La corriente es 5 V / 3 kΩ ≈ 1,67 mA. Con 10 kΩ y 20 kΩ la tensión es la misma, pero la resistencia equivalente es 6,67 kΩ y el tiempo de subida sube a 2,2 × 6670 × 10 pF ≈ 147 ns: sigue siendo aceptable para una UART, pero demasiado lento para un SPI de varios MHz.
3. Elegir la adaptación
Proponé una solución para cada caso: (a) un sensor I²C de 3,3 V con un Arduino Uno de 5 V; (b) un pulsador alimentado con 5 V que lee una Raspberry Pi; (c) el TX de un Arduino Uno hacia el RX de un ESP32; (d) un ESP32 que maneja una tira WS2812 alimentada con 5 V.
Ver solución
(a) Un traductor bidireccional con MOSFET (BSS138) y pull-ups a cada lado, o un módulo con el traductor ya incluido. (b) Lo mejor es alimentar el pulsador con 3,3 V; si no, un divisor. (c) Un divisor de 1 kΩ y 2 kΩ en la línea TX del Uno (la línea contraria, ESP32 a Uno, funciona con poco margen). (d) Un buffer 74HCT o 74AHCT alimentado con 5 V, porque la entrada de la tira pide alrededor de 0,7 × VDD = 3,5 V y el ESP32 entrega 3,3 V.
4. Pull-up de I²C
Un bus I²C tiene 100 pF de capacidad y pull-ups de 4,7 kΩ. ¿Cuál es el tiempo de subida? ¿Sirve para 400 kHz (máximo 300 ns)? ¿Qué pull-up máxima admite?
Ver solución
tr ≈ 2,2 × 4700 × 100 pF ≈ 1,03 µs. Para 400 kHz hacen falta 300 ns como máximo: no sirve. La pull-up máxima es 300 ns / (2,2 × 100 pF) ≈ 1,36 kΩ; con un valor normalizado, 1,2 kΩ. A 100 kHz (hasta 1000 ns) quedaría justo.
5. Ruido de modo común
Un par RS-485 envía un 1 con A = 3,5 V y B = 1,5 V. Un motor induce +4 V en ambos conductores. ¿Qué tensiones tienen A y B, qué lee el receptor y está el modo común dentro del rango de −7 V a +12 V?
Ver solución
A = 7,5 V y B = 5,5 V. La diferencia sigue siendo +2 V, que supera el umbral de +0,2 V: el receptor lee un 1. El modo común es (7,5 + 5,5) / 2 = 6,5 V, dentro del rango admitido. Con una línea única de 0/3,3 V, el mismo ruido de 4 V habría convertido un 0 en un 1.
6. Push-pull o colector abierto
Clasificá estas salidas: SDA de I²C, un pin de salida digital normal, 1-Wire, MOSI de SPI, TX de una UART, una línea de interrupción compartida por varios sensores.
Ver solución
Colector abierto: SDA (y SCL) de I²C, 1-Wire y la línea de interrupción compartida (varios dispositivos pueden bajarla, y una pull-up la mantiene en alto). Push-pull: el pin de salida normal, MOSI y TX, que siempre fuerzan 0 o 1.
15 · Síntesis
Ideas para recordar
- Un bit es un rango de tensión: VOH y VOL describen lo que entrega una salida; VIH y VIL, lo que reconoce una entrada.
- Los márgenes de ruido NMH = VOH − VIH y NML = VIL − VOL deben ser positivos con los valores garantizados del peor caso.
- TTL y CMOS tienen umbrales distintos; el 74HCT une entradas compatibles con TTL a salidas CMOS, y los microcontroladores expresan sus umbrales como fracción de la alimentación.
- De 3,3 V a 5 V depende del VIH del receptor; de 5 V a 3,3 V es peligroso salvo que la entrada tolere 5 V.
- Se adapta con un divisor resistivo (solo bajar, un sentido), un MOSFET con pull-ups (buses de colector abierto), buffers HCT o LVC y traductores integrados.
- Una salida push-pull fuerza el 0 y el 1; una de colector abierto solo fuerza el 0 y deja que la pull-up ponga el 1, lo que permite compartir la línea.
- Las entradas nunca deben quedar flotantes: se usan pull-ups o pull-downs; el tiempo de subida con una pull-up es tr ≈ 2,2·R·C.
- Una señal diferencial transmite la información en la diferencia entre dos conductores y rechaza el ruido de modo común, siempre que éste quede dentro del rango del receptor.
¿Listo para el tema 6?
Antes de avanzar, calculá los márgenes de ruido de un emisor LVTTL hacia un 74HCT, decidí cómo conectarías el TX de un Arduino Uno al RX de una Raspberry Pi y explicá con un ejemplo numérico por qué un par diferencial rechaza un ruido de 4 V que arruina una línea única. Si podés justificar las tres respuestas, dominás los niveles de señal.
En el próximo tema estudiamos las topologías y los roles: punto a punto, bus y estrella, y qué significa ser maestro, esclavo o cliente y servidor en un enlace.