Y por q no usas la funcion sin() de la libreria math.h?Noooo! ocupa muchas instrucciones, es imposible hacer algo 10kHz con eso :?
Yo una vez haciendo un filtro digital hice un oscilador sin querer jeje, pero no guarde el codigo :(
saludos!
#include <18f452.h>
#use delay(clock=40000000)
#include <math.h>
void main(void)
{
float t;
const float p = 0.00005; //muestreo requerido de 20kHz
float f = 10000.0; //frecuencia senoidal
const float dos_pi = 6.2831;
int8 salf;
int8 salida;
while(1)
{
salf = 255.0 * sin(dos_pi * f * t);
salida = (int8)salf; //aquí falta desplazar la muestra a polaridad positiva pero bueno XD
t += p;
if(t>1.0)
t=0;
}
}
Exacto, y yo crearía una única tabla de 256 valores, para usar un "puntero" de 8 bits para no usar esta rutina:
Los niveles de tensión son exactamente los mismos, si siempre muestreo por ejemplo con 16 muestras por periodo de la señal, claro esta que la frecuencia de muestreo va a variar en cada caso, pero es una solución rápida dentro de un pequeño rango de frecuencias. Después para la generación lo único que se varia es el tiempo en presentar las muestras.Exacto, y yo crearía una única tabla de 256 valores, para usar un "puntero" de 8 bits para no usar esta rutina:
Suky, ¿pero cómo modificarías la frecuencia y el periodo de muestreo si la tabla se calcula con f y t constantes? Según entiendo esa tabla de 256 valores sería a partir de una f y una t, pero al cambiarlas la tabla dejaría de servir.
Tendría que tener muchas tablas, cada una con un par de f y t. :?:
Me has convencido, tienes razón. Es solo cuestión de estirar o comprimir la senoidal... incluso se podría generar solo el semiciclo positivo y negar el otro. :mrgreen:Claro a eso me refería, estirar o comprimir la señal. Eso para un determinado rango de frecuencias, porque para generar 50 Hz con 16 muestras creo que tiene muy poca resolución :undecided:
Lamentablemente, con o sin retrasos, solo he podido llegar hasta 1.2Khz con un clock a 16Mhz (por cierto ¿cuál es el clock maximo q han utilizado con un 18F452?)
#fuses h4
#INCLUDE <math.h>
static int salida[200]={};
float temp;
float incremento=((2*pi)/199);
float fase;
i=199;
x=0;
//SEÑAL SENOIDAL
case 3:
{
for(fase=0;fase<=(2*pi);fase+=incremento)
{
temp=ceil((0.5*sin(fase)+0.5)*255.0);
strcpy(salida[x],(int)temp);
x++;
}
while(salir)
{
delay_ms(1);
output_d(salida[i]);
i--;
if(i==0){i=199;}
}
break;
}