Medidor LC

Siguiendo el circuito oscilador presentado por NANO1985 del foro TodoPIC en su proyecto medidor LC realice mi propio código para utilizar un microcontrolador de la serie 16F:

El el circutio de arriba podemos ver el LM311 que funciona como oscilador cuya frecuencia depende de los condensadores e inductancias del circuito resonante. Sin ningún elemento a medir, el circuito oscilará a aproximadamente 555800 Hz y al colocar una capacidad o inductancia su frecuencia de oscilación se modificará. El PIC mide esta frecuencia por el pin 6 que es la entrada del timer 0 y a partir de ella calcula el valor del componente. Mediante la activación/desactivación del relé se selecciona modo capacímetro o inductímetro. Además dispone de calibración y autoescala. Rango de medida: Capacidad 1pF a 1 uF, Inductancia 10nHy a 100mHy.

Algunas ideas como para realizar el código uno mismo:

La parte principal del medidor LC es el circuito tanque sintonizado formado por LC (82uHy y 1nF) y el LM311. En este caso esos valores de L y C se toman para formar una referencia que en teoría oscilará :

Cuando nosotros introducimos un componente a medir (La inductancia en serie a la de referencia y la capacidad en paralelo) se modifica esta frecuencia, la cual la medimos y por medio de simple cálculos se puede determinar el valor del componente desconocido: Por ejemplo, colocamos un capacitor y se mide 330000Hz, entonces:

Despejando:

De la misma manera se hace para L.

Entonces la base del medidor es determinar la frecuencia, para ello hay 2 maneras, midiendo el periodo de la señal o determinando la cantidad de pulsos en un determinado rango de tiempo. Experimentando en este proyecto recurrí a hacer el último método, por ejemplo de la siguiente manera:

    /*
    setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
     setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
    */

    #separate   // Para ahorrar espacio para micros “chicos”
    float Cal_Frecuencia(void){
    float a;
       Overflow=0;      // Para determinar cantidad de pulsos en el rango de tiempo definido.-
       OverTime=5;      // Para contar pulsos durante 500ms.
       Time=0;      // Bandera que indica que ya ha pasado los 500ms
       clear_interrupt(INT_TIMER0);
       clear_interrupt(INT_TIMER1);
       set_timer0(0);                    
       set_timer1(3036);                   // Para interrupción cada 100ms.-
       enable_interrupts(INT_TIMER0);
       enable_interrupts(INT_TIMER1);
       while(Time==0){}                // Esperamos durante 500ms
       a=((((float)Overflow*256)+((float)Medida))*2.0); // Calculo frecuencia.-
       return(a);
    }
    /*************  Interrupciones  ****************/
    #int_TIMER1
    void  TIMER1_isr(void)
    {
       set_timer1(3036); // 5 interrupciones cada 100ms
       OverTime--;
       if(OverTime==0){
          Medida=get_timer0();
          enable_interrupts(INT_TIMER1);
          enable_interrupts(INT_TIMER0);
          Time=1;
       }
    }
    #int_TIMER0
    void  TIMER0_isr(void)
    {
       Overflow++;
    }

Este es el código por ejemplo utilizado para un micro de la serie 16F donde estamos limitados para realizar temporizaciones, pero en un 18F se puede lograr una interrupción cada 500ms sin ninguna bandera adicional logrando una mayor precisión en la determinación de la medición.

Ya determinada la frecuencia estamos de otro lado de la pared! jajaja! Lo único que queda es determinar el valor aplicando por ejemplo:

Y aplicar la escala en uHy o mHy.

    #define Pi 3.141592654
    #define Ls 0.000082
    #define Cs 0.000000001

    Calculo=Cal_Frecuencia();
    if(Calculo<100.0){
    printf(lcd_putc,"\fInductancia:\nInfinita");
    }else{
    Calculo2=(1.0/(2.0*Pi*Calculo));
    Calculo2*=Calculo2;
    Calculo2*=(1.0/(Cs));
    Calculo2-=(Ls+L_error);

Se puede ver que se esta utilizando una variable que indica el error de L de referencia, que se determina al iniciar o al autocalibrar. En mi caso midiendo los valores de los componentes utilizados como referencia el que mayor desviación presento siempre fue la inductancia, entonces la función de autocalibración lo que hace es determinar la frecuencia sin ningún componente externo (Cx o Lx) y a partir de ella calcula el valor de L_error.

Ya con estas ideas pueden darse una idea de cómo implementarlo, utilizando su ingenio pueden mejorarlo, agregarle otras funcionalidades, ect.

Esquemático completo más hex para grabar al PIC El hex es compatible con los PICs 16F873A, 16F874A, 16F876A y 16F877A.

Nota: el hex incluye el envío por puerto serial configurado en 9600,8,n,1 de la medida en el mismo formato presentando en el LCD cada 800ms aprox.

Si el material que encontraste te ha sido útil, ayúdanos a mantenerlo y obtener recursos para más ejemplos.


Licencia de Creative Commons
micros-designs by Suky is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.



MPLAB C18 -FreeRTOS -mbed NXP -LPC1114 -Visual C++ -MPLAB C30 -PICKIT2 Clone -USB, FAT, TCP/IP


This entry was posted in Proyectos con PIC. Bookmark the permalink.

10 Responses to Medidor LC

  1. fgh says:

    Buenas tardes,

    me gusta tu proyecto .La duda que me sale es si se puede medir el condensador que este soldada en una placa sin necesidad de desoldarlo.

    Un Saludo.

  2. Suky says:

    No es lo adecuado, todos los componentes en paralelo al capacitor afectarán la medición y no sabrás si es la correcta o no.

    Saludos!

  3. Hector says:

    Saludos, monte el mismo circuito sobre el protoboard, con la bobina de 100uH ya que no encontre de 82 uHy lo monte primero usando el LM311 y a la salida usando un osciloscopio obtenia 1 H de onda cuadrada, reemplace el LM311 por un LM358 y obtuve el mismo resultado, recurro a ti con la esperanza de que me puedas orientar en donde esta mi problema.

    Gracias

  4. Suky says:

    No queda otra que revisar el circuito y su armado. Hay algo que estás haciendo mal :(

    Saludos!

  5. Gabriel says:

    Perfecto!!!..a por él …. a ver que sale y portarlo a Mikroc ya te estaré molestando !!!

    Saludos!

  6. boRRe says:

    Hola suky!! Buen proyecto, tengo una duda, la selección de Capacimetro o Inductimetro es automática o se cambia por medio de algún botón??

    • Suky says:

      Hola! mmm.. En el esquema tienes 2 botones, uno para calibración y otro para seleccionar entre C o L.

      Saludos!

  7. Bruno says:

    Hola Suky, te felicito por el proyecto muy bueno. Te hago una consulta. No entiendo bien el tema de calibracion o autocalibracion me podrias ampliar un pokito este tema, o sea que es? restarle/sumarle el valor que presenta la medicion en 0 al inductor/capacitor medido? Bueno muchas gracias!

  8. Suky says:

    Debes tener un valor bien conocido de C, así pueden determinar el error que tiene L, y agregarselo cuando realices los demás cálculos.

    Saludos!