Frecuenciometro con pic16f874?
| #11 |
|
macraig
|
Lo siento... No se de donde saq los 600KHz...
En todo caso, mirate estos links. Son LA REFERENCIA. http://cp.literature.agilent.com/litweb/pdf/5965-7660E.pdf Salu2 |
|||||||||||
|
|
||||||||||||
| #12 |
|
Alberth
|
gracias, a que te refieres con resolucion de 33.3333Hz? que significa electronicamente
|
|||||||||||
|
|
||||||||||||
| #13 |
| #14 |
|
macraig
|
Leyendo el enlace q te di, se me ocurrio una idea... Para aumentar la precision, lo que necesitas es una senal de mayor frecuencia... Entonces, en lugar de usar el micro como timer durante el cual cuentas los pulsos de la senal, que sea alrevez.
En otras palabras, generas una senal de alta frecuencia con el micro, y cuentas cuantos pulsos de esta senal pasan durante un pulso de la otra senal, la senal de interes. Salu2. |
|||||||||||
|
|
||||||||||||
| #15 |
|
SigmaOrion
|
Edité porque en el tiempo en que escribí esto postearon macraiq y pepechip, así que dejo el post original y abajo agrego algo:
****** Alberth, no estoy seguro de que la pregunta sea para mi, si no lo era pido disculpas. Creo que el único que habló de 33.3Hz fui yo en algún momento, así que contesto. Pongamos un ejemplo: Tu frecuencia de entrada es de 200Hz entonces vos contás pulsos durante 30ms. Al cabo de 30ms contaste 200Hz*30ms = 6 pulsos, cuando hacés la cuenta f=6/30ms=200Hz. En este caso particular el error de la medición es nulo. Ahora tu frecuencia es de 210Hz, al cabo de 30ms contaste 210*30ms = 6.3 pulsos? no, sólo vas a contar números enteros de pulsos, así que vas a haber contado 6 pulsos. Al hacer la cuenta obtenés f=6/30ms=200Hz! Tu circuito va a dar otro valor cuando f=233.333Hz, justo cuando tu contador cuente 7 pulsos. Entonces tu frecuencímetro va a medir de a saltos de 33.333Hz. La razón es el período de medición de 30ms. Al aumentarlo a 500ms obtuviste una resolución de 2Hz, lo cual es correcto. Hablando rigurosamente lo que va a suceder es que tu lectura va a cambiar de 200Hz a 233.33Hz aleatoriamente. Para solucionar esto podés usar la los promedios móviles que planteó f_point y te va a andar muy bien. Si usás los promedios la resolución que vas a lograr será 1/(CANTIDAD DE PROMEDIOS*tiempo de cuenta de ciclos). Por ejemplo, si usás 100ms para obtener 10 lecturas por segundos y mostrás el promedio de las últimas 20 lecturas entonces tu resolución será de 1/(20*100ms)=0.5Hz! Si seguís todo lo que dijo f_point, con quien concuerdo 100%, hizo un muy buen post, creo que vas a obtener buenos resultados. Si tenés dudas para la implementación preguntá nomás! Slds... Mariano ********* Agregados: Para hacer la cuenta f=1/p lleva lo suyo pero no es imposible. Microchip tiene montones de notas de aplicación y estoy seguro de haber visto alguna en la que se hacía eso. Es más, hay una rutina para calcular FFT con un 16Fxxx! macraiq, me equivoco o lo que estás planteando termina siendo lo mismo que la técnica de medir el período de la señal? al fin y al cabo es un contador que cuenta rápido durante un período de la otra. Y con esto se me ocurre algo más, se podría usar una técnica híbrida (mucho nombre para poca cosa, je). Qué pasa si medimos un múltiplo del período de la señal de entrada? con esto aumentamos la precisión en altas frecuencias a expensas de alargar un poco el período de lectura, pero si lo hacemos adaptivo podemos medir, por ejemplo, 1 período para frecuencias de menos de 50Hz, 5 períodos para frecuencias de menos de 500Hz y 10 períodos para frecuencias de menos de 1kHz. Por ahí me fui por las ramas, pero bueno... es posible hacerlo, habría que evaluarlo matemáticamente para ver los beneficios/perjuicios. Saludos a todos. Mariano |
|||||||||||
|
Ultima edición por SigmaOrion el Jue Mar 27, 2008 6:27 pm, editado 1 vez |
||||||||||||
| #16 |
|
macraig
|
Se puede, ventajas de C. Tambien en assembler, pero debes buscar librerias para el calculo numerico. (Implementarlas por tu cuenta te llevaria tiempo) Salu2 |
|||||||||||||
|
|
||||||||||||||
| #17 |
|
f_point
|
En efecto un compilador de C para PIC puede ayudar a resolver los calculos de reciproco, ya que los mismos generan el codigo para esas operaciones automaticamente. Muy buena la observacion de macraig. Alternativamente puedes enviar los datos en bruto a la PC (es decir, sin procesar) y aprovechar la capacidad de computo de la PC para hacer tus calculos, tal como _Eduardo_ lo menciono.
Ambas alternativas son igualmente utiles, anque el metodo de calculo en PC seria el mas facil de implementar (el codigo del MCU se simplifica) y tambien el mas eficiente en cuanto a velocidad de computo. En muchos microcontroladores de la serie PIC16 cuentas con 2 o 3 Timers. Mas especificamente en el PIC16F874 cuentas con Timer0, Timer1 y Timer2. Cada uno posee sus capacidades especiales y se emplea mejor en algunos casos: Timer0 - Es un contador basico de 8 bits, permite generar interrupciones a intervalos especificos y puede servir como base de tiempo constante para periodos de medicion definidos. Tambien puede contar eventos externos pero su limite de frecuencia depende de tu cristal porque posee una etapa de sincronizacion de señal. Su mayor desventaja radica en que no se puede programar su periodo de forma arbitraria (interrumpe unicamente cuando ocurre sobreflujo) y lo unico que hay a la mano para controlar su periodo es el mismo prescaler del WDT, que solo permite ser ajustado en potencias de 2. Timer1 - Se trata de un contador de 16 bits, el cual puede ser operado en modo sincrono o asincrono. El modo asincrono es perfecto para contar eventos externos (en este caso los ciclos de la señal medida) y permite frecuencias de entrada tan altas como 10MHz y quiza aun mas. Su unica desventaja radica en que es dificil leer sus dos bytes y obtener lecturas validas mientras este corre, pero eso se puede solvertar facilmente si apagagamos el contador (para que deje de contar) y luego leemos el dato. La precision ampliada de 16 bits es definitivamente una ventaja que no hay que pasar por alto. Timer2 - Es un muy amigable contador de 8 bits. Similar a Timer0, con la excepcion que no puede contar eventos externos de forma sincrona, ya que su unica fuente de entrada es el oscilador primario. Personalmente, opino que es PERFECTO para generar bases de tiempo extremadamente estables (tan estables como el cristal del oscilador primario) y su capacidad de definir periodos arbitrarios es simplemente admirable. Quieres contar exactamente 1000 ciclos con el y no 1024 como con Timer0? No hay problema: Pones PR2 = 249 (para 250 conteos) y el prescaler a 4, con lo que obtienes 250*4 = 1000 ciclos. Con cristal de 4MHz, obtienes un periodo de exactamente 1ms en este ejemplo, y como la interrupcion es un evento interno (y sincrono) la latencia de interrupcion es exactamente 4 ciclos todas las veces. Ahora, las combinaciones de timers a usar bien puede ser: - Para metodo de medicion de pulsos a intervalos definidos: Timer1 como contador de señal externa, Timer2 como generador de periodo de medicion. - Para metodo de medicion de duracion de periodo (reciproco: F = 1/T): Timer1 como contador de tiempo elapsado (aprovechando la resolucion de 16 bits y usando el oscilador interno) y una interrupcion externa (RB0/INT) para detectar los flancos de la señal. Podrias reemplazar Timer2 por Timer0 en el primer metodo, pero entonces tus opciones de eleccion de periodo se reducen (al elegir tus periodos arbitrariamente puedes jugar con los numeros para acomodar tus calculos). Asimismo, podrias reemplazar Timer1 por Timer0 en el segundo metodo, pero entonces pierdes resolucion y corres mayor riesgo de sobreflujo para señales de baja frecuencia. Espero que la breve descripcion te ayude a elegir parametros de diseño. Buena suerte Alberth. |
|||||||||||
|
|
||||||||||||
| #18 |
|
microtronic
|
es mejor utilizar el PIC16F884,PIC16F886 ó PIC16f887 ya que es mas economico trae oscilador interno y demas mejoras a un precio menor al PIC16F87X...
muy buena explicacion de los timers... |
|||||||||||
|
|
||||||||||||
| #19 |
|
Alberth
|
tanks a todos......
|
|||||||||||
|
|
||||||||||||
|
| Temas de interés | |
|---|---|
| Comenzar a contar desde 0 | |
| Sensor para contar monedas | |
| Contar pulsos en determinado tiempo | |
| contador des(192) cuando llegue a cero no vuelva a contar | |
| Como conectar la 7490 para contar hasta 9 | |
| 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 || |
Site Map
© Foros de Electrónica
Comunidad Internacional de Electrónicos
Powered by phpBB © 2001, 2005 phpBB Group
Acerca de || Política de privacidad
Generada en = 0.10921 segundos, Consultas = 13
© Foros de Electrónica
Comunidad Internacional de Electrónicos
Powered by phpBB © 2001, 2005 phpBB Group
Acerca de || Política de privacidad
Generada en = 0.10921 segundos, Consultas = 13

