Autor Tema: frecuencimetro con PIC18F258  (Leído 5839 veces)

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

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
frecuencimetro con PIC18F258
« en: 22 de Abril de 2012, 13:05:48 »
buenas amigos aqui me encuentro para solicitar su ayuda resulta que deseo realizar un fecuencimetro con este pic el 18f258 programacion en PICC y utilizando el modulo de captura.
realizo simulacion en proteus



he aquí el código

#include <18f242_CCP.h>
#include <FLEX_LCD.C>
#define option PIN_B5
#define selec  PIN_B6
#define ef     PIN_B7
#define LED    PIN_B4
volatile int1  cont_pulso=0,recv_pulso=0;
volatile int16 TFS=0,TFB=0,TP=0;
float AP,F;
float cm[3]={0.2,0.0002,0.0000002};
char  ut[3]={'u','m',' '};
char  uf[3]={'M','K',' '};
int i=2;
#int_CCP1
void  CCP1_isr(void) {
if(cont_pulso==0){
   TFB=CCP_1;
   setup_ccp1(CCP_CAPTURE_RE);
   cont_pulso=1;
   recv_pulso=0;  
}else{
   TFS=CCP_1;
   setup_ccp1(CCP_CAPTURE_RE);
   cont_pulso=0;
   recv_pulso=1;
   setup_ccp1(CCP_OFF);  
}
}



void main() {
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);      //13.1 ms overflow
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_ccp1(CCP_CAPTURE_RE);
   lcd_init();
   enable_interrupts(INT_CCP1);
   enable_interrupts(GLOBAL);
   lcd_putc(" FRECUENCIMETRO\n");
   lcd_putc("BY LEOELECTRONIC");
   delay_ms(1000);
   output_bit(LED,1);
   output_bit(ef,1);
   while(TRUE){
  
   if(input(option)==0){  
   delay_ms(300);
   i--;
   if(i==-1){i=2; }
   }
   if(recv_pulso==1){
   TP=TFS-TFB;
   AP=TP*cm;
   F=(1/AP);
   printf(lcd_putc,"\fF=%0.4f%cHz\nAP=%0.4f%cS",F,uf,AP,ut);
   recv_pulso=0;
   setup_ccp1(CCP_CAPTURE_RE);
   delay_ms(500);
   }//fin recv_pulso  
   }//fin loop
}

entonces el problema es que las lecturas a bajas frecuencias al rededor de los 100Hz, son totalmente alejadas de la realidad  :shock: al rededor de 1KHza 40kHz  son un poco mas cercanas  :? a 50KHz son mucho mas cercanas  8) pero mas de 50 Khz no mide se queda alli  :( entonces no se si el problema esta  es en el hardware sera que no estoy adecuando correctamente la señal o el software que estoy utilizando le modulo de captura incorrectamente  :( ayuda.........!
« Última modificación: 22 de Abril de 2012, 13:13:09 por leoelectronic »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: frecuencimetro con PIC18F258
« Respuesta #1 en: 22 de Abril de 2012, 15:11:10 »
A que frecuencia va el pic?

Creo que tu problema esta en el timer del ccp1, segun los 13.1ms que has puesto la frecuencia minima que podras capturar son 76Hz, pero, todo esto seria en caso de poner el registro a 0 siempre que se recibe el flanco y contar el tiempo del siguiente flanco.

Para que me entiendas, digamos que el CCP_1 se va incrementando constantemente, entonces en caso de detectar un flanco salta a la interrupcion y tu lo capturas TFx=CCP_1; Ahora imaginate que en la primera captura tienes 30000. En la segunda captura si sobrepasas el desborde (al llegar a 65535) capturarias por ejemplo 10000. Como podras observar cuando quieras hacer la resta tendrias un numero que no tiene nada que ver.

Para solucionarlo tendrias que poner a 0 el CCP_1 (revisa el datasheet ya que no se si se podra) en el primer flanco, y luego capturar el tiempo del segundo flanco, no tendrias que hacer resta ya que x-0=x En este caso como he dicho como minimo podras medir 76Hz.

Ahora los 50Khz, segun mis calculos creo que usas 20Mhz no? En este caso habria que ver el codigo en ASM ya que puede que no le de tiempo a leer entre pulso y pulso, tienes 100 TCY entre pulso y pulso, puede que sea algo justo, esto habria que verlo con mas detenimiento debuggeando y viendo la causa.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: frecuencimetro con PIC18F258
« Respuesta #2 en: 22 de Abril de 2012, 17:16:18 »
Te comento algunas cosas, para bajas frecuencias lo mejor es medir el tiempo que hay entre flancos de subida por ejemplo, pero en cambio cuando la frecuencia es alta es conveniente contar cantidad de pulsos dentro de un determinado tiempo. Ahora cuando la frecuencia es muy elevada se comienza a implementar los pre-escaler a la entrada de la señal.

Entonces lo que debes hacer es implementar distintas escalas como para obtener los mejores resultados dentro de cada rango. Podes mirar el siguiente enlace para ver como lo ha estudiado/realizado en usuario jahk_pi, Aquí


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: frecuencimetro con PIC18F258
« Respuesta #3 en: 22 de Abril de 2012, 17:52:18 »
Con un PIC18F2550 he llegado a medir 80Mhz directamente (sin preescaler) en la patilla T1CKI (RC0).
Cuento pulsos con el timer1 y cuento los desbordamientos (aproximadamente uno cada milisegundo)

Si cuentas durante un segundo consigues una resolución de 1 Hz en 80Mhz (0.013ppm)

Para bajas frecuencias hice lo que te comenta Suky:
   Cuando llega un flanco de subida comienzo a medir en un contador pulsos de reloj (5Mhz)
   En otro contador cuento pulsos de entrada.
   Cada cierto tiempo hay que comprobar los desbordamientos y contarles.
   Cuando ha pasado un segundo, espero a un flanco de subida para detener los dos contadores y calculo la frecuencia:
   
   Frecuencia = Pulsos / tiempo contando

De esta forma es muy preciso. La resolución es de 0.2 partes por millón en todas las frecuencias desde 1Hz hasta 1Mhz.

A partir de 1Mhz merece la pena el otro sistema de medir pulsos durante un segundo exacto.


Saludos.
« Última modificación: 22 de Abril de 2012, 17:56:40 por Picuino »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: frecuencimetro con PIC18F258
« Respuesta #4 en: 22 de Abril de 2012, 22:41:32 »
Con todo esto he tenido una idea, tenia un proyecto el cual media el tiempo entre flancos, pero ahora se me ocurrio usar un timer con la señal externa, que desborde cada 20 flancos y con otro timer medir el tiempo entre desborde y desborde, he conseguido un margen de error muy pequeño, cuando antes tenia sobre 2º de error, ahora tengo 0.5º como mucho (contando que uso el cristal interno el cual tiene un 2% de error creo), a bajas vueltas no he podido medirlo ya que utilizo un motor electrico de un trompo y a pocas rpm este va a saltos, pero me ha gustado bastante mas este metodo, cuando antes tenia una interrupcion cada 700us, ahora a bajas rpm la interrupcion es cada 3ms y a la velocidad maxima cada 700us (y seguro que podria reducirlo aun mas).

Mirando el datasheet he visto que acepta hasta 50Mhz  :shock:

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Re: frecuencimetro con PIC18F258
« Respuesta #5 en: 22 de Abril de 2012, 23:18:25 »
ok ok okey entonces voy a realizar estas modificaciones dividiré el código en dos partes una para bajas frecuencias midiendo el el ancho del pulso con la interrupción CCP1 como lo estaba haciendo salvo que voy a reiniciar el timer del CCP1 cuando llegue el primer flanco correcto ? y esto seria para frecuencias menores a 50Khz que fue lo máximo que pude leer con el CCP1  para el caso de altas frecuencias entonces configurare un timer como contador y otro como temporizador y realizare los los cálculos a partir del tiempo del desborde del timer temporizador y la cantidad de pulsos de timer contador si una pregunta mas si utilizo un cristal oscilador de 20MHz cual es la frecuencia máxima que podría leer??

saludos y muchas gracias por contestar  ((:-))  ((:-))  ((:-))

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: frecuencimetro con PIC18F258
« Respuesta #6 en: 22 de Abril de 2012, 23:39:57 »
Si utilizas un timer asincrono podrias llegar hasta los 50Mhz, de todas formas mira el datasheet, ahi te pone lo maximo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: frecuencimetro con PIC18F258
« Respuesta #7 en: 23 de Abril de 2012, 09:27:48 »
En asíncrono, la máxima frecuencia de entrada no depende del reloj.
El datasheet creo que da fmax = 50Mhz, pero yo he recibido 80Mhz sin problemas con 5 voltios de alimentación.


Saludos.