viernes, 9 de octubre de 2015

Capacimetro Digital con PIC16f84A


La idea de hacer un instrumento, como es un capacimetro digital (mide el valor de los condensadores) siempre estuvo en mi mente. Pues cuando compre mi primer multímetro digital, este no traía incorporado uno. Para un inexperto en el código de números que te indican el valor de un condensador, era complicado verificar su valor correcto, además que los números a veces venían borrosos, pequeños y codificados.

Después de haber leído como funciona uno, buscar esquemas de capacimetros digitales en Internet y me di cuenta que no es fácil construir uno, alguno de estos circuitos tenían como base principal el CI 555, este timer tan viejo como su nombre, es tanta la complejidad de estos esquemas, que les muestro uno a continuación:

Figura 0
En este esquema podemos darnos cuenta de que se necesitamos una buena cantidad de materiales, así que para que complicarnos, si podemos crear nuestro propio Capacimetro digital de 4 Digitos,  y porque no con el PIC más viejo, el 16f84a, el más conocido, pero con pocas caracteristicas integradas.

Esquema General:
Figura 1
Explicare un poco de que se trata el esquema del Capacimetro Digital.

Empecemos:
Medición del tiempo de carga del Condensador:
Figura 2
Este circuito funciona de la siguiente forma:

Cuando se hace que  la entrada de disparo (pin 2) cambia del valor de alto (1) a bajo (0), el circuito temporizador con el 555 de la forma que está conectada va a generar en su salida (pin 3), una señal alta (1) que tendrá una duración proporcional al valor de la resistencia selector y del valor del condensador.
Figura 3
Ahora bien por motivos de tiempo de carga de los condensadores, he añadido al circuito un selector de resistencia en el caso de medir condensadores en uF, utilizamos una resistencia de 1K, esto porque a mayor valor del condensador, se demora más la carga, si hacemos que la resistencia se pequeña, la carga seria rápida.
Figura 4
Por ejemplo: Para 10uF, el tiempo es de 10.85ms aproximadamente.

En el caso de medir condensadores en nF, el selector de resistencia debe de tomar el valor de 100K, esto porque a menor valor del condensador, la carga es rápida, pero al tomar un valor pequeño no se puede hacer una medida en tiempos pequeños, así que para elevar el tiempo de carga se toma el valor de 100K.
Figura 5
Para 10nF, el tiempo es de 1.10 ms aproximadamente.

Esta etapa del circuito del capacimetro digital es de vital importancia, pues en esta etapa del sensor, nos mide el tiempo de carga del condensador, en la etapa de control pasaremos este tiempo, al valor del condensador.

Selector de Unidades:
Figura 6
Ahora tenemos que decirle al microcontrolador en que unidades vamos a medir, pues la distancia de 1nF a 1uF es de 1000, así que tendríamos que nuestro capacimetro digital tenga más dígitos, la función principal del selector es decirle mediante un 1 lógico, que vamos a medir en las unidades de nF o uF, esto se hace antes de presionar el botón de Medir, son las configuraciones iniciales que toma el microcontrolador antes de hacer el cálculo del tiempo que se demora en cargar el condensador.

Botón de Medición:
Figura 7
No hay mucho que decir, sobre este circuito, solo que al presionar el botón, el microcontrolador 16f84a, va a empezar a medir el tiempo y luego procederá a visualizarlo en los displays. Si se tiene presionado el botón Medir, no se hará la medida del condensador hasta que se suelte.

Etapa de visualización:
Figura 8
Esta parte del circuito del capacimetro digital, es muy importante, pues es la parte de la visualización de los datos medidos, para este capacimetro digital he tomado 4 display, podría haber utilizado mas display, pero la cantidad de pines que posee el microcontrolador 16f84a, no era suficiente, para esta etapa también podría haber utilizado un LCD de 16x2, pero perdería la idea de crear un sistema electrónico mediante un microcontrolador, al utilizar los display, el programador se complica un poco más, así que se pone a utilizar el cerebro de Ingeniero.

Bueno empecemos a explicar esta etapa, los transistores 2n2222, son como switchs, que uno puede seleccionar el display que desea utilizar, es decir para visualizar un numero de cuatro dígitos tengo que activar los cuatro display, si quiero un numero de 2 dígitos solo activare dos display, así de fácil…

Para no gastar muchos pines del microcontrolador 16f84a, tuve que utilizar un decodificar de BCD a 7 Segmentos, al final puedo manejar los cuatro display con solo 8 pines del PIC, en cambio si no utilizara el decodificador necesitaría de 13 pines, con esto tengo 3 pines libres que puedo utilizarlos.

Para finalizar con esta parte del circuito del capacimetro digital, déjenme decirles que los display son prendidos independientemente, es decir para formar un numero de cuatro dígitos, primero prendo un display, lo apago, prendo el segundo display, lo apago, prendo el tercer display, lo apago, prendo el cuarto display, lo apago, prendo el primer display, lo apago….así sucesivamente
.
Figura 9
Esto se hace tan rápido que uno no se da cuenta, bueno son estrategias de programación, que se explicar en el código del programa del Capacimetro Digital.

Etapa de Control:
Figura 10
Creo yo que este es el cerebro de nuestro capacimetro digital, porque al final a cabo quien gobierna nuestro sensor para medir el condensador y la etapa de visualización es este, todo el programa para manejar las diferentes etapas se encuentra dentro del microcontrolador 16f84a.

Realizare algunas explicaciones de este circuito. Empecemos por la parte del microcontrolador 16f84a, necesita un cristal externo para poder trabajar, así que nosotros trabajaremos con un cristal de 4Mhz, añadimos a sus extremos unos condensadores para eliminar el ruido eléctrico que genere el medio ambiente.

Esta la botonera del reset, por si nuestro microcontrolador por algún motivo se cuelga o se paralice, tenemos que resetearlo, para esto esta la botonera.

Para finalizar esta pequeña explicación, debo decirles que he puesto una resistencia en la salida del pin RA4, pues cuando este pin se configura como salida, se comporta como una salida de colector abierto, por lo tanto tenemos que alimentarlo, es decir la salida esta configurada como un transistor que no esta conectado a la fuente, por eso yo lo estoy conectando a la fuente mediante una resistencia de 10k, este valor para no malograr el pin, con corrientes altas.

Les muestro alguna de las señales que emite nuestro cerebro:

Figura 11

Programa Principal del Capacimetro Digital:

Figura 12

Figura 13

Figura 14

Figura 15

Figura 16

Figura 17

Figura 18

Explicación del programa que maneja nuestro capacimetro digital:

Configuraciones iniciales:
Figura 19
Esta líneas iniciales del código, le dicen al compilador que vamos a usar el microcontrolador 16f84a (#include <16f84a.h>, vamos a configurar un cristal externo de 4 Mhz (#fuse XT), no vamos a activar el perro guardián (#fuse NOWDT), vamos a habilitar el uso del timer en un valor alto (#fuse PUT), no vamos a proteger el código en el microcontrolador (#fuse NOPROTEC).
Vamos usar retardos de tiempo (#use delay (clock=4000000)).

Asignación de nombres a los pines:
Figura 20
En estas líneas, por comodidad de programación, he asignado nombres a los pines del microcontrolador 16f84a ( Ejem. #define A PIN_A0), con esto se hace más fácil programar, pues uno sabe que pin está conectado a cada parte del circuito electrónico.

Declaración de funciones utilizadas y variable usadas:

Figura 21
Declarar las funciones a utilizar es importante, facilita al compilador saber que existen funciones que se van a utilizar en el programa principal, aunque todavía no se ha escrito la función.
Tengo la función:
void digito (int n); esta función escribe un digito en un display de 7 segmentos.
Void active_disp (int disp); esta function va activar el display en  cual se escribirá un dígito del valor medido.
Las siguientes líneas solo son declaraciones de variables  que se van a usar dentro del programa principal.

Analizando el programa Principal:
Figura 22
Las líneas iniciales de todo programa en CSS Compiler, es configurar si un pin del microcontrolador va a ser usada como entrada o salida, para este caso con un “0”, se configura un pin como salida y con un “1”, se configura un pin como entrada.

Veamos que todos los pines del Puerto A del Microcontrolador 16f84a, se han configurado como salidas. Pero los primeros pines del Puerto B se han configurado como entradas (B0, B1, B2, B3) y los demás como pines de salida de datos (B4, B5, B6 y B7).

Figura 23
Estas líneas del código son interesantes, pues son las condiciones iniciales de nuestra salidas, es decir de los valores lógicos iniciales que deben tener nuestros pines de salida de nuestro microcontrolador, por ejemplo que pasa si al iniciar a funcionar nuestro capacimetro digital presenta en su display el valor de 251, sería algo incorrecto, pues aun no hacemos ninguna medida y nos está dando mostrando un valor incorrecto.
Figura 24
Lo que hace nuestro CI 555, es darnos un tiempo, que depende del valor del condensador, bueno es valor de tiempo no es valor del condensador, así que se tiene que hacer una conversión, para eso utilizamos estas líneas de código, para indicarle que si medimos condensadores en “nF”, tenemos que calibrarlo con un valor de 89, es el factor multiplicativo, nada más.
Figura 25
Línea de código interesante, pues es un bucle cerrado, es decir no hace nada hasta que presionamos el botón de medir, y empezara a medir el valor del condensador.
Figura 26
Creo que es la parte principal de todo el programa, pues estas líneas son las miden el tiempo en que mide el valor del condensador, hacer la conversión de tiempo al valor del condensador.
Primero se manda un pulso de disparo para activar el CI 555, y empiece a generar un valor alto, que sea proporcional al valor del condensador.

Luego calibramos nuestro capacimetro digital, eso se hace mediante un retardo de tiempo, así pues ya calibrado, empezamos a incrementar, cada digito del capacimietro digital, recuerde que tenemos que separar los dígitos, para escribirlos luego en los displays, pero porque no hacerlo en el tiempo que se hace la medida del valor del condensador, eso es lo que se hace en estas líneas de código. Todo es conteo se va a realizar hasta que la salida del CI 555 sea alta, es decir al final a cabo estamos contado en tiempo que nos está generando un valor determinado del condensador.
Figura 27
Finalmente para terminar el programa principal, tenemos que enviar los dígitos a los displays, para eso utilizamos una bucle infinito (for(;;)), con ello siempre se va repetir la escritura del valor tomado del condensador, es por esta razón que para volver a medir el condensador, tenemos que reiniciar nuestro microcontrolador con el botón Reset.

Para la entapa de visualización se puede notar que activo el display 1, escribo el digito1, lo apago, prendo el display 2, escribo el digito 2, lo apago, prendo el display 3, escribo el digito 3, lo apago y finalmente prendo display 4, escribo el digito 4, apago el display 4, y todo este proceso se repite indefinidamente, el proceso de prendido y apagado es tan rápido que al final a cabo el ojo humano no lo siente y ve todos los display prendidos y con todos los dígitos que se han tomado en las líneas de código anterior.

Funciones implementadas:
Figura 28
Esta función es la que nos va a visualizar en un display un digito, es un poco largo, pues tenemos que escribir todos los dígitos (0, 1, 2, 3, 4, 5, 6, 7,8 ,9); es un poco largo pero es fácil de entender, pues como estamos utilizando un decodificador de BCD a 7 segmentos solo tenemos generar los números naturales pero en código binario de 4 dígitos, eso es lo que se hace en esta parte del programa.
Figura 29
Finalmente la función que controla los displays, es decir esta parte del código del capacimetro digital, hace que solo se active un display a la vez, si es que no hiciéramos esto, se verían en dos o tres display números iguales, pero que no corresponderían al valor del condensador medido.

ANEXOS:
Compilando en PIC CSS Compiler:
Figura 30

Simulación para un Cx=12nF
Figura 31

Simulación para un Cx=22uF:
Figura 32

Simulación para un Cx=1000uF:
Figura 33

Simulación para un Cx=1000nF:
Figura 34

Nota: Todos los valores de resistencias, transistores, condensadores, etc.; presentados en este trabajo son correctos para su implementación.

3 comentarios:

  1. Excelente aporte , me puedes enviar el archivo hexadecimal este es mi correo ISAACGZL12@GMAIL.COM

    ResponderEliminar
  2. buenas tardes, amigo podría facilitar el código hex o main. para realizar, ya que el código puesto en las imágenes al momento de compilar sale error.

    ResponderEliminar
  3. ¿cuál es el valor máximo de capacitancia que puede medir?
    ¿cuál es el tiempo que toma en realizar una lectura de la medición?

    ResponderEliminar