Vous êtes sur la page 1sur 10

Procesamiento Digital de Seales

Universidad Nacional de Crdoba Facultad de Ciencias Exactas, Fsicas y Naturales

Ao 2012
Trabajo prctico N 1 Utilizacin del ADC y DAC del DSP
Ingeniera Electrnica

Profesor: Ing. Parlanti Alumnos: Santiago Nolasco Alejandro Vuirli

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

Trabajo Prctico N 1
Propuesta
Ingresar una seal por el ADC guardarla en un buffer circular en frac16 y extraerla por el DAC Datos Se utiliz la placa de desarrollo con un micro Freescale 568037, una fuente regulada para suministrarle un nivel de tensin y una notebook con el IDE CodeWarrior 10.2 donde se program el siguiente cdigo. Cdigo empleado Programa Principal
/* MODULE ProcessorExpert */

/* Including needed modules to compile this module/procedure */ #include "Cpu.h" #include "Events.h" #include "TI1.h" #include "BTN1.h" #include "Inhr1.h" #include "BTN2.h" #include "Inhr2.h" #include "LED1.h" #include "Inhr3.h" #include "AD1.h" #include "DA1.h" #include "LED2.h" #include "Inhr4.h" #include "FC1.h" /* Including shared modules, which are used for whole project */ #include "PE_Types.h" #include "PE_Error.h" #include "PE_Const.h" #include "IO_Map.h" extern bool BotonEncendido; extern unsigned int flag; extern unsigned int valorADC,j,Vector1[512]; extern Frac16 Buffer_fixed[512]; unsigned int Vector[512];

void main(void) { /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/ PE_low_level_init(); /*** End of Processor Expert internal initialization. ***/ BTN1_Enable(); BTN2_Enable(); while(TRUE){

2 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

if(BotonEncendido==TRUE){//habilita la interrupcin para convertir DAC Vector[j]= (unsigned int)Buffer_fixed[j]; //Se cambia a un valor entero el valor del vector en FRac16 DA1_SetValue(&Vector[j]);//Se convierte un dato analgico en digital sucesivamente, hasta que j cambie de valor //j cambiara de acuerdo a la interrupcin dada por el muestreo al cual se grabo el Buffer_fixed } if (flag>12000){ //rutina para determinar el correcto funcionamiento del sample, LED1_Toggle(); //el cual es proporcional a el periodo dado por cada interrupcin flag=0;//El led se prendera y apagara en el tiempo=periodo de muestreo*12000 } } for(;;){} } /* END ProcessorExpert */

Eventos(interrupciones) /* MODULE Events */ #include "Cpu.h" #include "Events.h" unsigned int variable=0; //Variables que se repiten en el main bool BotonEncendido=FALSE; unsigned int flag=0; unsigned int valorADC=0,evento=0,Vector1[512]; unsigned int j=0; unsigned long k=0; Frac16 Buffer_fixed[512]; /* User includes (#include below this line is not maintained by Processor Expert) */ /* ** =================================================================== ** Event : TI1_OnInterrupt (module Events) ** ** Component : TI1 [TimerInt] ** Description : ** When a timer interrupt occurs this event is called (only ** when the component is enabled - <Enable> and the events are ** enabled - <EnableEvent>). This event is enabled only if a ** <interrupt service/event> is enabled. ** Parameters : None ** Returns : Nothing ** =================================================================== */ #pragma interrupt called /* Comment this line if the appropriate 'Interrupt preserve registers' property */

3 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

/* is set to 'yes' (#pragma interrupt saveall is generated before the ISR)*/ void TI1_OnInterrupt(void) /* Interrupcin dada por la frecuencia de muestreo (gobernada por el periodo=1/frec)*/ { if(BotonEncendido==FALSE){ AD1_Measure(TRUE); // Se procede a la conversin A/D, si el botn AD1_GetValue16(&valorADC); // de D/A no haya sido presionado y se lo guarda en el vector valorADC evento=valorADC>>4; //Como la resolucin de conversin es de 12bits justificado a la izquierda // se justifica a la derecha, en una variable de 16bits Vector1[j]=evento; //Se construye un vector donde se guarda cada conversin Buffer_fixed[j]=(Frac16)evento; //Se guarda las conversiones en Frac16 } flag++; //contador para prender y apagar al led (en main), proporcional a los tiempos dados por la interrupcin j++; //j me indica la direccin en el vector if(j>=512){ //Cuando llego a la ltima direccin del vector, la reseteo j=0; } } /* ** =================================================================== ** Event : BTN1_OnButton (module Events) ** ** Component : BTN1 [Button] ** Description : ** This event is called when the button is pressed. ** If button inactivity feature (advanced view) is enabled, ** then the next OnButton event is not generated during dead ** time. ** Parameters : None ** Returns : Nothing ** =================================================================== */ #pragma interrupt called /* Comment this line if the appropriate 'Interrupt preserve registers' property */ /* is set to 'yes' (#pragma interrupt saveall is generated before the ISR) */

void BTN1_OnButton(void) /*Interrupcin dada por presionar el botn de seleccin de frecuencia de muestreo*/ { if (variable>4){ //variable me indica, el periodo dado por las frecuencias de muestreo variable=0; //son 5 en total } TI1_SetPeriodMode(variable);// selecciono el periodo, de acuerdo al valor cargado previamente por Processor expert variable++; // cada vez que entro, se cambiara de frecuencia de muestreo }

4 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

/* ** =================================================================== ** Event : BTN2_OnButton (module Events) ** ** Component : BTN2 [Button] ** Description : ** This event is called when the button is pressed. ** If button inactivity feature (advanced view) is enabled, ** then the next OnButton event is not generated during dead ** time. ** Parameters : None ** Returns : Nothing ** =================================================================== */ #pragma interrupt called /* Comment this line if the appropriate 'Interrupt preserve registers' property */ /* is set to 'yes' (#pragma interrupt saveall is generated before the ISR) */

void BTN2_OnButton(void) /*Interrupcin dada por pulsacin de botn, que habilita la conversin D/A*/ { if(BotonEncendido==TRUE){ BTN1_Enable(); //Si BotonEncendido es true, por un acceso anterior de la interrupcin BotonEncendido=FALSE; //cambio su estado a false(para impedir la conversin D/A y habilito el cambio de frecuencias(BTN1) }else{ BotonEncendido=TRUE; // Cambio el estado de BotonEncendido y deshabilito el botn de cambio de frecuencia BTN1_Disable(); // esto es para mantener la frecuencia de muestreo sea igual a la frecuencia muestreada, adems de cambiar // por true/false cada vez que entro en esta interrupcin //Led indicador de Conversin D/A

LED2_Toggle();

Procedimiento: Se selecciona el mdulo ADC y una interrupcin, las cuales son generadas por processor expert. De estas es necesario configurarlas, por su parte el ADC es configurado con una resolucin de 12bits y por el canal analgico 0, tambin se configura para que el tiempo de conversin de aproximaciones sucesivas un tiempo prudencial (el compilador hace el codigo mas compacto). Por otra parte se selecciona una interrupcin por TMRA0, donde esta interrumpe peridicamente cada 125useg(frecuencia de muestreo de 8Ksample), 62.5useg(16K),42.5(22K),27.4useg(44K) y 20.8useg(48K). Esta variacin del periodo se logra con la funcin TI1_SetPeriodMode(variable), donde variable toma valores de 0(mayor periodo) a 4(menor periodo) y se selecciona por pulsamiento de BTN1.. En la funcin generada por la interrupcin indicamos al ADC que actualice la medicin y guarde el valor en un registro de 16 bits a travs de un puntero, en un registro valorADC que anteriormente fue justificado a la derecha, por ser la conversin del ADC de 12bits, para luego guardarlo en arreglo en la funcin main este vector es casteado en Frac16 llamado
5 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

Buffer_fixed. Al guardarlo en tipo Frac16 indicamos al compilador que el rango de valores quede establecido entre -1 y 1 para poder operarlo en mltiplicaciones sin el problema de saturacin. Por su parte en el main armamos un arreglo de 512 valores donde se irn guardando los valores devueltos por el ADC ya muestreados. Cuando se completa el buffer, el ciclo se vuelve a repetir generando un Buffer circular. La funcin de parpadeo del led, es para mostrar el funcionamiento del hard as como saber que el DSC no entr en algn bucle infinito, este parpadeo es proporcional al periodo de las interrupciones de TMRA0. Para poder ver los datos guardados, hay que pulsar el BTN2 el cual habilita en main la funcin DA1_SetValue(&Vector[j])la cul la indico con un led, el cul toma los valores del buffer circular para hacer la conversin D/A, esta conversin se hace en un mismo valor del buffer hasta que haya una interrupcin del TMRA0 y cambie de valor j (posicin del vector) hay que aclarar que el BTN2 inhabilita la interrupcin de BTN1(cambio de periodo) ya que si cambio el periodo cambio la frecuencia de la seal a mostrar. Como ltima acotacin y muy importante, es el nivel de prioridad de cada interrupcin, BTN1 y BTN2 mxima prioridad. TI1_OnInterrupt(temporizacin basada en TMRA0) mnima prioridad. Esto tiene su causa en el caso de querer cambiar la frecuencia de muestreo inicializar la conversin D/A pulsando algn boton, si la interrupcin por timer no tiene baja prioridad , har caso omiso, ya que las interrupciones de tiempo son muy chicas y mucho menores al tiempo de pulsacin. Medicin: Sabemos que el conversor ADC tiene una resolucin de 12 bits y el DSC trabaja con una alimentacin de 3,3V, cada escaln tiene el nivel de 0,8mV por lo que es muy vulnerable al ruido. Sobre todo si la fuente de tensin a medir no tiene un adecuado tratamiento del rizado, sin embargo en esta aplicacin no es importante tanta presicin. Funcionamiento: Con frecuencia de muestreo de 8K-muestras

6 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

Con frecuencia de muestreo de 16K-muestras

Con frecuencia de muestreo de 22K-muestras

Con frecuencia de muestreo de 44K-muestras

7 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

Con frecuencia de muestreo de 48K-muestras

En cada una de estas imgenes se puede observar la seal presentada al ADC en amarillo y el contenido del buffer circular transferido al DAC en celeste. Una vez finalizada la conversin D/A iniciada por el BTN1 de la placa de desarrollo, puede desconectarse la seal que ingresa al ADC para mostrar que lo sale del DAC es el arreglo de valores guardado en el buffer circular. Diagramas de flujo: Iniciado el ADC se realiza la conversin de la medicin segn una interrupcin por timmer a una de las frecuencias de muestreo. void BTN2_OnButton(void):
Interrupcin BTN2

Comienzo la conversin D/A

Estaba convirtiendo el DAC?

Dejo de convertir D/A

Deshabilito Cambio de Frecuencia y enciendo led

Habilito BTN1 para el cambio de frecuencia

8 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

void TI1_OnInterrupt(void): La interrupcin del timmer realiza la conversin del valor medido, el desplazamiento hacia la derecha para justificar el valor de 12 bits hacia ese lado y el llenado del buffer circular de 512 muestras.

9 de 7

Procesamiento Dig ital de Seales

2012

Trabajo Prctico N 1

void BTN1_OnButton(void): Cuando se presiona el botn de cambio de frecuencia se configura la interrupcin del timmer para que ocurra en otro intervalo de tiempo

void main(void): En el programa principal se habilita la posibilidad de interrumpir con los botones y luego se queda esperando que se autorice la muestra del buffer circular

Conclusin: El prctico desarrollado con processor expert result en una agilizacin en la configuracin inicial del uDSC, permitindonos concentrar nuestros esfuerzos en la programacin especfica del trabajo prctico.

10 de 7

Vous aimerez peut-être aussi