Conversor A/D Ejemplo: Muestreo periódico de una señal Obtener los valores de tensión de una señal analógica cada Tm=100 ms V(t) AN7 Tm t=0 t=Tm t t=2Tm t=3Tm t=4Tm t=5Tm t=6Tm dsPIC Conversor A/D Ejemplo: Muestreo periódico de una señal Tm Tm Tm SAMP DONE Tconv Tsamp Modo inicial usado: ● Por programa (SAMP=0) se detiene el muestreo y se inicia la conversión ● Cuando acaba la conversión automáticamente DONE se pone a 1 y se reinicia el muestreo Conversor A/D Ejemplo: Muestreo periódico de una señal SOLUCIÓN SENCILLA (POCO PRECISA Y POCO EFICIENTE) #include<p30f6010.h> main() { unsigned valor=0; ADCON1bits.ASAM=1; ADCHSbits.CH0SA=7; ADCON1bits.ADON=1; } // Inicia muestreo en fin de conversion // Muestrea canal AN7 // Arrancar conversor AD while(1) { DelayNmSec(100); ADCON1bits.SAMP=0; while(!ADCON1bits.DONE); valor=ADCBUF0; } // // // // Periodo de muestreo Tm=100 ms Iniciar conversion Esperar fin de conversion Tomar valor convertido Conversor A/D ● Detalles importantes del ejemplo – Todos los registros en el ejemplo tienen inicialmente los valores por defecto (los de RESET) – AN7: por defecto entrada (RB7) y analógica – Fosc=8MHz, es decir, Tcy=500 ns. Por lo tanto si ADCS=0 entonces Tad=Tcy/2, que cumple mínimo Tad=145 ns. Conversor A/D Ejemplo: Muestreo periódico de una señal SOLUCIÓN MÁS PRECISA (SIN MÁXIMA EFICIENCIA) #include<p30f6010.h> void _ISR _T1Interrupt(void) { unsigned valor=0; IFS0bits.T1IF=0; ADCON1bits.SAMP=0; while(!ADCON1bits.DONE); valor=ADCBUF0; // // // // Borrar bandera solicitud interr. T1 Iniciar conversion Esperar fin de conversion Tomar valor convertido } main() { // Configuracion T1 T1CONbits.TCKPS=1; // preescalado 1:8 TMR1=0; // Poner a cero contador PR1=24999; // Periodo 100 ms // Configuracion AD ADCON1bits.ASAM=1; // Inicia muestreo en fin de conversion ADCHSbits.CH0SA=7; // Muestrea canal AN7 // Configurar interr., arrancar T1 y AD IFS0bits.T1IF=0; // Borrar bandera solicitud interr. T1 IEC0bits.T1IE=1; // Habilitar interr. T1 ADCON1bits.ADON=1; // Arrancar conversor AD T1CONbits.TON=1; // Poner T1 en marcha while(1) Idle(); } Conversor A/D ● Cambios respecto ejemplo previo – ● Inconvenientes – ● El inicio de la conversión se realiza periódicamente de forma precisa Todavía hay espera ocupada hasta final de conversión Mejoras posibles – Usar interrupción del conversor (ADC Convert Done), que se genera cuando acaba una conversión