Hoy me he levantado con una duda en mente y me he puesto a investigar. La duda es ¿cómo puedo proteger las entradas de mi Arduino si le meto mas tensión de lo que debo? Muchas veces hablamos de proteger las entradas colocando un diodo zener, pero existe un problema con esto que precederé a explicar a continuación.
Expongamos el circuito típico de un diodo zener con su resistencia limitadora:
Nuestro pin de entrada se conectará a VOUT y como hemos de recordar las entradas no consumen corriente (o si lo hacen esta es despreciable), por lo que no he colocado una resistencia de carga en el circuito.
Con un diodo zéner ideal, cuando la tensión VIN está por debajo de la tensión del zéner (VZ), este no conduce y la tensión de salida será igual a la de entrada. Si la tensión de entrada supera la tensión del zener, entonces este empieza a conducir forzando la salida VOUT a tener la misma tensión del zéner.
Ya tenemos nuestra protección, o eso es lo que creemos.
En un diodo real, realmente no ocurre eso. Existe una pequeña "corriente que se fuga del diodo" que hace que ya no estemos dentro del mundo ideal y haya una caida de tensión antes de alcanzar la tensión del zener.
Observad la siguiente gráfica:
Los datos corresponden a un zener BZX85C5V1 de 5.1V (me he dejado la vista para poder leer el marcado del diodo..) y he usado una resistencia limitadora de 2200 ohmios. He ido subiendo la tensión de la entrada de 0.5 en 0.5 y he anotado la tensión de salida en el zéner.
En el eje X tenemos la tensión de la entrada y en el eje Y la tensión de salida.
Idealmente hasta los 5 voltios debería ser una línea recta y después la tensión de salida mantenerse en los 5 voltios. Pero como podéis observar esto no es así. Hasta los 3V es casí líneal, pero a partir de ahí es una curva y no llega a alcanzar los 5 voltios, aunque si queda cerca (4.8V).
¿Estamos protegidos no? La respuesta es SI. Por mucho que aumente la tensión de la entrada, la tensión en el pin está limitada a la tensión del zéner. En una entrada digital estamos muy bien protegidos, pero, ¿qué ocurre si la entrada es analógica?
Imaginad que conectamos un sensor cuya salida es de 0 a 5V, siendo 0 el mínimo y 5V el máximo. Cuando el sensor nos de valores cercanos al mínimo "casí" tendremos el valor real del sensor pero cuando este nos de un valor próximo al máximo la medida que obtengamos con Arduino estará siendo falseada por el zéner.
He probado con un zéner de 4.7voltios y he obtenido la misma curva, aproximadamente, he probado con otro de 12V que se ha portado mejor, pero aún así algo de curva tambíen tenía, excepto que un rango mas corto.
Bueno, nuestro gozo en un pozo. ¿Y qué podemos hacer?
La única solución que he encontrado es usar la referencia interna de Arduino de 1.1V y usar un divisor de tensión a la entrada:
Elegimos los valores de R1 y R2 para que la salida al rango que queremos leer sea como mucho de 1V. Por ejemplo si nuestro sensor es de 0..10V, con unas resistencias de R1=10k y R2=1K obtendremos que para 10V la salida será 0.9V a la salida del divisor de tensión.
Con ese valor de tensión estamos muy dentro de la zona en la que el zener se comporta de manera líneal.
Pero por mucho que subamos la tensión en la entrada, cuando la tensión en el divisor alcance la tensión del zéner esta no sube de esa tensión. He probado con la fuente al máximo (60V) y la tensión de salida estaba en unos 4.7V.
Efectivamente, la salida del conversor analógico llevará un buen rato diciendo 1023... Pero no llegamos a superar nunca la tensión de 5 voltios, con lo que la entrada queda protegida.
¿Qué os parece mi comedura de coco matinal? ¿Me he equivocado en algo? ¿Alguna otra idea?