Diseño de algoritmo para Time-Interleaved

hola , ya vi tu codigo , siii tenia muchos problemas de cuando cerrar bucles y asi de sintaxis , bueno al menos la logica no andaba tan perdida , ya habia leido sobre lo de montar la señal sobre un valor de dc para que no tuviera problemas con esos valores negativos.

para lo que ando haciendo me piden que que este en un offset de 0 , osea no tiene que estar montada , esto lo soluciono solo utilizando DACs que acepten como valores de referencia voltaje negativo y positivo, o si tendria que hacer alguna modificacion de soft?.
 
por el DAC no hay mucho lio, las en la codificacion ten en cuenta que un numero negativo undependiente del sistema numerico siempre esta en complemento de modo que su suma siempre es cero, el Problema para los DAC seria "interpretar ese numero en complemento como si fuera negativo". Pero no te hagas lio es mas facil desacoplar el DC del AC mediante un capacitor a la salida de cada DAC, ago asi como el desacople que se usa para la resistencia de carga en un amplificador de pequeña señal.
 
hola @turkomac
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.


amigo otra vez molestando , tengo una duda en tu codigo , entiendo lo que hiciste del offset , pero no entiendo por que la amplitud la defines como 127 ?? he tratado de modificar la amplitud y si cambio a un valor diferente de 127 plop se va la onda y saca puras cosas extrañas , por otro lado mi idea es modificar la amplitud desde mi pic , haciendo a "variable" y que el usuario la defina , en los voltajes de ref- y ref + de mis dacs usare multiplexores analogicos a modo de que el pic vaya seleccionando cierta escala o no se como decirle , -1 , 1 , -5 5 y -10 y 10 volts esto para que si por ejemplo yo no tuviera la opcion de cambiar las ref+/- , si me pidieran una onda de .5 con una ref+/- de 10 v , yo no la veria muy bien , pero si tuviera una ref+/- de 1v pues si. no se si me explico.
 
hola turkomac, te comentoque la amplitud lo defini como constante solo para tenerlo como constante, tambien se lo puede hacer variable sin problemas, el motivo de que sea 127 es que al usar como salida un puerto de 8 bits lo maximo que podria obtener a la salida en de 255. pero como a la salida se le esta añadiendo un offset y ese offset es de 128 la amplitid maximma que obtendria sin que la señal se distorcione sera 127.
si a la amplitud se le asigna un valor mas pequeño, no hay lio funciona igual, pero si se le asigna un valor mas grande, ahi si hay problemas.
Eso de variar la amplitud seria hecho mejor por codigo, variando el valor de la amlitud.
por otro lado puede ser por hardware de preferencia usando un amplificador ya sea de ganancia variable o algo asi como un control de volumen (como en las radios).
 
ooo pues de hecho estuve variando la constante amplitud con valores menores a 127 y se distorcionaba la onda muy feo , lo que hice fue añadir otra variable para modificar la amplitud.

Código:
#include <18f4550.h>
#include <MATH.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#include <MATH.h>
#use delay (clock = 48000000)
#use fast_io (B)
#use fast_io (D)    
#define f         100000000        //frecuencia
#define Ts        0.0000000001      //periodo de muestreo
#define amplitud  127        //
#define offset    128

signed int8 y,t,DAC1=0,DAC2=0,amplitud2;

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(true)
   {
      for(t=0;t<=99;t++)
      {
         y = amplitud*sin(2*PI*f*Ts*t);
         amplitud2 = .3*y;
         if (t%2==0)
         {
            DAC2 = amplitud2 - (DAC1);
            output_B(DAC2+offset);
         }
         else
         {
            DAC1 = amplitud2 - (DAC2);
            output_d(DAC1+offset);
         }
      }
   }
}

trabajare con la DAC de texas instruments TLC5602 la cual podria trabajar hasta 30 mhz , si aplicamos ley de nyquits creo que podria tener un total de 15 o 13 mhz netos , para comunicar el pic con la dac , pues lo hago paralelo , cual seria la maxima velocidad que podria entregar el pic por sus pines? podria configurar por desborde del timer 0 o esto me alentaria mas el proceso?
 
Hola turkomac, es cierto, si la amplitud es muy pequeña la onda se deforma, esto se debe a que por el puerto solo se puede sacar valores enteros, por ejemplo, si tuvieras 1.1, 1.25, 1.5, 1.7, 1.9, el resultado que tendrías en el puerto siempre seria 1.
Por otro lado, si bien el oscilador del pic 18f4550 llega hasta 48Mhz, cada instrucción ocupara 4 ciclos, por tanto la velocidad máxima que tendrás 12MHz (no es exactamente MHz, serían más bien 12 Mega instrucciones por segundo), pero resulta que desde que sale un dato por el puerto hasta que salga otro se tarda más o menos 400us, también hay que tomar en cuenta que son 100 muestras que se toman por cada ciclo, por tanto 400us.*100=40ms, eso es 25 Hz, ten en cuenta que el pic tiene que hacer multiplicaciones del tipo flotante y calcular el valor de la función senoidal y eso toma un buen tiempo.
 
siiii ni tan si quiera llego a un 1khz y necesito frecuencia mucha frecuencia mucha frecuencia , me sugirieron usar el RTOS del pic18 que con eso podria tener y aprovechar los 48 mhz si bien no sacar 48 mhz ( obvio ) pero siiii algo decente tan si siquiera pasar del 1 mhz , si no tendre que usar una memoria fifo asincrona q me dispare los datos hacia el DAC , o usar otro pic que se dedique a calcular y a otras tareas como la interfaz con lcd y teclado matricial y al pic 18 ponerlo solo a sacar datos , pero igual perderia ciclos al hacer la comunicacion , cual seria el metodo mas adecuado ? . adjunto mi diagrama con la etapa de amplitud regulable .
 

Adjuntos

  • generador.rar
    20.7 KB · Visitas: 4
Te comento que usar el rtos no soluciona el problema, el pic tarda mucho tiempo en calcular la funcia seno.
Seria mas conveniente usar tablas, así se incrementaría considerablemente el rendimiento, aún así seria muy complicado llegar a 1M[Hz], sería más factible las centenas de K[Hz] (mhz!=MHz).
 
Última edición:
Hola , perdon por no contestar ,he andado con este lio de q la s Dacs q tengo son soic y ando haciendo un convertidior para poder probarla en el protoboard.

he descargado en internet un proyecto donde un tipo usa dos PICS 16 uno de comunica de la PC -- PIC16 y recibe los datos de amplitud y frecuencia y los muestra en un lcd , de ahi esos datos van a un PIC 16 que solo se encarga de sacar por un puerto a una DAC0800. segun en el proyecto se logra una frecuencia de 3hz a 5Mhz , como habra hecho eso :S ,tengo entendido que esos PICs solo llegan a 20 Mhz en CPU.

Por otro lado como podria regular la frecuencia , veo que lo hace alguno es hacer dentro del ciclo infinito un delay_us (variable_analogica) y van variando desde un potenciometro que es leido desde un canal analogico , habra otra manera? mas precisa de controlar la frecuencia empezando desde cero o casi cero hasta una frecuencia maxima?. Por que tambien habia pensado en serie de pulsador contador que vaya de tal a tal pero tampoco ando muy decidido en eso.

adjunto el proyecto que te mencione anteriormente.
 

Adjuntos

  • proyecto generador de funciones_OJO.pdf
    1.4 MB · Visitas: 7
hola, despues de darle una leida a archivo *.PDF, ese generador de ondas trabaja desde 5m[Hz] (cinco milesimas de Hertz) hasta 3[Hz], por tanto es logico que no tenga problemas.
Respecto a controlar la frecuencia con un potenciomtro o mediante un teclado nucho lio.
el problema real que tienes es el de lograr frecuencias que nesesitas.
 
Hola amigo , pues regresando de nuevo al proyecto , estoy mudando a mikro C ya que tengo una plaquita de desarrollo mini 32 , que consta de un PIC 32 que va a 80 mhz que espero ya solucione mi problema de la velocidad.

Mi idea es que con un teclado matricial yo meter la cantidad en frecuencia y en amplitud ,pa amplitud creo que lo tengo un poco mas claro pero para frecuencia no entiendo como regular la poca frecuencia que tengo , desde 0 a frecuencia max , puedo regularlar pero lo unico que hago es ir de un valor a cierto valor y eso usando una entrada analogica con un pot y con eso regulo un delay pero hasta ahi :s , hay algun otro metodo que pueda leer o algo asi?

por cierto amigo los puertos de salida q tengo estan incompletos como podria usar dos puertos para lograr mis 8 bits de salida , como los ordenaria :S no me habia topado con algo asi jeje.

uso "output_b( variable_8bits)" como usaria mitad de un puerto y mitad de otro puerto y sacarlos en orden? jeje.

saludos. gracias de antemano.
 
Otra vez a la carga....
En mikroC no existe la funcion output_x(); .
Para el caso de mikroC se puede usar este truco
dato=Xx //varable de 8 bits
portx=dato & 0x0f //saca por el puerto x los cuatro bits menos significativos de la varaible dato
porty=(dato & f0)>>4 //saca por el puerto y los cuatro bits mas significativos de la variable dato


la fecuencia mejor si la introduces mediante el teclado y con multiplicadores (x1 x10 x100 x1k x10k ...)
 
ok muchas , gracias , por el dato del manejo de los puertos con mikro c , aunque es C , vaya que si cambian algunas cosas , solo he trabajado en PICC.

con respecto a la frecuencia , entonces solo tendria que modificar la variable frecuencia desde un teclado y listo? o tengo que hacer algo mas , se me hace relativamente sencillo jejejeje , intentare con eso , no vemos y muchas gracias por tu tiempo y ayuda
 
Atrás
Arriba