Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Medidor de inductancias


       



#11  
_Eduardo_
Ubicación: Santo Tome - Santa Fe - Argentina
Registrado: 06 Ene 2008
Mensajes: 1094
citar
SigmaOrion escribió: 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.

#12  
gfmo2002
Ubicación: Guatemala
Registrado: 20 Feb 2007
Mensajes: 16
citar
_Eduardo_ escribió: 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...

#13  
SigmaOrion
Ubicación: La Plata, Argentina
Registrado: 12 Mar 2008
Mensajes: 115
citar
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

#14  
gfmo2002
Ubicación: Guatemala
Registrado: 20 Feb 2007
Mensajes: 16
citar
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)....

#15  
SigmaOrion
Ubicación: La Plata, Argentina
Registrado: 12 Mar 2008
Mensajes: 115
citar
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

#16  
gfmo2002
Ubicación: Guatemala
Registrado: 20 Feb 2007
Mensajes: 16
citar
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...

#17  
SigmaOrion
Ubicación: La Plata, Argentina
Registrado: 12 Mar 2008
Mensajes: 115
citar
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

#18  
gfmo2002
Ubicación: Guatemala
Registrado: 20 Feb 2007
Mensajes: 16
citar
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 PS2:PS0: 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...

#19  
SigmaOrion
Ubicación: La Plata, Argentina
Registrado: 12 Mar 2008
Mensajes: 115
citar
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

#20  
gfmo2002
Ubicación: Guatemala
Registrado: 20 Feb 2007
Mensajes: 16
citar
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...

 Responder





 Otros temas de interés 
No hay mensajes nuevos Variadores de frecuencia OMRON
No hay mensajes nuevos Variador de frecuencia de 150 HP
No hay mensajes nuevos Filtro para frecuencia de sonido de palmada
No hay mensajes nuevos Problema con la frecuencia de actualización del monitor
No hay mensajes nuevos ¿Cómo hallar la frecuencia de un circuito?

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||