Autor Tema: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)  (Leído 39950 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #60 en: 11 de Junio de 2012, 16:57:05 »
Ya tengo la placa funcionando. Por ahora la programo con el Pickit 3. Sólo me falta adaptarle el bootloader RS232 con el que suelo programar.

Por ahora me he llevado una pequeña decepción con el xtal que tiene nada menos que +70ppm de error. He intentado ajustarle con capacidades y en ocasiones deja de oscilar. Voy a comprar varios cristales de 10Mhz y probaré hasta que pueda ajustar uno a 2 o 3 ppm. Así en caso de no conectar la referencia de frecuencia, seguirá funcionando aceptablemente.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #61 en: 16 de Junio de 2012, 05:21:13 »
Ya he conseguido programar la placa con un bootloader, puedo comenzar a adaptar el frecuencímetro al PIC18F25K80


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #62 en: 16 de Junio de 2012, 06:22:45 »
Ya he publicado los esquemas, fotos y bootloader para la placa Kamaleón:

Placa de desarrollo Picuino Kamaleón








Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #63 en: 18 de Junio de 2012, 14:37:12 »
Ya he conseguido 'traducir' el programa desde el PIC18F2550 hasta el PIC18F25K80.

La medida de datos funciona bastante bien, pero con algunas medidas incorrectas (una de cada 10 más o menos).
Voy a revisar las interrupciones para comprobar los problemas.

También voy a probar el módulo CCP para captura de datos. Esta nuevo microcontrolador tiene muchos más módulos de captura y són más rápidos que el PIC18F2550. Espero que esta vez funcione.


Las pruebas que he realizado por ahora con el oscilador OCXO comparado con el frecuencímetro (que también tiene un oscilador interno de tipo OCXO) dan los siguientes resultados.
   El oscilador OCXO de 10Mhz tarda unos 10 minutos en estabilizarse y al cabo de 1 hora tiene una frecuencia completamente estable con variación menor de 0.02ppm.
   El frecuencímetro por el contrario tarda varias horas en estabilizarse hasta una precisión de 0.02 ppm

   Uno de los dos osciladores tiene un envejecimiento apreciable. Estos días han variado más de 0.3ppm entre ellos.
   Cuando termine el proyecto necesitaré una fuente de frecuencia exacta para calibrar el aparato.


Saludos.
« Última modificación: 18 de Junio de 2012, 14:44:00 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #64 en: 20 de Junio de 2012, 11:21:20 »
Parece que ya tengo buenos resultados para altas frecuencias (precisión de 0.01 ppm)

Esta serie mide la frecuencia de oscilación del cristal de cuarzo del microcontrolador comparado con el oscilador OCXO como base de tiempos.

Como puede verse, la exactitud es bastante buena porque el cristal ya está afinado con una capacidad a medida.

(La frecuencia es el último número que indica 10,0000 MHz)

Código: [Seleccionar]
Time= 000000011988468 Pulses= 000000009990389 f= 10,0000017 M
Time= 000000023992451 Pulses= 000000019993710 f= 10,0000018 M
Time= 000000035988467 Pulses= 000000029990392 f= 10,0000018 M
Time= 000000047988465 Pulses= 000000039990392 f= 10,0000018 M
Time= 000000059988473 Pulses= 000000049990401 f= 10,0000019 M
Time= 000000071988470 Pulses= 000000059990400 f= 10,0000018 M
Time= 000000083988465 Pulses= 000000069990398 f= 10,0000019 M
Time= 000000095988465 Pulses= 000000079990400 f= 10,0000019 M
Time= 000000107988471 Pulses= 000000089990407 f= 10,0000019 M
Time= 000000119988468 Pulses= 000000099990406 f= 10,0000019 M
Time= 000000131988468 Pulses= 000000109990408 f= 10,0000019 M
Time= 000000143988470 Pulses= 000000119990412 f= 10,0000020 M
Time= 000000155988470 Pulses= 000000129990414 f= 10,0000019 M
Time= 000000167988467 Pulses= 000000139990413 f= 10,0000019 M
Time= 000000179988467 Pulses= 000000149990415 f= 10,0000019 M
Time= 000000191988467 Pulses= 000000159990417 f= 10,0000019 M
Time= 000000203988467 Pulses= 000000169990419 f= 10,0000019 M
Time= 000000215988468 Pulses= 000000179990422 f= 10,0000019 M
Time= 000000227988465 Pulses= 000000189990421 f= 10,0000019 M
Time= 000000239988466 Pulses= 000000199990424 f= 10,0000020 M
Time= 000000251988479 Pulses= 000000209990437 f= 10,0000020 M
Time= 000000263988465 Pulses= 000000219990427 f= 10,0000019 M
Time= 000000275988470 Pulses= 000000229990433 f= 10,0000019 M
Time= 000000287988465 Pulses= 000000239990431 f= 10,0000020 M
Time= 000000299988465 Pulses= 000000249990433 f= 10,0000020 M
Time= 000000311988470 Pulses= 000000259990439 f= 10,0000019 M
Time= 000000323988465 Pulses= 000000269990437 f= 10,0000020 M
Time= 000000335988465 Pulses= 000000279990439 f= 10,0000019 M
Time= 000000347988469 Pulses= 000000289990444 f= 10,0000020 M
Time= 000000359988470 Pulses= 000000299990447 f= 10,0000020 M
Time= 000000371992447 Pulses= 000000309993763 f= 10,0000019 M
Time= 000000383992447 Pulses= 000000319993765 f= 10,0000020 M
Time= 000000395992447 Pulses= 000000329993767 f= 10,0000020 M
Time= 000000407992447 Pulses= 000000339993769 f= 10,0000020 M
Time= 000000419988470 Pulses= 000000349990457 f= 10,0000020 M
Time= 000000431992447 Pulses= 000000359993773 f= 10,0000020 M
Time= 000000443988470 Pulses= 000000369990461 f= 10,0000020 M
Time= 000000455988470 Pulses= 000000379990463 f= 10,0000020 M
Time= 000000467988469 Pulses= 000000389990464 f= 10,0000020 M
Time= 000000479988475 Pulses= 000000399990471 f= 10,0000020 M
Time= 000000491988469 Pulses= 000000409990468 f= 10,0000020 M
Time= 000000503992448 Pulses= 000000419993786 f= 10,0000020 M
Time= 000000515988469 Pulses= 000000429990472 f= 10,0000020 M
Time= 000000527988465 Pulses= 000000439990471 f= 10,0000020 M
Time= 000000539988465 Pulses= 000000449990473 f= 10,0000020 M
Time= 000000551988470 Pulses= 000000459990479 f= 10,0000020 M
Time= 000000563988465 Pulses= 000000469990477 f= 10,0000020 M
Time= 000000575988470 Pulses= 000000479990483 f= 10,0000020 M
Time= 000000587988465 Pulses= 000000489990481 f= 10,0000020 M
Time= 000000599988465 Pulses= 000000499990483 f= 10,0000020 M
Time= 000000611988470 Pulses= 000000509990489 f= 10,0000020 M
Time= 000000623988473 Pulses= 000000519990494 f= 10,0000021 M
Time= 000000635988465 Pulses= 000000529990489 f= 10,0000020 M
Time= 000000647988473 Pulses= 000000539990498 f= 10,0000020 M
Time= 000000659988473 Pulses= 000000549990500 f= 10,0000020 M
Time= 000000671988465 Pulses= 000000559990495 f= 10,0000020 M
Time= 000000683990795 Pulses= 000000569992439 f= 10,0000020 M
Time= 000000695988468 Pulses= 000000579990502 f= 10,0000021 M

La frecuencia del reloj con PLL es Fosc = 48 Mhz
La frecuencia del oscilador externo OCXO es de 10Mhz
La salida muestra una medida de frecuencia cada segundo.

La precisión de medida es de 0.01 ppm.

La precisión de 0.01 ppm se consigue promediando las diez últimas tomas de datos. Cada segundo se hace media entre las diez últimas medidas realizadas.
El filtro es de tipo FIR (finite Impulse Response) que significa que se toma la media de las diez últimas mediciones guardadas en un Buffer. Pasados 10 segundos se pierde toda memoria de la frecuencia anterior.


Saludos.
« Última modificación: 20 de Junio de 2012, 11:24:04 por Picuino »

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1255
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #65 en: 20 de Junio de 2012, 13:12:00 »
Hola picuino, una consulta, en esos ultimos valores en las mediciones ke varian entre 17 y 20, no tiene que ver con el tiempo de ciclos de instruccion en el micro, no los puedes compensar?

Muy buen trabajo!!

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #66 en: 20 de Junio de 2012, 15:18:28 »
Creo que se debe a que el oscilador a cristal varía su frecuencia después de pulsar reset.
Al pulsar reset, el cristal deja de oscilar y puede que se enfríe un poco y al cabo de un tiempo la frecuencia se estabiliza.

Ten en cuenta que la variación es de 0.040 ppm! para un oscilador a cristal no está mal.

Tengo muchas mejoras aún en la cabeza, pero antes de continuar con ellas intentaré añadir un control de LCD y subir un programa que ya funcione.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #67 en: 20 de Junio de 2012, 15:24:39 »
Después de 4 horas funcionando los dos osciladores sin parar y con una temperatura ambiente constante, la frecuencia se ha estabilizado.

Después de un reset sigue manteniéndose constante:

Código: [Seleccionar]
Time= 000001475992458 Pulses= 000001229994193 f= 10,0000041 M
Time= 000001487988481 Pulses= 000001239990883 f= 10,0000041 M
Time= 000001499988482 Pulses= 000001249990888 f= 10,0000041 M
Time= 000001511988484 Pulses= 000001259990893 f= 10,0000041 M
Time= 000001523988478 Pulses= 000001269990893 f= 10,0000041 M
Time= 000001535992461 Pulses= 000001279994216 f= 10,0000042 M
Time= 000001547988478 Pulses= 000001289990901 f= 10,0000041 M
Time= 000001559988481 Pulses= 000001299990907 f= 10,0000041 M
Time= 000001571996459 Pulses= 000001309997560 f= 10,0000042 M
Time= 000001583988481 Pulses= 000001319990916 f= 10,0000042 M
Time= 000001595992458 Pulses= 000001329994234 f= 10,0000041 M
Time= 000001607988476 Pulses= 000001339990920 f= 10,0000041 M
Time= 000001619988484 Pulses= 000001349990930 f= 10,0000040 M
Time= 000001631988476 Pulses= 000001359990928 f= 10,0000042 M
Time= 000001643988478 Pulses= 000001369990934 f= 10,0000041 M
Time= 000001655988479 Pulses= 000001379990939 f= 10,0000041 M
Time= 000001667988481 Pulses= 000001389990944 f= 10,0000041 M
Time= 000001679996459 Pulses= 000001399997597 f= 10,0000042 M
Time= 000001691988482 Pulses= 000001409990953 f= 10,0000041 M
Time= 000001703988476 Pulses= 000001419990953 f= 10,0000041 M
Time= 000001715988476 Pulses= 000001429990957 f= 10,0000041 M
Time= 000001727996456 Pulses= 000001439997611 f= 10,0000041 M
Time= 000001739988478 Pulses= 000001449990967 f= 10,0000042 M
Time= 000001751988623 Pulses= 000001459991091 f= 10,0000041 M
Time= 000001763988479 Pulses= 000001469990975 f= 10,0000040 M
Time= 000001775988479 Pulses= 000001479990979 f= 10,0000040 M
Time= 000001787988481 Pulses= 000001489990985 f= 10,0000041 M
Time= 000001799992458 Pulses= 000001499994303 f= 10,0000040 M
Time= 000001811988481 Pulses= 000001509990993 f= 10,0000041 M
Time= 000001823988476 Pulses= 000001519990993 f= 10,0000040 M
Time= 000001835996456 Pulses= 000001529997647 f= 10,0000040 M
Time= 000001847988478 Pulses= 000001539991003 f= 10,0000040 M
Time= 000001859988478 Pulses= 000001549991007 f= 10,0000040 M
Time= 000001871988478 Pulses= 000001559991011 f= 10,0000041 M
Time= 000001883988479 Pulses= 000001569991016 f= 10,0000041 M
Time= 000001895988479 Pulses= 000001579991020 f= 10,0000041 M
Time= 000001907988481 Pulses= 000001589991026 f= 10,0000041 M
Time= 000001919988481 Pulses= 000001599991030 f= 10,0000041 M
Time= 000001931988481 Pulses= 000001609991034 f= 10,0000041 M
Time= 000001943988481 Pulses= 000001619991038 f= 10,0000041 M
Time= 000001955988482 Pulses= 000001629991043 f= 10,0000041 M
Time= 000001967996456 Pulses= 000001639997692 f= 10,0000041 M
Time= 000001979988478 Pulses= 000001649991048 f= 10,0000041 M
Time= 000001991992461 Pulses= 000001659994371 f= 10,0000041 M
Time= 000002003988479 Pulses= 000001669991057 f= 10,0000041 M
Time= 000002015988479 Pulses= 000001679991061 f= 10,0000041 M
Time= 000002027988479 Pulses= 000001689991065 f= 10,0000041 M
Time= 000002039996459 Pulses= 000001699997719 f= 10,0000041 M
Time= 000002051990047 Pulses= 000001709992380 f= 10,0000041 M
Time= 000002063988482 Pulses= 000001719991079 f= 10,0000040 M
Time= 000002075992458 Pulses= 000001729994397 f= 10,0000041 M
Time= 000002087988476 Pulses= 000001739991083 f= 10,0000041 M
Time= 000002099988481 Pulses= 000001749991091 f= 10,0000041 M


La lectura es de  10000004. 1 Hz +- 0.1 Hz

La precisión por lo tanto es de +- 0.01 ppm

La exactitud que he conseguido en el oscilador de cuarzo añadiendo capacidades y suponiendo que el OCXO está bien ajustado es de:

 4.1/10M = 0.4 ppm 



Saludos.
« Última modificación: 20 de Junio de 2012, 15:26:47 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #68 en: 20 de Junio de 2012, 15:32:09 »
El programa ahora mismo me permite comparar dos frecuencias de las siguientes:

   1. Oscilador de cuarzo del microcontrolador
   2. Entrada de señal por la patilla T0CKI
   3. Entrada de señal por la patilla T13CKI

En el caso anterior estoy tomando como base de tiempos (TIME) la frecuencia del oscilador de cuarzo y la frecuencia a medir (PULSES) la tomo de T13CKI, donde tengo conextado el oscilador OCXO.


También se pueden comparar dos frecuencias externas entre sí (T0CKI y T13CKI) con lo cual se puede tomar como base de tiempos una frecuencia exterior muy estable para medir otra frecuencia exterior.

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #69 en: 21 de Junio de 2012, 19:26:20 »
He publicado una versión de pruebas del programa del frecuencímetro.

El programa está escrito para C18 (compilador de Microchip) y adaptado al microprocesador PIC18F2550.

La entrada de frecuencia a medir se debe introducir en el pin T0CKI/RA4

La entrada de frecuencia de referencia de 10MHz se debe introducir en el pin RC0/T13CKI. En caso de que no exista señal en este pin, se tomará el oscilador de cristal de 20Mhz como base de tiempos.

La precisión obtenida es de 0.1 ppm con un buffer de datos de 3 segundos. Cada segundo devuelve la frecuencia media de los últimos tres segundos.

La salida de datos se realiza a través del puerto serie.

Frecuencímetro Picuino YAF versión 0.8

Saludos.
« Última modificación: 21 de Junio de 2012, 19:30:05 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #70 en: 21 de Junio de 2012, 19:36:02 »
Creo que necesito beta testers para poder continuar.

La versión que he publicado funciona con cualquier PIC18F2550 o PIC18F4550 sin modificación alguna.

Los ficheros ya están compilados y sólo hace falta cargar el archivo *.HEX

No es necesario añadir una referencia externa de frecuencia. Si no se conecta, el programa lo etecta automaticamente y toma como base de tiempos el oscilador a cristal externo de 20Mhz.


El único problema que veo es que por ahora envía los datos por la USART.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #71 en: 22 de Junio de 2012, 12:50:40 »
He olvidado añadir los fuses.
Como trabajo con un bootloader, el programa se carga dando por supuesto los fuses del bootloader.

El cristal externo es de 20Mhz y la frecuencia interna es de 48Mhz producida por el PLL.

En cuanto pueda añado en el programa los fuses necesarios para hacerle independiente del bootloader.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #72 en: 26 de Mayo de 2013, 09:25:19 »
Bueno, llevo varios meses sin avances y he decidido ponerme otra vez manos a la obra.

Hasta el momento había conseguido buenos resultados con las rutinas matemáticas de números enteros y de coma flotante de 48 bits, pero no conseguía una lectura estable en todo el rango de frecuencias.

Después de dos días trabajando en ello, he conseguido por fin lecturas estables en todas las frecuencias.
Ahora el problema es cómo realizar el cambio entre frecuencias. Para que el frecuencímetro pueda funcionar bien con grandes frecuencias, es necesario activar el prescaler. Por otra parte en bajas frecuencias es necesario desactivar el preescaler para que el periodo de muestreo no se haga demasiado grande.

Casi tengo terminado el programa para el PIC18F2550. Al final me he decantado por este micro porque es mucho más conocido.

En cuanto pueda pulir los detalles publico el programa. Por ahora dejo el enlace a la página web donde aparecen las características técnicas que he conseguido.

Frecuencímetro de alta precisión YAF

Saludos.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #73 en: 26 de Mayo de 2013, 17:23:25 »


En la revista Circuit Cellar de este mes, publican un frecuencímetro de 0.1Hz a 1.5Ghz, con un PIC18F2620 y un preescaler MC12080.
El programa está hecho en C18, el código fuente completo se puede bajar por FTP de Circuit Cellar en  ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2013/275


Este es el diagrama de bloques del circuito:



« Última modificación: 26 de Mayo de 2013, 17:35:33 por planeta9999 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5415
Re: Frecuencímetro 0-50Mhz autorrango y 0.1ppm (YAF)
« Respuesta #74 en: 27 de Mayo de 2013, 09:34:22 »
Gracias por el aporte, Planeta.
He descargado el código y lo estoy estudiando.
Por lo que he podido ver por ahora, el frecuencímetro tiene bastante resolución para altas frecuencias, pero creo que no ocurre lo mismo para las bajas.
Con las rutinas que ya tengo en marcha puedo leer la frecuencia de un oscilador de baja potencia con tres decimales:
f = 32.761236 kHz  (con error de lectura de 0.1 ppm)

El de circuit cellar daría una lectura:
f = 32.7612 kHz   (en el mejor de los casos con error de lectura de 3ppm)

Puede que no parezca mucho, pero ese error de  se traduce en un reloj en tiempo real en un segundo cada 4 días (8 segundos al mes). Si quieres ajustar el oscilador con más precisión necesitas más dígitos.

El error es todavía mayor para frecuencias más bajas:
f = 50.002532 Hz  (Lectura de la frecuencia de red con mi frecuencímetro)
f = 50.0 Hz          (Lectura de la frecuencia de red con el frecuencímetro de Circuit Cellar)

De todas formas el código tiene partes interesantes que estudiar.

Saludos.
« Última modificación: 27 de Mayo de 2013, 13:19:30 por Picuino »