Autor Tema: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo  (Leído 23376 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #30 en: 07 de Enero de 2008, 21:10:53 »
jeremy, la precisión la vas a obtener cuando tu programa pueda acumular cuantos mas ticks de Timer que te sea posible entre dos flancos sucesivos.

Si cada tick de Timer avanza cada 0.2 uS será esa la precisión máxima que podrás alcanzar.

Y tantas veces esa precisión como ocupe, o tarde, tu programa en "recoger" los valores de dos flancos sucesivos será el ancho mínimo de pulso que podrás detectar.

Por ello cuanto más rápido corra tu PIC menor será el pulso que pueda detectar y mayor será la precisión con que lo haga. Yo hasta ahora para alcanzar la máxima precisión he utilizado los 18F de la serie USB para poder ponerlos a 48 Mhz, usando la PLL interna con un cristal externo de 20 Mhz.  :mrgreen:

P.D.: uSxTick es el tiempo que tarda en incrementarse una posición el Timer. Por ello depende directamente del cristal u oscilador que utilices. Es imprescindible colocarle a uSxTick  el valor correcto (1/ FOSC * 4) o si nó no valdrá de nada todo el resto del programa.

« Última modificación: 07 de Enero de 2008, 21:15:10 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Estoy usando el pic 12F683 y ese no trae la opcion de PLL y pues solo puedo usar su oscilador interno de 8Mhz para leer un pulso de 1Mhz (el SQW/OUT del DS1307), y queria saber si con esta oscilacion puedo leer exactamente eso ?? Esq intento verificar por esa salida del RTC si el cristal con q lo e montado esta en buenas condiciones (leer exactamente la frecuencia del SQW) yaq comunmente me vienen fallados esos crsitales de 32.768Khz y como los voy a utilizar para un proyecto serio pues necesito verificar esto con buena precicion.

Decirt q solo quiero esto para leer ese SQW/OUT a 1Mhz, por eso quiza no necesite de los 48Mhz en el pic pero si q quiero q sea bien preciso para q si hay una mala lectura entender q es el cristal de 32.768Khz el q esta fallando y no el cristal del pic o el mismo pic. Claro q para esto necesitare del desbordamiento del TMR1 o TMR0.

Gracias, salu2.

PD: Q valor en uSxTick pusist usando 48Mhz en el pic? porq haciendo los calculos correspondientes en la calculadora de la PC me sale un numero infinito con e-4 o algo asi no recuerdo  :-)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Disulpen el doble post.
Mira, e avanzado con mi programa y me a qedado asi, con interrupciones en tmr1 y todo  :mrgreen::
Código: [Seleccionar]
#INCLUDE <12F683.h>

#FUSES HS
#FUSES INTRC
#FUSES NOWDT
#FUSES PUT
#FUSES MCLR
#FUSES NOPROTECT
#FUSES NOCPD

#USE DELAY(clock = 8 000 000)

#USE RS232(baud = 9600, xmit = PIN_A0, FORCE_SW)

float const us_por_tick = 0.5;   //Cada 0.5 microsegundos se producira un tick de timer1, dada por la formula: 4 / (FOSC(Mhz)).
int1 hay_pulso_contado = 0;
int8 numero_de_flanco_alto = 0;
int16 veces_desbordado, periodo_alto_en_ticks;
float frecuencia_hz, periodo_en_us;

#INT_TIMER1
void desbordamiento_tmr1()
{
   if (hay_pulso_contado == 0)
   {
      veces_desbordado++;     
   }
}
                   
#INT_EXT
void SQW_OUT()
{
   if (hay_pulso_contado == 0)
   {
      numero_de_flanco_alto++;     // Cuento flanco que nos llega
 
      if (numero_de_flanco_alto == 1)
      {
         veces_desbordado = 0;
         set_timer1(0);
      }
   
      if (numero_de_flanco_alto == 2)
      {
         periodo_alto_en_ticks = get_timer1();     
         numero_de_flanco_alto = 0;
         set_timer1(0);
     
         hay_pulso_contado = 1;
      }
   }
}


void main()
{
   setup_oscillator(OSC_8MHZ);
   
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
       
   delay_ms(300);
   
   printf("\fProbador de DS1307 y Cristal 32.768Khz");
         
   delay_ms(300);
     
   ext_int_edge(L_TO_H);
   
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   while (TRUE)
   {
      if (hay_pulso_contado == 1)
      {
         periodo_en_us = us_por_tick * ((65536 * veces_desbordado) + periodo_alto_en_ticks);
         
         frecuencia_hz = 1 / (periodo_en_us / 1000000); // Calculo la Frecuencia
           
         printf("\r\n\nuSegundos: %3.1f  F: %4.2f Hz  IntT1: %Lu", periodo_en_us, frecuencia_hz, veces_desbordado);
         
         hay_pulso_contado = 0;
      }
   }
}

Con resultados algo satisfactorios yaq estoy en protoboar aun.



Necesito de tu aprobacion!  :D

PD: Aun tngo las dudas sobre si el cristal q estoy usando ahora esta bien del todo  :? Porq como ves, necesito de una buena precicion para contar el SQW/OUT en ese pic.

Gracias por todo.
salu2 8)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #33 en: 11 de Enero de 2008, 19:39:20 »
Amigo Jeremy, vas bien.

Con tus uSxTick a 0.5 uS una vuelta de Timer1 (16 bits) es de 65.536 * 0.5 us son 32.768 uS por vuelta al que podemos llamar uSxDesb.

Luego puedes calcular cada tiempo como Ticks x uSxTick + Desbordes * uSxDesb.

Así una pareja de datos de un par de flancos sucesivos del estilo:

Primer Flanco    en Ticks 60.000 Desborde 21
Segundo Flanco en Ticks  1.000 Desborde 23

Estarían separados por ((65.535 - 60.000) + 1.000 Ticks * uSxTick) + (1 * uSxDesb)

La explicación:

Para llegar (en tiempos) desde el Primer Flanco hasta el Segundo Flanco el Timer1 tiene primero que llegar desde los 60.000 (en el desborde 21) hasta 65.535, pasar de nuevo a 0 (y provocar el desborde 22), recorrer todos los 65.535 ticks de ese desborde, volver de nuevo a 0 (y provocar el desborde 23) y alcanzar los 1000 ticks (del desborde 23)

Así tenemos (en orden de aparición) 5.535 + 65.535 + 1000 Ticks.

Si llamamos TicksPf y DesbordesPf a los del primer flanco y TicksSf y DesbordesSf a los del segundo la fórmula para calcular cuantos Ticks y microsegundos hay entre ellos incluyendo los sucesivos desbordes sería:

Código: C#
  1. if(DesbordesPf == DesbordesSf ){ // están en el mismo desborde
  2.    TicksDiff = TicksSf - TicksPf;
  3. } else { // Están en distintos desbordes
  4.    TicksDiff = (65535 - TicksPf ) + TicksSf + ((DesbordesSf - DesbordesPf - 1) * 65535;
  5. }
  6. TiempoSep = TicksDiff * uSxTick;

 :mrgreen: :mrgreen: :mrgreen:
« Última modificación: 11 de Enero de 2008, 19:53:08 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Jojo! algo complicado de entender  :lol:, pero lo estare analizando. Muchas gracias. Mi formula para hallar el tiempo (us) cn todo y desbordes es correcta?

Por no molestar mas solo quisiera saber q valor pones en uSxTick cuando usas 48Mhz (cn PLL y eso claro) ?? Segun la formula (4/FOSC) saldria 0.08333... Yo lo tengo solo como 0.0833, esto puede hacer una mala prescicion? es necesario poner mas 3 como la division lo indica ?  :?

Ahora si me callo!  :-)

Gracias.
salu2 8)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #35 en: 12 de Enero de 2008, 07:35:20 »
(1/FOSC) * 4 -> 1/48000000*4 -> 0,083333333333333333333333333333333 periódico. Así que ponle la cantidad de treses que desees, cuantos mas le pongas mas cerca estarás de la verdad que siempre te sera inasequible.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Si q me bajaste la moral  :D Creo q me limitare a usar el de 20Mhz o uno mayor q tenga una division exacta y q pueda soportar el pic.

Ya os comentare  :P

Gracias.
Salu2 8)

Desconectado fastyx2

  • PIC16
  • ***
  • Mensajes: 109
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #37 en: 14 de Enero de 2008, 21:58:49 »
Tengo una duda : que ocurre cuando tenes que hacer una comparacion entre los valores de frecuencia , y esa comparacion en el main en tiempo es mas grande que lo que tarda el dato en estar listo para ser comparado?

desde ya gracias

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #38 en: 15 de Enero de 2008, 04:20:00 »
Ufff Imagino que hacer un muestreo y saltarme ciclos ...
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado fastyx2

  • PIC16
  • ***
  • Mensajes: 109
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #39 en: 15 de Enero de 2008, 08:01:45 »
esto te lo pregunto porque estoy haciendo una controladora que tiene que manejar un motor de continua que regula las rpm modificando el acelerador de la boma de inyeccion de un grupo electrogeno.

el tema es que en el main necesito comparar 3 situaciones definidas : cuando esta en regimen normal ( que se apague el puente H ) , cuando esta por encima ( que el puente H baje las rpm , y que las suba si esta por debajo.

esto implica que , al ser el puente H con reles , yo deba agregar un tiempo muerto en el caso que cambie la direccion de regulacion , de manera que el tiempo de la comparacion es mucho mayor que el tren de datos disponibles creados a partir de las interrupciones externas.

lo unico que se me ocurre es des_habilitar las interrupciones durante la comparacion en el main , y al finalizar volver a habilitarlas , ya que no tiene mucho sentido tener pulsos en la " sala de espera".

Desconectado julietgolf

  • PIC10
  • *
  • Mensajes: 15
    • Mi Página (aún está en construcción...)
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #40 en: 10 de Marzo de 2008, 19:22:34 »
excelente, como siempre.... E X C E L E N T E ! ! !   :-/
Muchas gracias RedPic! Me hasido de gran utilidad...
...::: Un feliz usuario de Debian Linux (e17) y amante de los PIC :::...

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Hola RedPic...me interesa mucho este método para medir la frecuencia de mi señal generada pero tengo unas dudas..

Yo utilizo C18 con mplab...es compatible este código con C18??O tendría que cambiar muchas cosas?
Podría utilizarlo con un cristal de 4MHz??
La señal cuadrada que tengo generada debe ir a RB0 obligatoriamente para poder usar el sistema de interrupciones o puedo usar otro puerto??

Espero su respuesta...muchisimas gracias!


 

anything