Traductor de niveles lógicos de voltaje (level translator)

Cuando trabajamos con microcontroladores, es muy común que nos encontremos con el problema de que los voltajes de alimentación del micro y algunos de los accesorios sean distintos, por ejemplo que el procesador trabaje a 5V, pero el acelerómetro tenga un voltaje de alimentación de 3.3V. O por el contrario tenemos un procesador como el msp430 que trabaja a 3.3V y el sensor ultrasónico sea a 5V, con lo que la señal de salida del sensor arruinara nuestro procesador.

Para solucionar este problema se recurre a circuitos integrados que “traducen” el voltaje de las señales entre dispositivos, lo que esta muy bien, salvo que solo necesitemos “traducir” una señal o dos; esto último tiende a encarecer nuestro proyecto, ya que el costo/beneficio de estos chips depende de la cantidad de señales a traducir. Cuando son varias señales, los chips pueden convenir, aparte de agilizar el tiempo de diseño. Cuando empiezan a ser muchas señales, es posible que no sea de todo beneficioso, es mas, seria mas adecuado (tal vez), cambiar de procesador. Y por ultimo, cuando las señales son pocas, los chips se vuelven caros en comparación de otras soluciones.

Aquí proponemos unas soluciones bastante económicas para cuando se tienen pocas señales a traducir

Primera alternativa: forma bidireccional

Como se ve, el circuito es muy sencillo. La gracia de la “bidireccionalidad” (si se me permite el término) esta solo en el transistor (mosfet de enriquecimiento, canal n). Si ya se ha tenido algun acercamiento con este tipo de transitores, podemos recordar que su funcionamiento está prácticamente basado en el voltaje que se aplica en tres el “gate” y el “source” (para mejor referencia: aquí). El secreto de funcionamiento esta entonces en una de las características del transistor: el Vgsth (voltaje de disparo). Éste tiene que ser menor que el voltaje de alimentación de nuestro circuito de menor especificación (en la figura anterior podemos ver que es 3.3V).

Ahora bien, ¿cómo funciona?. Para esto analizaremos cada “etapa” para que nos quede claro que pasa en casa caso.

Primer caso: transmitir un ‘1’ (lógico) del circuito de 3.3V al de 5V

Como se puede ver, cuando se transmite el ‘1’ se logra que el voltaje Vgs sea igual a cero. Por lo que el transistor no se polariza, haciendo que la resistencia entre el source y el drain sea muy alta, ailando el circuito de 3.3V del de 5V. Esto hace que al circuito de de 5V  solo le llegue el voltaje asociado a la resistencia de “pull-up”, que en este caso es un ‘1’ (también en 5V).

Segundo caso: transmitir un ‘0’ (lógico) del circuito de 3.3V al de 5V


Aquí, cuando se introduce un ‘0’ en el lado de los 3.3V hace que Vgs=3.3V con lo que el transistor se polariza y la resistencia del transistor se vuelve muy pequeña (el valor final depende del transistor, pero podemos considerarla como cero), con lo que el cero “pasa” del otro lado, y el valor que llega a la etapa de 5V es un ‘0’.

Ahora bien, ¿qué pasa cuando el circuito de mayor voltaje es el que envía los datos?

Tercer caso: transmitir un ‘0’ (lógico) del circuito de 5V al de 3.3V


En este caso, la magia sucede en dos etapas. La primera (marcada en rojo), cuando se envía el cero, se polariza el diodo (incluido en el transistor), haciendo que su voltaje sea lo suficientemente pequeño (podemos considerar que es cero) para hacer que Vgs sea lo suficientemente grande para polarizar el transitor. En la segunda etapa (marcada en verde), con el voltaje del diodo Vd en cero y Vgs grande, el transistor, ahora polarizado, baja su resistencia interna, con lo que el cero que se transmite es mas “limpio”, debido a que, como el transistor ya esta polarizados e conectan ambos lados del transistor.

Cuarto caso: transmitir un ‘1’ (lógico) del circuito de 5V al de 3.3V


Este último caso es bastante sencillo, ya que al presentarse el ‘1’ en el lado de 5V, el transistor no polariza, además el diodo esta polarizado inversamente, asegurando la no conexión entre circuitos. Po lo que queda en el lado de 3.3V que el voltaje de salida es a través de la resistencia de pull-up R1

Como se ha observado, el valor de las resistencias no es crítica, pero puede depender de la aplicación, por ejemplo, si lo que queremos hacer es adaptar circuitos para el bus i2c con diferentes voltajes de alimentación las resistencias estarán limitadas por las condiciones del bus.

Aparte de este circuito, hay una variante basada solamente en el diodo interno del transistor, pero tiene una limitante, no es bidireccional. Este es el circuito:

 Como se puede observar, dependiendo el valor logico que envie el circuito de 5V es como se polariza el diodo y el voltaque que se refleja en la salida de 3.3V. En la parte izquierda, se puede ver que cuando se envia un ‘1’ el diodo se polariza inversamente y no deja pasar el voltaje de 5V haciendo que la salida sea el voltaje de la resistencia pull-up, es decir 3.3V. En la parte derecha, cuando se envia un ‘0’ el diodo se polariza directamente, y hace que la salida sea el voltaje del diodo (aprox 0V)

Estos circuitos son, en general bastante económicos, ademas de fácil implementacion.

Espero que les sean de utilidad.

Sin mas por el momento…

Argos.

 

 

Anuncios

3 pensamientos en “Traductor de niveles lógicos de voltaje (level translator)

  1. Pingback: ESP8266 – WiFi para microcontroladores | Nomadas Electronicos

  2. Pingback: Modulo WIFI ESP8266-05 | Bitácora del Capitán

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s