Autor Tema: Interrupción en asm dentro de XC8  (Leído 7263 veces)

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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #15 en: 20 de Septiembre de 2018, 14:28:32 »
El que yo probé era bastante malo, porque se mantenía en su rango de error, pero con mucho jitter. La frecuencia oscilaba contínuamente en torno al rango de error, pero sin salirse de este.
Si divides la frecuencia, la precisión sigue siendo la misma, 2ppm. Pero al tener jitter, la resolución también será esa.

Te pongo un ejemplo. Al medir con ese tcxo, la medida de 50Mhz va a saltar continuamente entre 50.000.000 Hz y 50.000.100 Hz sin estabilizarse.
Eso a mí no me gusta nada. Con un Xtal normal, una vez afinado, puede que tengas una lectura de 50.000.200 Hz, pero esa lectura será estable.
Aumentará en unos 50Hz por cada grado de temperatura, de manera que un simple soplo la modificará. Pero dentro de una caja no tendrás ese problema.
Incluso puedes compensar tú mismo la temperatura con un sensor y el micro y dentro de un rango pequeño de temperaturas (20-30º) no te costará llegar a tener los 2ppm de ese oscilador.


Si quieres mucha precisión (0.01ppm o menos) te recomiendo esto:

https://www.ebay.es/itm/10MHz-FOQ-Piezo-Technik-PTOC32227-High-Precision-OCXO-Square-wave-5V-VFC/271617146639?hash=item3f3da4bf0f:g:bfsAAMXQDK1Rvqrs
https://www.ebay.es/itm/Ublox-NEO-6M-GPS-Modulo-Aircraft-Flight-Controller-For-Arduino-MWC-IMU-APM2-New/112478472619?hash=item1a303d49ab:g:wqEAAOSwbQZbf8rO

O esto:

https://www.ebay.es/itm/GPS-DISCiPLINED-CLOCK-GPSDO-10MHz-10M-OUTPUT-SQUARE-WAVE-RS232-OUTPUT-GPS-NMEA/281649576001?hash=item41939f7841:g:RScAAOSwBLlVHCwv



Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #16 en: 20 de Septiembre de 2018, 14:35:16 »
Para empezar lo mejor es probar con un simple cristal que sea bastante estable y luego seguir mejorando.
Pero el GPS deberías comprarlo si o si. Este que te dejo o uno semejante:

https://www.ebay.es/itm/Ublox-NEO-6M-GPS-Modulo-Aircraft-Flight-Controller-For-Arduino-MWC-IMU-APM2-New/112478472619?hash=item1a303d49ab:g:wqEAAOSwbQZbf8rO

A mí, el de antena separada me han funcionado mejor. La antena era más sensible que cuando está montada sobre el PCB.

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #17 en: 20 de Septiembre de 2018, 14:40:47 »
Que tal uno de estos con un divisor de frecuencia?

https://www.tme.eu/es/details/i547-2p3-40.0000m/generadores-de-cuarzo-smd/ilsi/i547-2p3-400000-mhz/

Tengo entendido que si divido entre 2 la frecuencia, mejora en igual cantidad la precisión y la estabilidad.


Me corrijo. Este Tcxo tiene compensación analógica. Con ese tipo de compensación el jitter debería ser pequeño, pero no dice nada en la hoja de características.
Si realmente tiene 2ppm en todo el rango de temperaturas, a 25ºC puede que tenga 0.2ppm que es lo que buscas. Por probar no pasa nada.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #18 en: 20 de Septiembre de 2018, 14:46:52 »
Para esta aplicación yo no me fiaría mucho del Proteus. Para empezar no está mal, pero los errores los verás de verdad en el pic de verdad.


Luego hay trucos de programa para conseguir buena precisión:

* Mide el tiempo que pasa (ciclos de reloj) entre varios pulsos de señal. Eso se llama Reciprocal counting y te dará mucha precisión para bajas frecuencias.

* Mide tiempo y pulsos de forma continua (sin resetear a cero entre mediciones) y luego resta una medición de la anterior. Así no tendrás errores sistemáticos y compensas los errores entre mediciones. Eso se llama Continuous Counting.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #19 en: 20 de Septiembre de 2018, 14:53:28 »

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:Interrupción en asm dentro de XC8
« Respuesta #20 en: 22 de Septiembre de 2018, 16:10:17 »
Para esta aplicación yo no me fiaría mucho del Proteus. Para empezar no está mal, pero los errores los verás de verdad en el pic de verdad.


Luego hay trucos de programa para conseguir buena precisión:

* Mide el tiempo que pasa (ciclos de reloj) entre varios pulsos de señal. Eso se llama Reciprocal counting y te dará mucha precisión para bajas frecuencias.

* Mide tiempo y pulsos de forma continua (sin resetear a cero entre mediciones) y luego resta una medición de la anterior. Así no tendrás errores sistemáticos y compensas los errores entre mediciones. Eso se llama Continuous Counting.

Saludos.

Según esto, no debo usar el mismo método para frecuencias bajas que para altas.

El GPS, ¿que tengo que hacer con el? usarlo como referencia de frecuencia, para hacer pruebas de medición. Que tiene, una salida senoidal o cuadrada por algún sitio?

Me pondré a recopilar materiales para empezar a funcionar.

Gracias, un aludo!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #21 en: 22 de Septiembre de 2018, 19:14:51 »
Siempre es el mismo método. Pero en frecuencias bajas da la misma precisión que en altas. Lee datasheet.

El gps da 1 pulso por segundo con mucha precisión. Te sirve para calibrar el cristal de cuarzo. Luego lo compensas multiplicando la frecuencia por una constante.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #22 en: 23 de Septiembre de 2018, 07:47:08 »
Te explico un poco.

Los frecuencímetros más básicos cuentan los pulsos que llegan en 1 segundo.
Si la señal tiene 10.5 Hz, a veces contará 10 pulsos y a veces 11, con un error del 10%

Los frecuencímetros con método recíproco cuentan el tiempo entre dos pulsos de entrada distanciados más o menos 1 segundo.
En este caso, con un reloj interno de 20Mz, el frecuencímetro esperará un segundo y luego esperará hasta que llegue el siguiente pulso (unos 50ms después). En total contará 209523810 ciclos de reloj y 11 pulsos de entrada. Ahora ese tiempo hay que convertirlo en frecuencia:
   11 pulsos * 20000000 / 209523810 ciclos = 10,500001 Hz

Con un error de 0.1 ppm (7 dígitos correctos)
 
Hay técnicas para aumentar más la precisión, pero necesitarás cambiar a números en coma flotante de doble precisión (microcontrolador de 16 o 32 bit) y base de tiempo con precisión de 9 dígitos (OCXO). El problema del OCXO es que consume unos 300mA y necesita una referencia de tensión precisa para ajustarle, pero los 9 dígitos correctos que te da equivalen a un error de 3 segundos por siglo.

Un saludo.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:Interrupción en asm dentro de XC8
« Respuesta #23 en: 23 de Septiembre de 2018, 18:46:19 »
Entonces en la práctica, cual es la idea, usar un timer para contar pulsos de la señal a medir, y otro para contar ciclos de reloj del PIC, los pongo a cero, y detecto cuando se desbordan para incrementar una variable asociada a cada timer, cuando ha pasado un poco más de 1 segundo, tomo nota de los dos contadores y calculo la frecuencia.

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #24 en: 23 de Septiembre de 2018, 19:28:42 »
Si, pero tienes que esperar al flanco del pulso de entrada para leer los contadores.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:Interrupción en asm dentro de XC8
« Respuesta #25 en: 26 de Septiembre de 2018, 08:56:50 »
Si, pero tienes que esperar al flanco del pulso de entrada para leer los contadores.

Entonces ¿ tengo que hacer uso de la interrupción externa ?

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Interrupción en asm dentro de XC8
« Respuesta #26 en: 26 de Septiembre de 2018, 12:02:53 »
Hay varios modos. Interrupción externa, módulo capture input, pooling, etc.

El método de interrupción puede funcionar. Recuerda medir siempre primero los pulsos de entrada y a continuación los ciclos de reloj.
Como no se hará a la vez habrá un desfase de pocos ciclos entre lecturas. Por eso es importante que el desfase sea en los ciclos de reloj que siempre tienen la misma frecuencia.

Otra cosa importante es que midas tiempo continuo y luego restes la medición anterior. Eso elimina los errores sistemáticos como el retraso de la interrupción.

Lo ideal sería un módulo que capture impulsos y otro que capture ciclos de reloj, pero creo que dan problemas prácticos con la sincronización.

Una solución buena, que complica más el circuito, es hacer un divisor de frecuencia externo. Con el método recíproco no importa que la frecuencia de entrada sea baja, porque no pierde precisión. Pero a frecuencias altas el microcontrolador tiene problemas sincronizando con la señal.

Saludos.


 

anything