Generador de onda senoidal de frecuencia variable con pic

Estado
Cerrado para nuevas respuestas.
este es un generador de la onda seno con el pic16f877. espero les sirva.
ah incluye simulacion en proteus:aplauso:


Este código puede aplicarse con los 16F84 o 628 (con las modificaciones pertinentes, claro está)? Por que quiero generar una frecuencia de 5 a 60Hz para un variador.

Saludos!
 
Saludos amigo estoy verificando el programa y se ve muy bueno mañana dios mediante cargo el file .HEX en el f4550, y verifico seria bueno disponer de cuales son las patillas del PIC por donde sale la señal, o el esquema electronico ya que solo en los fil .rar no lo puede visualizar o esta en alguno de file, y se necesita de algun programa para verlos, agradesco su preciada ayuda.

Jhonny Aldana




Hola , estoy haciendo un proyecto en el cual la primera fase es sacar dos ondas seno a traves de los puertos del microcontrolador PIC18 , estas ondas la genero con una tabla de valores de seno que hago en matlab y lo que hago sacarlas por los puertos y estos datos va hacia un DAC, este a su salida me estará generando la onda seno.

ADJUNTO el código de lo antes dicho. :

Código:
#include <18f4550.h>
#fuses hspll,mclr,nowdt,noprotect,nolvp,nodebug,usbdiv,pll3,cpudiv1,novregen,nopbaden
#use delay (clock=48000000)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)


int16 frecuencia=0;
int8 desbordes=0;
int seno[100]={77,82,86,91,96,101,105,109,114,118,122,126,129,133,136,
139,142,144,146,148,150,151,152,153,153,154,153,153,152,151,150,148,146,144,142,
139,136,133,129,126,122,118,114,109,105,101,96,91,86,82,77,72,67,62,58,53,49,44,
40,36,32,28,24,21,18,15,12,9,7,5,4,2,1,1,0,0,1,1,2,4,5,7,9,12,15,18,21,24,28,32,36,
40,44,49,53,58,62,67,72,77};

#int_rtcc
void rtcc_isr(){
        
        frecuencia=read_adc();        
        output_B(seno[desbordes]);
        output_d(seno[desbordes]);
        set_rtcc(frecuencia); 
        desbordes++;
        if(desbordes>=100)
        
        
                     {
                          desbordes = 0;
                        }   
  }

void main()
  {
     setup_adc_ports(all_analog);
     setup_adc(adc_clock_internal);
     set_adc_channel(0);  
     set_tris_b(0x00);
     set_tris_d(0x00);
     setup_counters(rtcc_internal, rtcc_div_4 | rtcc_8_bit);      
     enable_interrupts(int_rtcc);       
     enable_interrupts(global);
     set_rtcc(231);
     desbordes = 0;

   while(true)
   {
   
   }
   }
PREGUNTAS:

los valores de seno en lugar de generarlos por matlab , es posible generar una tabla o Lookup table dentro del mismo y de ahi separarlos en en valores impares y pares. para sacar posteriormente cada arreglo por cada DAC.

Con el esquema que pongo es posible modificar su frecuencia de cierto valor a cierto valor , como configuraria el pic para que este diera su maxima frecuencia posible de salida. tomando en cuenta que la frecuencia maxima de oscilacion del CPU segun microchip es de 48 mhz!
 
Hola yv5kg

En el archivo Gnerador3.rar que adjuntó turkomac, en su mensaje #7, trae una carpeta(Fólder) llamada Gnerador3 y dentro de ella hay varios archivos:
Generador1fase.DSN
Generador1fase.C
Estos son los importantes.
El que tiene la extensión .DSN se abre con ISIS de Proteus.
El que tiene la extensión .C se abre con el compilador C.

Abriendo el .DSN con ISIS de Proteus puedes magnificarlo para ver los números de las terminales.

Ojala puedas verlos en la imagen que te adjunto.

saludos
a sus ordenes
 

Adjuntos

  • Generador1fase.jpg
    Generador1fase.jpg
    248.6 KB · Visitas: 305
  • Generador1fase.zip
    19.2 KB · Visitas: 333
En lugar de usar un conversor analógico digital, tengo pensado usar un 4017 con divisores de tensión en la salida por lo que tengo que sacar una frecuencia 10 veces superior a la necesaria por un puerto del PIC (ejemplo 50Hz para una salida de 5Hz).

Para todo esto he creado un arreglo de periodos para cargárselos al "delay_ms (periodo)"

output_high (salida);
delay_ms (periodo);
output_low (salida);
delay_ms (periodo);

pero tengo problemas con el bucle dado a que la idea es que pueda modificar los valores de periodo para hacer la senoidal variable. ¿Cómo podría hacer en este punto?


Saludos
 
Hola una ves en la escuela nos pidieron generar una señal senoidal con un pic, y lo logramos, usamos un pic 18f2550 y un dac I2C (PCF8591), Aqui les comparto el programa (en PICC) y la simulacion (en isis de proteus v7). el pic esta a 48 MHZ con el PLL con un cristal de 12 mhz. espero que a alguien le sea util


buenas amigo, me ha sido de gran ayuda tu programa pero tengo un problema, la señal que necesito generar debe sere de 400 Khz o por lo menos 200 Khz, pero no he podido hacerlo con tu programas, te agradecería tu colaboración (y)
 
Sugiero una salida PWM de duty cycle variable conectada a un filtro pasabajos RC. Sencillo pero funcional.

Sino, una escalera r2r, donde usaran 8 pines del pic pero es tan simple de usar como escribir un valor en un puerto.

Todo dependera de la perfeccion que se requiera en la senoidal.
 
Yo en una ocasion genere la onda empleando el DAC del PIC12F1822 para generar tonos DTMF, la onda senoidal la represente en 32 puntos. Pero la frecuencia mas alta era 1.633Khz y el tiempo de muestra era 1/(32*F) = 19.15uS. el PIC trabajaba a 16MHZ y el Tcy = 0.25uS.
Viendo tu caso reconstruir una senal de 200KHz en 32 puntos requiere tiempos de muestra de 0.15uS, lo que veo algo complicado en un PIC comun.
El AN655 de microchip explica los dos metodos ya mencionados PWM y resitencias R2R pero las frecuencias no superan los 4KHz.
Pienso que la solucion pasaria por implementar algun circuito VFO o tal vez un PIC DSP.
Saludos,.
 

84afc669f69e578f147efe57bdabc320_7223.gif

 
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba