Autor Tema: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?  (Leído 6620 veces)

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

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« en: 07 de Diciembre de 2011, 20:45:49 »
Bueno, llevo un tiempo dándole vueltas a este tema, y no sé cual es la mejor manera de hacerlo. Si alguien con más experiencia puede echarme una mano (que no sea al cuello), será bienvenida:

Mi problema es que necesito medir el tiempo de desfase entre el flanco de bajada de 2 señales diferentes (que van a patas de entrada distintas). Las señales son de tipo pulso binario, del mismo periodo, y el PIC que estoy utilizando es el dsPIC30f2010, programando con el C30. La primera la estoy generando usando el módulo PWM, y la segunda viene siempre retrasada respecto de ella un determinado periodo (constante).

El dsPIC30f2010 dispone de 3 temporizadores, 6 salidas PWM, y 2 módulos de captura, que creo que son los recursos que pueden resultar útiles para esto.

Se me han ocurrido varias formas de hacerlo, pero siempre me encuentro con el mismo problema: Demasiado consumo de tiempo de la CPU. Y es que estas señales van a una frecuencia de 300 Khz, con lo cual cuando intento leerlas mediante código, el valor que obtengo no es el real, debido a los tiempos que tarda el PIC en procesar el código (estamos hablando de microsegundos, que aquí son muy valiosos).

Le he dado mil vueltas y no logro idear un método que funcione correctamente. Necesito otro punto de vista. ¿Alguien tiene alguna idea?

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #1 en: 07 de Diciembre de 2011, 22:50:53 »
lo mejor que puedes hacer es:

activas un timer el cual pueda medir el desfase (tiempo). Pones 2 interrupciones externas para cada pin. Cuando la señal A baje (en caso de que quieras comprobar el desfase entre pulsos de bajada) se activa la interrupcion1, pones el timer a 0. Ahora cuando se active la interrupcion2 (señal B) lees el valor del timer.

Con ese dato del timer ya puedes calcular el tiempo de desfase calculando cuanto vale cada valor del timer (segun prescaler, cristal...).
A una buena velocidad del pic no deberias tener problemas ya que las interrupciones unicamente ponen a 0 el timer, y leen el valor del timer, cosa que consume muy pocos ciclos, para el calculo lo haces en el main.

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #2 en: 08 de Diciembre de 2011, 08:04:02 »
Gracias, MerLiNz. Algo así ya lo he intentado. El problema es que, como las señales tienen una frecuencia tan elevada, el PIC se queda atendiendo a las interrupciones, que se suceden una tras otra, y lo que va en el programa principal no llega a ejecutarse. Además, que hay que atender más entradas, que llevan sus propias interrupciones y código. He probado a desactivar las interrupciones debidas a esos pulsos una vez se ha leído un dato, y volverlas a activar desde el programa principal cuando éste se ha procesado, pero eso necesita bastante código adicional, ya que al hacerlo así hay que controlar cuando se activan de nuevo cual es la que se ha producido primero y decidir si hay que guardar el dato o no, lo cual lleva más código dentro de las interrupciones y consume más tiempo.

Lo ideal sería un método que fuera cuasi-automático, donde el código a ejecutar dentro de las interrupciones fuera mínimo, pero no se me ocurre cual podría ser el ideal (a lo mejor, no es posible lo que estoy pidiendo).

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #3 en: 08 de Diciembre de 2011, 09:59:52 »
300khz para un pic a 30MIPS no es tan elevada. A no ser que tengas demasiado codigo que procesar. De todas formas mira el modulo input capture a ver si sirve para tu proposito.

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #4 en: 08 de Diciembre de 2011, 11:19:57 »
300khz para un pic a 30MIPS no es tan elevada. A no ser que tengas demasiado codigo que procesar. De todas formas mira el modulo input capture a ver si sirve para tu proposito.
Ok. Voy a probar a conectar una entrada al módulo de captura IC1, otra al IC2, y configurarlas ambas para que capturen el tiempo del Timer 2. Si pongo la activación del IC2 en la interrupción del IC1, me aseguro de que siempre capturen el tiempo en el orden correcto (primero se activa la IC1, y cuando se produce el cambio de estado a bajo de su señal de entrada, captura el valor del Timer 2 y habilita IC2). Luego, en la interrupción de IC2, con sólo restar los valores del Timer 2 capturados por IC2 e IC1 debería obtener el tiempo de desfase, sin más lógica adicional que pueda ralentizar el proceso.

Haré unas simulaciones a ver si consigo mejorar la velocidad de obtención de datos. Muchas gracias de nuevo, MerLiNz....

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #5 en: 08 de Diciembre de 2011, 13:28:13 »
300khz para un pic a 30MIPS no es tan elevada. A no ser que tengas demasiado codigo que procesar. De todas formas mira el modulo input capture a ver si sirve para tu proposito.

Estas bastante equivocado. Haciendo un par de cuentas te das cuenta que es imposible obtener algo adecuado. Por ejemplo pensemos que las 2 señales están desfasadas 10 ciclos de reloj. Ocurre el primer flanco, tenes un par de ciclos de latencia, más un par de ciclos de guardado de contexto más los ciclos para leer el timer, eso debe dar cerca de 35 ciclos. Entonces al salir de esta interrupción ingresa a la siguiente, que ocupa un tiempo similar, o sea que mas o menos podes medir la diferencia de 35 a 40 ciclos de reloj como mínimo.

Ahora trabajando a 30MIPS, 40 ciclos de reloj son 1.3 us. El periodo de la señal es 1/300kH= 3.3 us.. O sea, podes detectar como minimo un angulo de desfasaje de 90º  :z)

Seguramente si lo trabajas en ASM vas a mejorar un poco los resultados, pero para nada optimo.

Lo que vas a tener que implementar es un circuito externo que permita crear un pulso igual al desfase entra las señales y con esa señal ingresar al input capture, configurarlo para capturar un flanco ascendente y descendente consecutivos (utilizar el buffer FIFO, no se si dsPIC30F tiene, los 33F seguro), creo que es lo más adecuado.

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

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #6 en: 08 de Diciembre de 2011, 15:11:13 »
35 ciclos para borrar un timer? Lo veo excesivo, yo mismo he contado cuanto tarda en entrar y salir de una interrupcion (no_auto_psv,shadow) y han sido 5tcy o asi como mucho.
Mi idea es, cuando la primera señal de la interrupcion se limpiar el timer, y cuando la segunda ocurre se guarda el timer en una variable.

algo como:

void int0() {
TMR1=0;
}

void int1() {
variable=TMR1;
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #7 en: 08 de Diciembre de 2011, 15:51:27 »
35 ciclos para borrar un timer? Lo veo excesivo, yo mismo he contado cuanto tarda en entrar y salir de una interrupcion (no_auto_psv,shadow) y han sido 5tcy o asi como mucho.
Mi idea es, cuando la primera señal de la interrupcion se limpiar el timer, y cuando la segunda ocurre se guarda el timer en una variable.

algo como:

void int0() {
TMR1=0;
}

void int1() {
variable=TMR1;
}

Has las pruebas necesarias antes de afirmar algo  ;-)

Igualmente, si ocurriera el milagro  :mrgreen: , la resolución que obtengas va a ser muy mala, lo mejor es usar una sola entrada para el input capture, guardar los 2 eventos (lo hace por hardware, no interviene el código) y después leerlos. Podes generar la interrupción en el segundo evento (Aclaro que estoy más familiarizado con los PIC24 y dsPIC33)


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

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #8 en: 08 de Diciembre de 2011, 18:49:19 »
Lo que dice Suky acerca de los tiempos que se tarda en atender una interrupción es correcto. Lo he programado de varias formas, y desde que "salta" la interrupción hasta que se empieza a ejecutar el código contenido en ella pueden transcurrir valores del orden que él indica (35 ciclos). Por eso le estoy dando tantas vueltas.

Por cierto, Suky, lo que no entiendo bien es lo que dices de usar una sóla entrada para el input capure. ¿Te refieres a meter las 2 señales juntas en el IC1, por ejemplo?

Yo lo que había ideado era poner un Timer a contar, usar la primera señal como entrada para el IC1,  la segunda como entrada para el IC2, capturando los valores del Timer con los flancos de bajada, y en la interrupción del IC2 (cuando ya ha capturado los 2 valores, y ya puedo pararlo hasta procesar el dado), obtener la diferencia entre los 2 valores capturados.

Tengo que simularlo para ver qué tal funciona. Mañana lo haré. Mientras tanto, si Suky puede aclararme el método que comenta, se lo agradecería (por cierto, lo que me dice de usar un circuito externo para generar pulsos me temo que no es posible).

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #9 en: 08 de Diciembre de 2011, 19:47:25 »
La idea es implementar un circuito adicional que a partir de las dos genere una señal para ser testeada por el microcontrolador. Por ejemplo una compuerta NOR me parece que generaria un pulso igual al desfase, es mas o menos la idea.

Sino implementar dos input capture pude funcionar, aunque hay que estudiar todas las opciones posibles que se pueden dar, dado que de esa forma no se puede forzar a una de las entradas como desencadenadora.

Saludos
« Última modificación: 08 de Diciembre de 2011, 19:51:41 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Cómo leer tiempo de desfase entre 2 pulsos de señales?
« Respuesta #10 en: 09 de Diciembre de 2011, 18:42:40 »
Bueno, pues al final después de muchas simulaciones, he ideado un método que parece funcionar bien:

Utilizo el Timer 2 y los módulos de captura de captura de entradas IC1 e IC2, donde he conectado como entradas mis señales 1 y 2 respectivamente.

Cuando deseo capturar el desfase, inicio el Timer 2 y habilito IC1.
Cuando se produce el pulso de bajada de la señal 1, el IC1 captura el tiempo del timer, y genera una interrupción, en la cual habilito el IC2.
Cuando se produce el pulso de bajada de la señal 2, el IC2 captura también el tiempo del timer, y genera una interrupción.
En esta segunda interrupción calculo el tiempo de desfase (el leído por el IC2 menos el leído por el IC1), deshabilito los ICs y el Timer2 para poder procesar el dato.

He visto que entre que se produce el pulso en la señal 1 y se empieza a ejecutar el código de su interrupción hay uno intervalo de unos 10-20 ciclos de reloj. Esto puede causar que, si el desfase entre las señales es muy pequeño, para cuando se ha habilitado el IC2 ya haya pasado el pulso de bajada. Así que lo que hago es, una vez calculado el tiempo IC2-IC1, lo comparo con el periodo de la señal. Si es menor que el periodo, el valor que tengo es el desfase. Si es mayor que el periodo, es que se le escapó el primer pulso y el que ha capturado es el segundo, así que le resto el valor del periodo y ya tengo el desfase.

No ha sido fácil, pero yo creo que así debería funcionar. La próxima semana lo probaré en el circuito, a ver qué resultado obtengo. Gracias de nuevo a todos por la ayuda.