desktop

Medidor de inductancias

He visto ya varios temas respecto a como construir un medidor de inductancias, pero tengo algunas dudas.

Construí un oscilador colpitts con un fet y me funciona bastante bien, ahora quisiera hacer un detector de cruce por cero o un tacometro o convertir esa frecuencia a un voltaje y meter esa información al PIC para que con la programación debida pueda desplegar en displays o en una LCD el valor de la inductancia.

El problema es que realmente no sé como teniendo la señal senoidal del oscilador la pueda meter al PIC; de primero había pensado en el detector de cruce por cero, pero he probado uno con un amp op y no me funcionó; después pensé usar un convertidor de frecuencia a voltaje LM2907 o ECG 995 pero realmente no encuentro algún diagrama ya que nunca he utilizado este(chip).

Me gustaría saber si la idea que tengo podría funcionar y de ser así cuál sería la mejor forma de hacerlo y si alguien tuviera algún diagrama que me pudiera ayudar estaría muy agradecido...
 
gfmo2002,

Para darte una mano sería bueno que amplíes el panorama con más datos, como ser:

1) Frecuencia de tu oscilador (preg. de Eduardo).
2) Valor mínimo de inductancia que querés medir.
3) Exactitud de la medición y/o modelo a utilizar.

Estos factores van a cambiar muchísimo el diseño del circuito, por ejemplo, si sólo querés medir inductancia de 1uH o mayores con un oscilador de 5MHz, un PIC y un par de componentes más creo que no hay ningún inconveniente. Si lo que necesitás es medir inductancias del orden de los nH o querés caracterizar capacidades parásitas y demás cosas ya habría que pensar en algo mucho más complejo.
El primer caso es fácilmente realizable y hasta te diría muy sencillo.

Slds...

Mariano Boragno
 
El rango de inductancias varía entre 1uH y 10m aproximadamente, con una tolerancia de 10%, aunque dicha exactitud puede variar un poco...

Las frecuencias según los cálculos y las pruebas que he hecho varían entre 31KHz y 1.5MHz aproximadamente, la señal de salida del oscilador es una senoidal bastante bien definida y dependiendo de la inductancia y el voltaje de alimentación del oscilador que use, el voltaje de salida varía entre mV hasta 8Vpkk aproximadamente...

Como dijo SigmaOrion, solo necesito medir inductancias en el rango descrito anteriormente, pero lo que tengo duda es que debo hacer entre la salida del oscilador y la entrada del PIC... Las capacidades parasitas y demas no me interesan por el momento...

Gracias por la ayuda...
 
Con intercalar entre la salida del oscilador y el PIC un Schmitt trigger es suficiente.
Entras al PIC por el contador y medis frecuencia, lo que querias hacer de convertir frecuencia en tension para usar el AD es agregar error inutilmente.

Respecto al error, tene en cuenta que cuando se trata de bobinas que van a trabajar en circuitos sintonizados, la medicion tiene que hacerse en frecuencias cercanas a la de operacion, porque entre las capacidades parasitas y el comportamiento del nucleo, el error en la nductancia medida puede ser bastante mayor del 10%.
 
Gracias por la respuesta Eduardo...

Ahora con respecto de lo del contador del PIC no muy entendí, realmente no soy experto en la utilización del PIC aunque lo he usado un par de veces y sé una que otra cosa, pero usar el contador no es una de ellas, no sería mucha molestia que me ampliaras la información sobre esto...

Gracias...
 
Según estaba leyendo eso lo puedo hacer con el Timer0. Yo uso para programar el PIC Simulator IDE y hay un ejemplo en el programa que creo que me podría ayudar, además he buscado en el foro y hay varios temas sobre fecuencímetros o tacometros con PICs y creo que eso me podría ayudar también...
 
Eduardo, la frecuencia del oscilador ya está definida por lo que dice gfmo2002, no entiendo bien para qué medir la frecuencia con el PIC. Quizás pensaste en incluir la inductancia a medir en el colpitts y medir la frecuencia de oscilación para calcular la inductancia?

gfmo2002, sinceramente se me ocurre una manera de medir la inductancia utilizando sólo el PIC, sin necesidad de un oscilador externo, lo que sería deseable porque el PIC te va a dar una frecuencia mucho más estable si está enclavado con un cristal. Acá va la idea, si te interesa puedo darte más detalles:
Podés generar muy fácilmente una onda cuadrada con el PIC de una frecuencia ajustable, la amplitud será siempre 5Vpp. Esta onda se la inyectas diréctamente al inductor a medir con una resistencia de valor conocido en serie (se calcula según frecuencia de operación y valor estimado de inductancia o se va probando para dar mayor exactitud a la medida). La tensión que aparece en la resistencia se mide con la ayuda de un diodo y un capacitor (voltímetro de pico) y se inyecta a una entrada A/D del PIC para medir el valor pico de esta tensión. Este valor va a estar comprendido entre 2.5v y 5v y va a depender de la resistencia agregada, la frecuencia y el valor de la inductancia. Con un cálculo muy sencillo sale el valor de la inductancia medida.

Las ventajas de este circuito son:
1) Se necesita sólo un PIC12Fxxx y muy pocos componente muy baratos adicionales.
2) El oscilador es el mismo PIC, por lo que si se lo hace trabajar con un cristal va a ser muy estable y de frecuencia bien definida.
3) Se pueden medir capacitores también.
4) La tolerancia de la medición va a ser mejor que el 10% si se tiene un poquito de cuidado al hacer la medición.

Si te entusiasma lo seguimos. Slds...

Mariano Boragno
 
SigmaOrion

Pues la idea que yo había pensado era variar la inductancia del oscilador colpitts y detectar las diferentes frecuencias para que por medio de la programación del PIC pudiera mostrar ya sea en una LCD o en unos displays el valor de la inductancia... Esta idea es debido a que el curso que estoy llevando en la Universidad trata sobre osciladores, VCOs, PLLs, etc... Y por eso es la idea del proyecto SIN EMBARGO tu idea me parece muy buena y se me hicieras el favor de ayudarme estaría muy agradecido... Respecto a lo del PIC , yo uso un 16F877A pero con eso creo que no habría problema...

Espero tu respuesta, gracias...

Gabriel Montenegro...
 
SigmaOrion dijo:
Eduardo, la frecuencia del oscilador ya está definida por lo que dice gfmo2002, no entiendo bien para qué medir la frecuencia con el PIC. Quizás pensaste en incluir la inductancia a medir en el colpitts y medir la frecuencia de oscilación para calcular la inductancia?
Bueno, eso es lo que interpreto, el hablo de que queria convertir la frecuencia del Colpitts en tension y de ahi sacar la inductancia.
 
_Eduardo_ dijo:
Bueno, eso es lo que interpreto, el hablo de que queria convertir la frecuencia del Colpitts en tension y de ahi sacar la inductancia.

Realmente me interesarían las dos opciones aunque como mencioné, la forma de hacerlo con el temporizador y el contador del PIC junto con el oscilador colpitts sintonizado con la bobina que quiero medir me parece la forma mas adecuada para mi proyecto debido al contenido de la clase, así que si me pudieras ayudar un poco en eso del temporizador y contador del PIC estaría agradecido, ya que he leído un poco y estoy tratando de hacer el programa pero todavía no mucho, sobre todo al programar en el BASIC COMPILER del PIC SIMULATOR IDE...

He visto algunos comandos como por ejemplo:
INTCON.T0IE = 1 ----para activar las interrupciones de TIMER0
INTCON.GIE = True ----para activar todas las interrucpiones no enmascarables
OPTION_REG.T0CS = False -------para activar la fuente del reloj del Time0 a la instrucción interna del ciclo del reloj

Con lo anterior que está en un programa de ejemplo, puedo hacer "alguna cosa o secuencia" cada vez que haya un flanco positivo por el TOCK1.

Lo que no tengo muy claro es lo del temporizador, para contar esos flancos positivos que entren en el TOCK1 en un tiempo determinado y relacionarlo para que por medio del programa del PIC muestre el valor de la inductancia...

Otra duda es acerca del Schmitt Trigger, ya que nunca he usado uno, pero por lo que leí supongo que cuando el valor de la entrada es mayor que un valor V+ el valor de la salida es un valor determinado (alto por ejemplo) y cuando el valor de entrada es menor que un V- el valor de la salida es otro valor determinado (bajo por ejemplo), entonces supongo que esa variacíon senoidal en la entrada del Schmitt Trigger haría que en la salida haya una entrada "digital" o una señal cuadrada que ingresa al PIC y esos flancos son los que el PIC mediante el contador almacena para el uso que le quiera dar...

Gracias por su ayuda...
 
Eduardo, disculpame, no lo había entendido. En ese caso la mejor forma de hacerlo, claro, es como decís vos.
Respecto a la otra manera, yo estoy trabajando justamente en un medidor vectorial de impedancias, muy sencillito y lo más barato posibile (no se puede hacer milagro con eso tampoco, jaja) pero lo más automatizado posible y basado en un PIC. Cuando tenga algo concreto lo voy a postear en el foro.

Saludos...

Mariano Boragno
 
Estaba probando el circuito del Schmitt Trigger pero tengo algunas dudas, armè un circuito Schmitt Trigger bàsico como el que sale en wikipedia y demàs pero segùn lo que entendì la salida del Schmitt Trigger deberìan ser pulsos, o una señal cuadrada, cuando pruebo mi circuito la señal no es tan cuadrada pero se asemeja (lo suficiente para lo que yo creo que la voy a usar), ahora esta señal tiene un voltaje pico a pico, y no sè si esa señal se pueda meter al PIC, o si le tengo que sumar una componente DC antes para que varìe entre un voltaje y 0v...

Ademàs con lo del temporizador del PIC todavìa no he podido hacer que funcione, solo el contador que c/vez que haya un flanco positivo (o negativo) vaya aumentando una variable (con el Timer0)....
 
Gabriel,

A lo que se refiere Eduardo, si no me equivoco, es a intercalar una compuerta lógica con entrada schmitt triger. Mirá la oja de datos del 74LS14, la serie LS es la más vieja, tenés series más veloces y de menor consumo, pero para tu aplicación no va a hacer gran diferencia.
La hoja de datos está acá: http://www.datasheetcatalog.com/datasheets_pdf/7/4/L/S/74LS14.shtml

Esto se usa para evitar que el PIC cuente ciclos de más por presencia de ruido. Mirá bien la hoja de datos del PIC que usas porque casi todos traen al menos una entrada schmitt trigger, pero ojo con los niveles porque en el PIC no podés superar VCC+0.5 ni ir por abajo de 0V. Con la compuerta esa te asegurás de no quemar ninguna entrada del PIC, cuanto mucho se quema la compuerta que es mucho más barata.
Intentá acomodar el oscilador para que siempre oscile dentro de los límites de alimentación (0v-VCC).

Por otro lado, siempre he programado los PICs en assembler así que con los otros lenguajes no te puedo ayudar pero se puede hacer que uno de los timers internos cuente con un flanco de una pata y con el otro timer podés generar una interrupción en el overflow (cuando pasa de 255 a 0). En la rutina de servicio de la interrupción podés leer el otro timer y sabés cuántos ciclos hubo en ese tiempo, con eso tenés la frecuencia del oscilador.

Si no fui claro (muy probable, perdón, jeje) avisame y lo vemos con más detalle.

Slds...

Mariano Boragno
 
Mariano

Lo que había pensado de primero era variar la amplitud del oscilador para que tuviera una amplitud de 2Vpkpk.

Posteriormente mediante un sumador (con amp op) subir el nivel de la señal del oscilador para que variara entre 0 y 4 V, sumandole a la señal de entrada una componente DC.

La salida de ese sumador meterla a la compuerta Schmitt Trigger y de ahì al PIC.

Podrìa funcionar lo que pensaba hacer?

Y respecto a lo del programa con los timers pues agradecerìa la ayuda, no importanto si fuera con un ejemplo en assembler, porque aunque estoy acostumbrado a programar en BASIC tengo algùn conocimiento bàsico en assembler... Realmente mi problema principal es como configurar los timers al inicio del programa, ya que el programa que habìa pensado era que como alguien me habìa dicho contar los flancos con un timer y generar una interrupcion en un cierto tiempo con el otro timer (temporizador) y leer el valor de la variable del contador, etc...
 
Gabriel,

Respecto del schmitt triger y el Vpp del oscilador, yo no te recomendarías que pases la señal del oscilador por un operacional porque te puede producir atenuación en altas frecuencias. Por ahí te conviene fijar 2.5V con dos resistencias entre +5V y 0V y acoplarle la señal del oscilador directamente con un capacitor de 4.7 ó 10uF en paralelo con un tantalio de 100nF. Con 2Vpp del oscilador como decís arriba estaría perfecto.

Lo del PIC:

Es bastante largo pero ahí va. Bajate el datasheet para seguir lo que voy diciendo de acá http://www.datasheetcatalog.com/datasheets_pdf/1/6/F/8/16F877.shtml

Lo que yo haría (por ahí si leés con detalle encontrás una mejor forma) son los siguientes pasos:
1) Cargar el regitro T1CON con el valor 0x80 (hexa). Esto habilita el TMR1, lo configura como contador y sin división de frecuencia (prescaler en 0).
2) Cargar el registro OPTION_REG con 0x70 para setear el prescaler en 256 (toma una cuenta cada 256 ciclos de instrucción, o sea, 1024 ciclos de reloj). Con esto, y suponiendo un reloj de 20MHz el timer genera un overflow cada 13.1072ms (es tu base de tiempo).
3) Poner en 0 el TMR0.
4) Cargar 0x60 en el registro INTCON. Esto habilita la interrupción de overflow del TMR0 y borra los flags.
5) Poner en 0 el TMR1.
6) Esperar en un lazo a que se genere la interrupción del TMR0.

Cuando se produce el overflow del TMR0 el puntero de instrucción salta a la posición 0x04 de la memoria de programa y ahí se pone un salto a la rutina que se quiere llamar con la interrupción. Esto no sé cómo se hace en basic o en C.
En la rutina de interrupción leés el valor de TMR1 y la frecuencia del oscilador será TMR1/65536*(freq cristal/4). El valor (freq cistral/4) te va a dar la frecuencia del ciclo de instrucción, dividido por 65536 porque el TMR0 contó desde 0 a 256 con un prescaler de 256 (256*256=65536) y TMR1 es el valor leido del timer 1. Esto te da una resolución de aprox. 76Hz con un cristal de 20MHz, midiendo como mínimo 0Hz y como máximo 5MHz.
Podés aprovechar esa misma rutina para mostrar el valor calculado en el display. Acordate antes de salir de la rutina de interrupción (seguramente con la instrucción reti o return) que tenés que volver a setear TMR0 y TMR1 en cero y volver a setear INTCON en 0x60 para que se repita el lazo.

Bueno, creo que eso es todo, lo que esto hace es nada más y nada menos que un frecuencímetro. Si tenés alguna duda preguntame nomás y vemos cómo lo resolvemos.

Espero que te sirva. Slds...

Mariano Boragno
 
Mariano,

Respecto a lo del oscilador ya lo tengo listo, y a la salida del 7414 (Schmitt Trigger) tengo una señal cuadrada (rectangular) con la frecuencia dependiendo del circuito tanque del oscilador, y una amplitud que va desde 0 a 5 v...

Ahora con lo del PIC, tengo la hoja de especificaciones del 16F877A el cual uso y por ejemplo para activar el TMR1, supongo que en el registro T1CON la configuración debería de ser:

bit 0 TMR1ON: Timer1 On bit
1 = Enables Timer1
bit 1 TMR1CS: Timer1 Clock Source Select bit
0 = Internal clock (FOSC/4)
bit 2 T1SYNC: Timer1 External Clock Input Synchronization Control bit
When TMR1CS = 0:
This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.
bit 3 T1OSCEN: Timer1 Oscillator Enable Control bit
0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain)
bit 5-4 T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
00 = 1:1 prescale value
bit 7-6 Unimplemented: Read as ‘0’

0000 0001 = 0x01 para activarlo, seleccionar el reloj interno y sin prescale...
--------------------------------------------------
Con respecto al OPTION_REG para el TMR0

bit 7 RBPU (negado)
bit 6 INTEDG
bit 5 T0CS: TMR0 Clock Source Select bit
1 = Transition on T0CKI pin
bit 4 T0SE: TMR0 Source Edge Select bit
1 = Increment on high-to-low transition on T0CKI pin
0 = Increment on low-to-high transition on T0CKI pin
bit 3 PSA: Prescaler Assignment bit
0 = Prescaler is assigned to the Timer0 module
bit 2-0 PS2S0: Prescaler Rate Select bits
111 TMR0 rate 1:256

0111 0111 = 0x77 para activarlo como contador con un prescaler de 256 y que se incremente en cada transición negativa del pulso TOCK1
--------------------------------------------------
Con respecto al INTCON

bit 7 GIE 0
bit 6 PEIE 1
bit 5 TMR0IE 1
bit 4 INTE 0
bit 3 RBIE 0
bit 2 TMR0IF 0
bit 1 INTF 0
bit 0 RBIF 0

0110 0000 = 0x60 para activar la interrupción de TMR0 y borrar las banderas
--------------------------------------------------
Según lo que entiendo al tenerlo configurado de esta forma, el TMR0 contará de 0 a 255 y producirá una interrupción cuando ocurra el overflow, entonces leo el valor de TMR1L y/o TMR1H y según las formulas que escribiste anteriormente podría obtener la frecuencia deseada y ya con eso mostrar el valor de la inductancia.

Este es un diagrama de mi programa:

Dim a As Byte 'declaro las variables
Dim b As Byte
Dim x As Byte
TRISA = 0xff
TRISB = 0x00 'set all PORTB pins as outputs
OPTION_REG = 0x77 'configura TMR0
T1CON = 0x01 'configura TMR1
TMR0 = 0x00 'borra el registro TMRO
INTCON = 0x20 'configura el registro INTCON
TMR1H = 0x00 'borra los 8 MSB del registro TMR1
TMR1L = 0x00 'borra los 8 LSB del registro TMR1
funcion: 'Creo el ciclo (lazo)
x = TMR0 'leo el valor de TMR0
PORTB = x 'lo muestro en el puerto B
Goto funcion 'que se repita el ciclo (lazo) indefinidamente
End
-------
On Interrupt 'interrupt routine
a = TMR1H 'leo el valor de TMR1
b = TMR1L
AQUI IRIA EL DEMAS PRODECIMIENTO (MOSTRAR EN LOS DISPLAYS Y DEMAS)
TMR1H = 0x00
TRM1L = 0x00
INTCON = 0x60 'configura el registro INTCON a los valores iniciales (deseados)
Resume 'regresa al programa principal


Supongo que con este programa podría contar el número de pulsos que aparecen en RA4 o T0CKI y cuando estos produzcan un overflow en el TMR0 en la rutina de interrupción podría ver el tiempo que se llevó en el TMR1 y así calcular la frecuencia de ese tren de pulsos mediante las formulas escritas anteriormente...

Gracias por la ayuda, espero tu respuesta...
 
Gabriel,

Te pido mil disculpas por la equivocación arriba, te pasé los valores de los registros mal y quizás por eso interpretaste mal cuál registro era para qué.
Lo que yo quise hacer es usar TMR1 para contar flancos del oscilador colpitts y usar TMR0 como la base de tiempo, de esta manera, al ser TMR1 de 16bits, lográs mayor precisión en la medición de la frecuencia. Veamoslo con las fórmulas que puse arriba:
1) Supongo cristal del PIC a 20MHz.
2) TMR0 tiene un prescaler x 256, así que va a tardar en dar la vuelta 256x256=65536 ciclos de instrucción (acordate que la base de tiempo interna del PIC es la frecuencia de reloj/4). Con esto tenemos que se genera un overflow cada 65536x4/20MHz=13.1072ms
3) TMR1 cuenta ciclos del colpitts que queremos medir.
5) Cuando el overflow suceda tenemos TMR1 ciclos del colpitts en 13.1072ms, lo que significa que nuestro colpitts oscilaba a TMR1/(13.1072ms) Hz.
6) El TMR1 tendrá un valor entre 0 y 65535 lo que nos da un mínimo de 0Hz y un máximo de 5MHz con un paso de 76.29364531Hz. Esa es la precisión de nuestra frecuencia, bastante bien, no?

Ahora supongamos que usamos los timers al revés. De esa forma el TMR1 generará un overflow cada determinado tiempo, supongamos que no usamos prescaler como pusiste arriba. Así tendremos un overflow de TMR1 cada 13.1072ms también pero nuestro TMR0 sin prescaler habrá contado como máximo 255 ciclos teniendo un mínimo de 0Hz y un máximo de 19.455kHz con la resolución de 76.294Hz. Si seteamos un prescaler de 256 en TMR0 para aumentar el rango de frecuencias podemos contar de 0Hz a 5MHz pero nuestro paso es de 19.455kHz!

Entonces qué valores seteamos en los registros? Si no me vuelvo a equivocar sería:
T1CON=0x07 : Habilita TMR1, lo setea como contador externo (pin RC0) y no lo sincroniza con el reloj.
OPT_REG=0x07 : Habilita TMR0, le asigna prescaler de 256 y lo usa como contador interno.
INTCON=0xA0 : Habilita sólo la interrupción TMR0 overflow (PEIE no lo habilito porque es para otras cosas).

Respecto del programa, está perfecto, yo creo que andaría muy bien. Lo único que no entendí es para qué copiás el TMR0 al PORTB todo el tiempo en el lazo, pero no tiene incidencia en el funcionamiento del programa así que no está mal.

Dale nomás que ya lo tenés! Cualquier duda avisame y si me equivoqué en algo (espero que no, ya lo revisé dos veces) te pido disculpas por adelantado.

Slds...

Mariano Boragno
 
Mariano

Realmente te agradezco toda la ayuda que me has dado, y pues con la última configuración que me diste de los registros pude hacer que funcionara el programa y que me generara la interrupción y asi poder ver la frecuencia. Ahora tengo un problema debido a que tengo dos registros de 8 bits, TMR1H y TMR1L, y no sé como unir esos dos registros en un registro de 16 bits o en una palabra para poder despúes dividirla dentro el tiempo del TMR0. Yo recuerdo que en assembler existe una opción para esto por ejemplo con el registro AL y AH (solo por mencionar algo parecido), pero realmente no estoy muy seguro de como hacerlo...

Voy a probar ya el circuito físico y les cuento que tal...
 
Atrás
Arriba