Para los que quieran armarse el suyo con el microcontrolador que les quede mas comodo aquí les muestro la base de lo que tienen que realizar.
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á a
\mathrm{f}=\frac{1}{2*\pi*\sqrt{C*L}}=555793Hz
. 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:
\mathrm{f}=\frac{1}{2*\pi*\sqrt{(C+Cx)*L}}=330000Hz
Despejando:
Cx=\left(\frac{1}{2*\pi*f}\right)^2*\frac{1}{L}-C=1.83nF
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
Lo único que queda es determinar el valor aplicando por ejemplo:
Lx=\left(\frac{1}{2*\pi*f}\right)^2*\frac{1}{C}-L
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. Les queda mucho por hacer
Saludos