Documentación de los modos básicos del AD

Anuncio
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
Descargar