Diseño de algoritmo para Time-Interleaved

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

http://userver.ftw.at/~vogel/TIADC.html

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?
 
La verdad, no entiendo. Si vas a hacer un multiplexado tal que Y = DAC1 o DAC2, entonces basta con enviar a DAC1 las muestras impares y a DAC2 las muestras pares, no hay necesidad de hacer ninguna operacion matematica.

Si por otra parte dijeras que la salida es, por ejemplo, la suma de la salida de los DAC, entonces tiene sentido lo que planteas.
 
La verdad, no entiendo. Si vas a hacer un multiplexado tal que Y = DAC1 o DAC2, entonces basta con enviar a DAC1 las muestras impares y a DAC2 las muestras pares, no hay necesidad de hacer ninguna operacion matematica.

eso podria tener sentido si cada valor que se evalua para T fuera impar o par , bueno eso es lo que creo yo.

Si por otra parte dijeras que la salida es, por ejemplo, la suma de la salida de los DAC, entonces tiene sentido lo que planteas.

en si cada salida de cada DAC ira a un sumador , el cual al sumarse me tiene que dar la onda sena ya reconstruida. lo que tu dices no lo hago dentro del PIC si no ya afuera , del pic , es por eso que si tendria sentido lo que digo .

O no entiendo por que dices q no tendria sentido... saludos y gracias por tu opinion
 
Entonces

Digamos que la variable del lazo la llamamos t

Si t es par
DAC2 = Y(t) - DAC1

si t es impar
DAC1 = Y(t) - DAC2

y en todo momento, como ya me aclaraste y se me habia pasado por alto, la salida del sistema es la suma de las dos DAC
 
Última edición:
bueno para mi si tiene sentido lo de ir multiplexando por impar o par , peor entonces para valores como 5.87 ??? , ya no cumpliria con esa norma.

o bueno se me ocurrre que como tengo que pasar esos valores a valores de entre 0-255 , entonces si aplicaria impar o par no? .
 
No entiendo cual es el problema

Hace el programa con esas ecuaciones y te tiene que andar para todos los casos.

Si te molesta que DAC2 no cambia de valor en tu ejemplo, eso es debido a que la salida para T=2 y 3 se mantuvo constante, por eso DAC2 no varia.
 
Última edición:
bueno probare a ver que tal. y regreso ... y bueno no me confunde que 5.87 se repita en dac2 , si no me refiero a que ese numero no es par pero tampoco es impar , a eso me referia.
 
No, todavia no te entiendo. Al usar dos DAC tenes que mandarle a uno la diferencia entre el valor actual y el valor anterior para las muestras pares, y al otro, la diferencia entre el valor actual y el valor anteror para las muestras impares. El parametro t que controla el lazo es el que te dicta si hay que actualizar al DAC1 o al DAC2. El valor que asume Y encada momento no interesa para decidir a que DAC actualizar.


Algo asi
DAC1=0, DAC2=0

For (t=0;t<=T,t++)
{
Y= sin (2*Pi*F*t)

If t=PAR then
{
DAC2= Y-DAC1
salida_puertod(DAC2)
}
if t=Impar then
{
DAC1=Y-DAC2
salida_puertob(DAC1)
}
}
 
Última edición:
he hecho esto en matlab asi de rapido y pues si se cumplen y si salen los valores ,pero no todos no se que se me esta pasando por ahi , pero es obvio que si se multiplexa con impar o par.

F=100;
DAC1=0;
DAC2=0;
for T= 0:1:8
X= T*1e-3;
y= (sin (2*pi*F*X))*10;
if(mod(T,2)~=0)
DAC2 = y -DAC1
else
DAC1 = y - DAC2
end
end
 
hola @turkomac
A ver si entendi bien el problema...este codigo de matlab soluciona el problema.

clear;
clc;
f=100;
fm=1000;
Ts=1/fm;
x=0:8;
y=10*sin(2*pi*f*Ts*x);
dac1(1)=y(1);
dac2(1)=y(1)-dac1(1);
for n=2:length(x)
if mod(n,2)==0
dac2(n)=y(n)-dac1(n-1);
dac1(n)=dac1(n-1);
else
dac1(n)=y(n)-dac2(n-1);
dac2(n)=dac2(n-1);
end
end
suma=dac1+dac2;
 
hola probare tu codigo , mira hice este codigo en matlab y pues si me sale lo que quiero segun yo claro. jeje Ahora mismo lo probare en el pic a ver q tal.

mira mi código.
f=100;
amplitud=10;
DAC1=0;
DAC2=0;
for t=0:1:8
x= t*1e-3;
Y = amplitud*(sin (2*pi*f*x));

if (mod(t,2)~=0)
DAC2= Y - (DAC1)

else

DAC1= Y -(DAC2)
end
end
 
sii es ya lo ando haciendo para PICC , pero tengo una duda los valores que voy sacando por los puertos tengo escalarlos en 0 -255 ?? . lo pregunto por que en los ejemplos que he visto donde usan tablas de valores de seno , los calculan y de ahi esos valores por medio de una regla de 3 los pasan a valores de 0 a 255 . me imagino que es lo mismo en este caso no ?
 
hola , hice este codigo en PIC C compiler pero no se por que no empiezo a sacar valores por los puerto , no se si estoy aplicando mal el bucle. o de plano ando mal en la programada.

Código:
#include <18f4550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay (clock = 48000000)
#use fast_io (B)
#use fast_io (D)
#define PI     3.1415926535897932
#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 ();

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);
}
}

}
 
Última edición:
Código:
#include <18f4550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay (clock = 48000000)
#use fast_io (B)
#use fast_io (D)
#define PI     3.1415926535897932
#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);
}
}

}

pues mira ya lo habia probado asi como dices y lo unico que hace mi simulacion en proteus es sacar un valor y ahi se que queda :s con un valor fijo.

y si le pongo ; a t=++ , me marca error el compilador , segun lo que hago con t++ es incrementar indefinidamente t , empezando con t=0
 

Adjuntos

  • generador.rar
    18.1 KB · Visitas: 7
Última edición:
pues con la libreria math.h ya no es necesario o si ?? , bueno ahorita edito esto , pero si le pongo la " ; " me marca error :s !! entonces no se que onda , esperaria al menos estar sacando datos , pero digamos que solo mando un dato y ahi se queda ya no hace nada , no se si viste mi simulacion?
 
No puedo ver la simulacion, pero si t++ no te anda proba con lo mas simple, t=t+1. Co respecto a PI, si ya esta definido en math, entonces no vuelvas a definirlo vos porque cambias su valor. Una ultima aclaracion, las librerias float ocupan mucho lugar. zsi es solo para la simulacion esta bien, pero si queres hacerlo de verdad conviene otros metodos, como usar tablas de valores enteros para la funcion sin y cos.
 
hola @turkomac, te comento que el programa que tienes esta bien (conceptualmente), pero no olvides que una funcion seno tiene valores pocitivos y negativos y por el puerto solo puedes sacar valores pocitivos (1d->00000001 y -1d->11111111) por lo que tu DAC no funcionaria correctamente. Para solucionar el problema es mejor usar un offset para que los valores negativos se vuelvan pocitivos y asi el DAC no tendra problemas.
Adjunto una sugerencia para resolver el problema.
Como la frecuencuencia de la onda senoidal es 100[Hz] y tu incremento de tiempo es de 1m solo tendras 10 muestras por cada ciclo y 5 muestras en cada salida (DAC1 y DAC2) por lo cual no se ve bien, se ve mucho mejor si la frecuencia de la onda sonoidal fuera de 10[Hz], asi tendrias 100 muestras de la misma y 50 muestras en cada DAC.
 

Adjuntos

  • generador_.rar
    81.7 KB · Visitas: 5
Atrás
Arriba