TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: nbc en 21 de Marzo de 2020, 16:56:34

Título: generar 2 frecuencias con 1 pic
Publicado por: nbc en 21 de Marzo de 2020, 16:56:34
hola amigos , necesito generar 2 frecuencias , no importa si son con salida cuadrada , de 90 y 150Hz  , para un instrumento de calibracion para aviones , un glide slope , para un amigo , lo pude hacer con un 12F629 con delays , dado que la frecuencia es baja ;  el problema es que necesito poder variar un poco una de las 2 para acomodar la fase de las señales , alguna idea ? gracias
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: KILLERJC en 21 de Marzo de 2020, 17:25:53
Va a depender que que tan pequeña las variaciones de fase sean, hablando especialmente de la de 150Hz.

Ya que con eso vas a poder determinar cuando activar o no la salida.

Actualmente como minimo necesitas poder activar cada 1.11ms para poder activar y desactivar las señales de 90Hz y 150Hz. 1.11ms obtenidos de 1/mcm(180,300)

Si quisiera modificar la fase de uno de ellos deberia plantearme una interrupcion cada 1.11ms/n  ms , de esa forma tener una buena resolucion. Obviamente esto depende y mucho de la velocidad del oscilador.
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: Robert76 en 21 de Marzo de 2020, 19:40:08
Hola, utiliza el CCP asociado al TMR, (en tu caso necesitarás dos) seguramente tengas que migrar de PIC, y en lo posible utiliza Cristal a 20Mhz, así tendrás mayor precisión utilizando pre y postscalers.
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: KILLERJC en 21 de Marzo de 2020, 19:51:22
El problema que para esas frecuencias, seguramente necesite usar un cristal de 1Mhz o menos... Pero si, un CCP seria lo mas comodo
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: nbc en 21 de Marzo de 2020, 19:53:56
gracias por las ideas , estaba probando con 12F675 , pero no logro hacerlo andar , este es el codigo :

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   set_tris_a(0b000000);
   output_high(gp5);  //led
   delay_ms ( 500 ) ;
   output_low(gp5);
   delay_ms ( 500 ) ;
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   
   while (true)
   {
     time = get_timer0(); 
     if (time == 104 )output_toggle (gp0) ;
     if ( time == 173 )output_toggle (gp1) ;
     set_timer0(0) ;
   }
   
 
}


es muy simple , pero no funciona , armado fisico , prueba con osciloscopio
que estoy escribiendo mal ?
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: Robert76 en 21 de Marzo de 2020, 20:06:18
Sucede que usas el mismo timer. Y las fcias. NO son múltiplos.
Por otro lado, estás poniendo a 0 el timer casa vez que tomas lectura de él, y debería serlo cuándo alcance algún valor X o por desborde, en la rutina de interrupción.
No debes leer el timer en la rutina principal, porque el valor real del timer estará desincronizado para cuándo el programa lee el valor, y si dicho valor pasó la cuenta, la condición de igualdad no se cumple.
 
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: nbc en 21 de Marzo de 2020, 21:24:46
y donde debo tomar el valor del timer para poder usarlo ?
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: Eduardo2 en 22 de Marzo de 2020, 00:15:26
No entiendo por qué no lo hacés por interrupción.

Siendo la relación de frecuencias 3:5 , llevando un conteo en la interrupción las generás sincronizadas.

Algo asi:

Código: [Seleccionar]
//-------------------------------------------------------------------
#define T     1111    // T para 900Hz
#define Tresp   38    // Delay al atender la interrupcion.

int8 n1=3 , n2 = 5 ;

#INT_TIMER1
void  TIMER1_isr(void)
{
    set_timer1(Tresp-T) ;

    if(--n1 == 0){output_toggle(PIN_A0); n1=3 ;}
    if(--n2 == 0){output_toggle(PIN_A1); n2=5 ;}
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
void main(void){

    set_tris_a(0b11100) ;
    output_a(0) ;
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);     //65.5 ms overflow
    set_timer1(Tresp-T) ;

    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);

    while(1) ;
}
//-------------------------------------------------------------------
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: elreypic2 en 22 de Marzo de 2020, 16:36:07
No entiendo por qué no lo hacés por interrupción.

Siendo la relación de frecuencias 3:5 , llevando un conteo en la interrupción las generás sincronizadas.

Algo asi:

Código: [Seleccionar]
//-------------------------------------------------------------------
#define T     1111    // T para 900Hz
#define Tresp   38    // Delay al atender la interrupcion.

int8 n1=3 , n2 = 5 ;

#INT_TIMER1
void  TIMER1_isr(void)
{
    set_timer1(Tresp-T) ;

    if(--n1 == 0){output_toggle(PIN_A0); n1=3 ;}
    if(--n2 == 0){output_toggle(PIN_A1); n2=5 ;}
}
//-------------------------------------------------------------------

//-------------------------------------------------------------------
void main(void){

    set_tris_a(0b11100) ;
    output_a(0) ;
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);     //65.5 ms overflow
    set_timer1(Tresp-T) ;

    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);

    while(1) ;
}
//-------------------------------------------------------------------

Exclente solución Eduardo2. Ojalá que nbc lo pueda entender e implementarlo.

elreypic.
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: Eduardo2 en 22 de Marzo de 2020, 19:53:17
Es una idea, no se si servirá porque no me queda claro como debe trabajar esto.   
Cuando se refiere a ajustar la fase no se si se refiere a una cierta fase inicial, que implica que la relación de frecuencias sea exacta.
O a un ajuste fino de frecuencia, que implica que la relación no sea exacta sino muy cercana a 3:5
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: KILLERJC en 22 de Marzo de 2020, 21:01:29
Yo imagine que las frecuencias de 90 y 150 por mas generadas que sean, por ahi necesitas atrasar o adelantar un poco la de 150 por ejemplo, sin tocar la otra. Aunque es raro ya que solo van a coincidir cada cierta cantidad de ciclos..
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: nbc en 23 de Marzo de 2020, 12:27:57
hola , recien veo las respuestas , gracias a todos
el tema es que necesito variar un poco una de las dos frecuencias , dejando la otra fija , lo resolvi con 2 pics 675 , que es lo que tengo en 12F , haciendolos oscilar con cristal de 4 MHz en uno , y la entrada del otro a la salida del oscilador , para que la base de tiempo sea la misma y no se produzcan diferencias de frecuencias , luego con retardos genere las frecuencias , ya que son muy bajas y algunos us mas o manos no influyen , pongo el codigo :

///////////////////////////
// oscilador slave  y 15090 hz
///////////////////////////
#include <main.h>

 
void main()
{
   set_tris_a(0b00000000);
   output_high(gp0);  //led
   delay_ms ( 500 ) ;
   output_low(gp0);
   
   
   while (true)
   {
     output_high (gp0);  // s150 Hz   
     delay_us ( 3333 ) ;
     output_low (gp0);  //  b150 Hz 
     delay_us ( 3333 ) ; 
   }
 
}

y del oscilador master :
///////////////////////////
// oscilador cristal y 90 hz
////////////////////////
#include<main.h>

 
void main()
{
   set_tris_a(0b00000000);
   output_high(gp0);  //led
   delay_ms ( 500 ) ;
   output_low(gp0);
   
   
   while (true)
   {
       output_high(gp1);  // s90Hz     11111
       delay_us ( 5555 ) ;
       output_low (gp1);  //  b90 
      delay_us ( 5555 ) ;  // s90 Hz    22222
   }
   
 
}

si alguno se le ocurre otra cosa para usar un solo pic , me avisa
muchas gracias a todos por las respuestas , si puedo ayudar en algo con mucho gusto
me especializo en radiofrecuencia , en el diseño y  fabricacion de emisoras de radio AM , FM  y TV , por el momento hasta 10 KW
si alguien quiere asesoramiento o algo en RF solo me avisan , con mucho gusto colaborare

 
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: elreypic2 en 23 de Marzo de 2020, 20:54:09
Que tal nbc,

Sabiendo que tienes conocimiento de radiofrecuencia podrías decirnos qué es lo que quieres variar un poco? La frecuencia? La fase? De cual frecuencia generada (la de 90 o la de 150Hz)?
Si es la frecuencia la que quieres variar, podrías indicar los rangos?
La información que provees es muy vaga y poco clara.

elreypic.
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: Picuino en 24 de Marzo de 2020, 08:55:57
Yo te recomiendo que leas sobre el NCO que es un periférico muy útil para estos casos y lo puedes encontrar en chips pequeños y baratos.
https://www.microchip.com/design-centers/8-bit/peripherals/core-independent/numerically-controlled-oscillator
Título: Re:generar 2 frecuencias con 1 pic
Publicado por: nbc en 27 de Marzo de 2020, 23:47:30
segun el manual del equipo original , los osciladores L-C se sincronizan con una onda cuadrada de 30 Hz  , y el de 90 se puede modificar un poco para sincronizar los osciladores . muestran un oscilograma que tratare de subir con la forma de onda a conseguir . los osciladores que hice , con onda cuadrada los paso por filtros pasabajos para lograr una senoidal , pero he probado todo lo que se me ocurrio para modificar la fase entre las ondas y no logro sacar la forma original