Autor Tema: Desfasar una señal cuadrada  (Leído 6783 veces)

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Desfasar una señal cuadrada
« en: 25 de Junio de 2018, 01:35:27 »
Amigos.

Les comento, trato de generar dos señales cuadradas de 1khz con dos timers o un solo timer del pic. Pero desplazar una de las dos señales al 50% respecto de la otra. Es posible?. Alguna idea en ccs por favor.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Desfasar una señal cuadrada
« Respuesta #1 en: 25 de Junio de 2018, 07:10:44 »
Hola, sólo tienes que invertir una señal respecto de la otra. Puedes hacerlo por interrupción de un Timer cada 500uS.
« Última modificación: 25 de Junio de 2018, 19:16:19 por Robert76 »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Desfasar una señal cuadrada
« Respuesta #2 en: 25 de Junio de 2018, 08:46:59 »
Creo que por "desplazar al 50%" se refiere a desfasar 90°. 
Para eso necesitaría una interrupción cada 250us e invertir las salidas de manera alternada.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
señal cuadrada
« Respuesta #3 en: 25 de Junio de 2018, 09:29:38 »
Si, en realidad.quiero.descasarla.90grados respecto de la otra. Como crear ese retardo para que inicien una con esa diferiencia de tiempo?.  Voy a intentar iniciar el codigo , pero agradecería también su ayuda para no iniciarlo de una manera erronea.
« Última modificación: 26 de Junio de 2018, 03:17:01 por mariacontenis »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Desfasar una señal cuadrada
« Respuesta #4 en: 25 de Junio de 2018, 10:54:32 »
Si queres una señal cuadrada de 1Khz (periodo 1ms) deberias cambiar la salida cada 500us
Ahora si queres discriminar y hacer ese desfasaje, deberias tener una interrupcion cada 250us.
Pienso que lo simple seria usar una variable cualquiera, cuando es par haces un toggle de una salida, y si no es par haces el toggle de la otra. Esto cada 250us. Resumen:

Código: C
  1. int contador = 0;  // 8bits
  2.  
  3. #int-TMR0
  4. void int_timer(void)
  5. {
  6.    if(contador&0x1)
  7.    {
  8.      output_toggle(PIN_B0);
  9.    }
  10.    else
  11.    {
  12.      output_toggle(PIN_B1);
  13.    }
  14.    contador++;
  15. }

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Desfasar una señal cuadrada
« Respuesta #5 en: 25 de Junio de 2018, 11:22:10 »

Perdón, no queda mas bonito un contador de 1bit ?  :)

Código: [Seleccionar]
    int1 contador = 0;  // 1 bit
     
    #int-TMR0
    void int_timer(void)
    {
       if(contador++)
       {
         output_toggle(PIN_B0);
       }
       else
       {
         output_toggle(PIN_B1);
       }
    }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Desfasar una señal cuadrada
« Respuesta #6 en: 25 de Junio de 2018, 11:30:36 »
Jajaj si, ya que solo importa si es par o impar.

Me pregunto como tomara el ++ para cuando es un bit...
O sera conveniente hacer una XOR ... Eso depende del compilador.. Como no se como es que se maneja, simplemente fui por lo mas simple jeje

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Desfasar una señal cuadrada
« Respuesta #7 en: 25 de Junio de 2018, 13:20:41 »
...
Me pregunto como tomara el ++ para cuando es un bit...
O sera conveniente hacer una XOR ... Eso depende del compilador.. Como no se como es que se maneja, simplemente fui por lo mas simple jeje

Para salir de dudas siempre miro el listado .lst (con CCS) para ver qué compiló.

Para hacer contador++  hace
Código: [Seleccionar]
MOVLW  01
XORWF  contador,F
BTFSC  contador.0
GOTO   xxx

O sea, lo que uno quería.

En cambio, con la instruccion equivalente contador^=1 genera un espanto



Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:Desfasar una señal cuadrada
« Respuesta #8 en: 25 de Junio de 2018, 18:42:39 »
Código: [Seleccionar]

         
         #int_TIMER1
         void int_timer(void)
         {
         set_timer0(59536); // carga del timer para 500us o 0.5ms
         
         if(contador++)
         {
         output_toggle(PIN_B0);
         }
         else
         {
         output_toggle(PIN_B1);
         }     
       

Adjunto imagen y donde deveria medir 250us me da 910us.
« Última modificación: 26 de Junio de 2018, 03:16:22 por mariacontenis »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Desfasar una señal cuadrada
« Respuesta #9 en: 25 de Junio de 2018, 19:37:07 »
Verifica que sea correctamente 48Mhz.

Para 48Mhz, con preescaler 1:1 necesitas aproximadamente 3000 pulsos para 250us, es decir necesitas cargarle 62536 al timer.

Pero vos decis que con el doble (6000 pulsos) obtenes 910us lo cual esta bastante lejos de los 500us que te deberia dar, revisa correctamente el reloj seteado ( al hacer doble click en el PIC diga 48Mhz)

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Desfasar una señal cuadrada
« Respuesta #10 en: 25 de Junio de 2018, 23:02:42 »

Además de lo anterior, en la línea 10 escribiste   set_timer0( )  en lugar de   set_timer1( )

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:Desfasar una señal cuadrada
« Respuesta #11 en: 25 de Junio de 2018, 23:46:15 »
Eduardo2 y KILLERJC, agradezco su ayuda, ya corregí esa parte que me indicaron cada uno y se redujo el error de tiempo, pero aun sigue. Les comparto el archivo haber que opinan de la simulación y el code. Gracias  :)

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:Desfasar una señal cuadrada
« Respuesta #12 en: 26 de Junio de 2018, 02:04:23 »
Bueno pues cargando el timer1 para 3 ms o sea set_timer1(29536); me da la señal cuadrada de 1ms = 1khz. ¿Pero por que?

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Desfasar una señal cuadrada
« Respuesta #13 en: 26 de Junio de 2018, 02:15:27 »

Yo lo simulo y el único error de tiempo que tengo es una frecuencia ligeramente menor de 1kHz.
Eso es debido al retraso desde que se produce la interrupción hasta que llega a set_timer1() , que es de aproximadamente 3uS (no me puse a ver el valor exacto) y se resuelve modificando la cuenta del timer1
Es decir,  la cuenta en lugar de 3000 debe ser (por ejemplo) de aprox 2965  (set_timer1(62571) )


Lo que he notado es que hablás de generar señales cuadradas de 1kHz , generabas interrupciones cada 500us y medías el tiempo entre el flanco ascendente y el descendente.
Para generar estas señales en cuadratura con este algoritmo las interrupciones deben ser cada 250uS y la medición del osciloscopio sobre el ciclo completo. Es decir desde un flanco ascendente hasta el siguiente ascendente.


 

anything