Autor Tema: generar señal seno con PIC y DAC  (Leído 12403 veces)

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

Desconectado turkomac

  • PIC10
  • *
  • Mensajes: 4
Re: generar señal seno con PIC y DAC
« Respuesta #15 en: 17 de Abril de 2013, 03:09:52 »
De alguna manera se podria generar los valores de seno ahi mismo en el pic y no generarla externamente?

me refiero a que por ejemplo evaluar la funcion seno para determinado numero de valores y que se guarden en una arreglo de datos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5608
    • Picuino
Re: generar señal seno con PIC y DAC
« Respuesta #16 en: 17 de Abril de 2013, 11:41:45 »
Hay una manera de calcular los valores seno con poca precisión y mucha rapidez. Se puede hacer con un polinomio:

   sen(x) = 0.985270841034*x -0.142426981992*x^3

   Error absoluto = 0.0046     Error relativo = 1.4%

O con este otro polinomio:

   sen(x) = 0.99401986481*x -0.147131487165*x^3

   Error absoluto = 0.0088     Error relativo = 0.88%

Este es aún mejor:

   sen(x) = 0.999693019613*x -0.165666997546*x^3 +0.0075124058164*x^5

   Error absoluto = 0.000069     Error relativo = 0.031%    (1/3257)


El valor de x debe estar en radianes.

Saludos.
« Última modificación: 17 de Abril de 2013, 11:43:48 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5608
    • Picuino
Re: generar señal seno con PIC y DAC
« Respuesta #17 en: 17 de Abril de 2013, 11:55:44 »
Aún hay una forma más exacta de calcular el seno y el coseno y es calculando sólo los primeros 45º
   si (x < 45º)   sen(x) = sen(x)
   si (x > 45º)   sen(x) = cos(90 - x)

Los polinomios aproximadores de sen(x) y cos(x) en el intervalo de 0 a pi/4 (45º) son los siguientes:

   sin(x) = 0.999027139959*x -0.160334759967*x^3
   Error absoluto = 0.00015     Error relativo = 0.097%

   cos(x) = 0.998058565503 -0.474755983075*x^2
   Error absoluto = 0.0019     Error relativo = 0.27%

   Para x en radianes.

Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5608
    • Picuino
Re: generar señal seno con PIC y DAC
« Respuesta #18 en: 17 de Abril de 2013, 12:01:01 »
Se pueden calcular los polinomios con rapidez de la siguiente manera:

partiendo de este polinomio:
   sin(x) = 0.999027139959*x -0.160334759967*x^3

se puede calcular:
   xx = x*x
   sin(x) = x*(0.999027139959 - xx*0.160334759967)

Sólo hacen falta tres multiplicaciones y una resta en coma flotante. Se puede realizar con coma flotante de 24bits para mayor rapidez.

Saludos.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: generar señal seno con PIC y DAC
« Respuesta #19 en: 18 de Abril de 2013, 18:55:33 »
Buena informacion Picuino, se agradece.

Desconectado turkomac

  • PIC10
  • *
  • Mensajes: 4
Re: generar señal seno con PIC y DAC
« Respuesta #20 en: 19 de Abril de 2013, 05:33:22 »
Excelente.

Bueno como ando en esto de que quiero hacer un sistema time interleaved con DAC ( es mas comun con ADC ).

time interleaved

entonces necesito hacer lo siguiente , sacar valores o partes del valor de seno por las DACs cumpliendo esta ecuacion Y= DAC1 + DAC2.
pongo un ejemplo espero ser claro y me entiendan.

Y= 10 *sen (2Pi*F*T)
con una frecuencia deseada por ejemplo F=100.

por ejemplo con un T = [0..8 nano segundos ]             


ahora tengo     T=0    Y=0       DAC1 = 0        DAC2= 0 .         aquí inicio en tiempo=0, mantengo DAC1=0.
                     T=1     Y=5.87  DAC1=  0        DAC2= 5.87       aqui hago DAC2= Y (5.87) -DAC1 (0) = 5.87.
                     T=2     Y=9.51  DAC1=  3.64    DAC2= 5.87      se matiene 5.87 Y hago DAC1=Y-DAC2.
                     T=3     Y=9.51  DAC1=  3.64    DAC2= 5.87      se mantiene 3.64 y hago DAC2=Y-DAC1.
                     T=4     Y=5.87  DAC1=  0         DAC2=5.87       se mantiene 5.87 y hago DAC1=Y-DAC2

Y asi sucesivamente.

estoy trabajando sobre un PIC18f4550.

no encuentro la manera o bueno estoy bloqueado , no quiero q me hagan mi código ni nada por el estilo solo una ayudadita para poder empezar , habia pensado algo como esto:

For (y=0;y<=T,y++)
{
Y= sin (2*Pi*F*T)
If Y=PAR  then
Y= DAC1
DAC2= Y-DAC1
if Y=Impar then
Y=DAC2
DAC1=Y-DAC2

salida_puertob(DAC1)
salida_puertod(DAC2)
}

Obvio este Pseudo-pseudo codigo no cumple con el algoritmo que mencione anteriormente , como podria hacer para ir sabiendo como voy a ir intercalando cada DAC con su valor correcto... una pista?

Desconectado turkomac

  • PIC10
  • *
  • Mensajes: 4
Re: generar señal seno con PIC y DAC
« Respuesta #21 en: 23 de Abril de 2013, 19:52:45 »
Hola , genere dicho codigo del problema que habia mencionado . en matlab sale pero no puedo pasar de matlab a pic cc no se por que razon

adjunto mi codigo en PICC

Código: [Seleccionar]
#include <18f4550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay (clock = 48000000)
#use fast_io (B)
#use fast_io (D)
#define PI   
#include <C:\Program Files (x86)\PICC\Drivers\MATH.h>
#define mili 0.001



float f =100;
float amplitud =10;
float periodo=100;
float y;
int t;
int  x;
float DAC1;
float DAC2;

void main ()
{
set_tris_b(0x00);
set_tris_d(0x00);
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
setup_adc_ports( ALL_ANALOG );
delay_us (50);
periodo = read_adc ();

DAC1=0;
DAC2=0;
t=0;
while (1)
{

t=++
x = t*mili;
y = amplitud*(sin (2*PI*f*x));
if (t%2==0)
{
DAC2 = y - (DAC1);
output_B(DAC2);

}
if  (t%2!=0)
{
DAC1 = y - (DAC2);
output_d(DAC1);
}
}

}






Desconectado elotrogonzalo

  • PIC10
  • *
  • Mensajes: 25
Re: generar señal seno con PIC y DAC
« Respuesta #22 en: 16 de Febrero de 2015, 20:33:46 »
Estimados, yo tengo una duda de como generar una tabla para lo siguiente:

Tengo un dac de 7 bit hecho con una red r2r por lo que mi dac va a variar entre 0 y 127 cierto? yo quería hacer una seno de 50Hz con 128 valores. para ello tengo un timer que me interrumpe cada 156 uSeg. Entonces cada 156 uSeg mando un dato al dac. Ahora me imagine que si usamos excel se puede simplificar la cosa y pensé en lo siguiente :

             "[127xSen(wt) + 127]/2"
w = 2pif
t = tiempo
f = 50Hz

w = 314

Ahora como debería hacer variar a t? voy bien por éste camino?. Espero me ayuden.
Saludos!!



 

anything