Autor Tema: Precisión del oscilador de cuarzo  (Leído 4781 veces)

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

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Precisión del oscilador de cuarzo
« Respuesta #15 en: 06 de Enero de 2012, 15:49:41 »
Citar
TIMER0, mala elección para el frecuencímetro.

Hombre el TMR0 da problemas cuando hay que contar tiempos grandes y usar preescaler altos, pero si son tiempos que se pueden contar con preescaler 1/1 considero que es bastante eficiente.

Hacer la rutina directamente en assembler puede ser una buena solucion.

Citar
Al final he conseguido un error muy bueno (menos de 10ppm):

Aunque Picuino dice que ya tiene lo que quiere.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Precisión del oscilador de cuarzo
« Respuesta #16 en: 07 de Enero de 2012, 21:16:12 »
He conseguido que el timer0 cuente correctamente sumandole 3 cada vez que modifico TMR0L (aunque el manual dice que se pierden sólo 2 ciclos.)
La rutina final para contar tiempo es tan precisa como lo sea el cristal de cuarzo

Esta rutina de interrupción cuenta centésimas de segundo de forma exacta:

Código: [Seleccionar]
#define FOSC            20000000
#define TMR0_COUNT      (FOSC/((unsigned long)4*250*100))

static unsigned char sys_clk, cent_second;

void isr_main(void) {
   if (INTCONbits.TMR0IF==1)  {        // if TIMER0 overflow interrupt
      INTCONbits.TMR0IF = 0;           // Clear Timer0 interrupt flag
      TMR0L += 6+3;
      sys_clk--;
      if (sys_clk==0) {
         sys_clk = TMR0_COUNT;
         cent_second++;
      }
   }
}

Para ajustar la frecuencia del cristal de cuarzo de la placa PIC he añadido una capacidad extra al cuarzo. El procedimiento completo es un poco complicado y utiliza un reloj casio (10ppm o 1 segundo/dia) y un generador de señal digital/contador.

Al final no he necesitado código máquina y funciona muy bien.

Saludos!
« Última modificación: 07 de Enero de 2012, 21:31:32 por picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Precisión del oscilador de cuarzo
« Respuesta #17 en: 16 de Enero de 2012, 20:40:10 »
Se me olvidó poner en el ejemplo anteriór la configuración inicial del timer0:
Código: [Seleccionar]
   INTCON = 0b11100000;  // Enable interrupts
   T0CON =  0b01001000;
   sys_clk = TMR0_COUNT;
   TMR0L = 6;
   cent_second = 0;


TIMER0, mala elección para el frecuencímetro.

Mi sugerencia es utilizar un módulo CCP+TIMER1 y TIMER1 con oscilador externo y de precisión para el mismo. Ya con eso te evitarás una muy buena parte de los problemas.

El módulo CCP en modo captura te permitirá analizar señales de baja frecuencia y también las de alta solamente con configurar el valor de comparación para activar la interrupción cuando la captura coincida con el valor de comparación deseado. Esto es algo relativamente de lograr con un PIC si se utilizan los periféricos apropiados.

Reconozco que todo mundo tira al pobre TIMER0 este tipo de aplicaciones cuando lo correcto es utilizar el hardware que viene con el PIC para ello.

Espero que esta sugerencia te ayude a resolver tu problema.

Gracias por tu sugerencia. De hecho, ahora estoy intentando realizar el frecuencímetro con el TIMER2 (CCP) como contador de tiempo.
Lo que si he descubierto por ahora es que el TIMER1 cuenta pulsos fenomenal (es capaz de contar hasta 80Mhz sin prescaler en un 18F2550)


Saludos!
« Última modificación: 16 de Enero de 2012, 20:53:11 por picuino »

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Precisión del oscilador de cuarzo
« Respuesta #18 en: 19 de Enero de 2012, 11:18:39 »
Citar
Lo que si he descubierto por ahora es que el TIMER1 cuenta pulsos fenomenal

Es porque este timer con los módulos CPP han sido diseñados para eso mismo. Es muy común intentar utilizar el TIMER0 para contar y comparar porque si miras al TIMER0 tiene un esquema muy simple y pocos bits que tocar para configurarlo, pero no es la mejor recomendación. En cambio los TIMERS acoplados a módulos de captura y comparación son mucho más eficaces y eficientes.

Mi recomendación un poco insistente y a veces hasta molesta para algunos es que si quieren contar y comparar o medir frecuencia o período es que utilicen esta combinación. Es más complejo de entender el hw, pero vale la pena cuando una vez que cambias unos pocos bits se hace la magia. En este foro hemos tenido gente que se ha pasado meses tratando de hacer eso con TIMER0 y siempre salta algún resultado inesperado cuando agregan un fragmento de software en otro lado y se afecta su rutina de conteo/medición.

Veo que ya vas por el buen camino entonces y que pronto estarás haciendo maravillas.

Un saludo
Reinier


 

anything