Autor Tema: ADC no muestrea a velocidad correcta  (Leído 3611 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
ADC no muestrea a velocidad correcta
« en: 16 de Marzo de 2012, 00:15:20 »
HOla:

Estoy trabajando con el dspic33ep256MU806. Estoy intentado muestrear los canales 0 y 1 de forma simultanea a una velocidad de 7 ksamples.
La conversion esta siendo realizada por medio del timer 3.
El problema que tengo esque el ADC esta muestreando a la mitad de lo deseado, es decir 3.5 ksamples.

Aun no logro encontrar mi error. El dspic esta corriendo a 60 MIPS. (Eso ya lo cheque con el timer 1 y es una certeza).
Anexo el codigo donde condiguro el ADC haber si alguien me puede ayudar a encontrar mi error o si tiene una sugerencia al respecto.

Código: [Seleccionar]
//
void Init_ADC1(void){
AD1CON1bits.FORM=3;//signed fractional
AD1CON1bits.SSRC=2;//timer 3 inicia conversion
AD1CON1bits.SSRCG=0;//a cero para poder convertir usando timer 3
AD1CON1bits.SIMSAM=1;//muestreo simultaneo
AD1CON1bits.ASAM=1;//muestreo automatico
AD1CON1bits.AD12B=0;//10-bit, 4-channel ADC operation
//
AD1CON2bits.VCFG=0;//referencias dadas por alimentacion
AD1CON2bits.CHPS=1;//convierte canal 0 y 1
AD1CON2bits.SMPI=1;//interrumpe cada 2 conversiones
AD1CON2bits.BUFM=0;//llenado siempre inica en ADCBUF0
//
AD1CON3bits.ADRC=0;//reloj derivado del sistema
//AD1CON3bits.SAMC=30;//30 tad para muestreo
AD1CON3bits.ADCS=99;//100*Tcy=1TAD
//
AD1CON4bits.ADDMAEN=0;//DMA no utilizado resultados en ADC1BUF0-ADC1BUFF
//
AD1CHS123bits.CH123SA=1;//CH1 positive input is AN3, CH2 positive input is AN4, CH3 positive input is AN5
//
AD1CHS0bits.CH0NA=0;//entrada negativa del canal 1 es VREFL
AD1CHS0bits.CH0SA=0;//entrada positiva es AN0
//
AD1CSSH=0;//saltar canales altos para lectura AN16-AN31
AD1CSSL=0;//canales bajos a cero para no leerlos (An0-AN15)
AD1CSSLbits.CSS0=1;//leer canal0
AD1CSSLbits.CSS3=1;//leer canal3
//
ANSELB=0;//puertoB como digital
ANSELC=0;//puertoC como digital
ANSELD=0;//puertoD como digital
ANSELE=0;//puertoE como digital
ANSELBbits.ANSB0=1;//AN0 como analogico
ANSELBbits.ANSB3=1;//AN3 como analogico
//
////////configuracion del timer 3
T3CON = 0;              // Timer reset
IFS0bits.T3IF = 0;      // Reset Timer3 interrupt flag
IEC0bits.T3IE = 0;      // Disable Timer1 interrupt
TMR3=  0x0000;  
PR3 = 8571;           // Timer3 period register =142.85uS a 60 MIPS
//
////////////////interrupcion del ADC////////////////////////////////
IFS0bits.AD1IF = 0;      // Reset AD1 interrupt flag
IEC0bits.AD1IE = 1;      // Enable Timer1 interrupt
IPC3bits.AD1IP=7;
//
}

Este es el codigo de la interrupcion:

Código: [Seleccionar]
void __attribute__((interrupt, no_auto_psv)) _AD1Interrupt(void)
{
        //Clear the Timer3 Interrupt Flag
IFS0bits.T3IF = 0;
IFS0bits.AD1IF = 0;
//Copy the A/D conversion results to variable "inputSignal"
V[muestra] = ADC1BUF0 ;
I[muestra] = ADC1BUF1 ;
muestra++;
if(muestra>=7000){
lect_lista=0x31;
muestra=0;
}
LATEbits.LATE1 = !LATEbits.LATE1;
}

Como pueden ver hago cambiar el pin RE1 para ver la frecuencia de interrupcion. Ahi es donde me doy cuenta que algo esta mal.

Muchas gracias por su ayuda y sugerencias.

saludos!

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: ADC no muestrea a velocidad correcta
« Respuesta #1 en: 16 de Marzo de 2012, 00:20:24 »
antes de que se me olvide. Las lineas:

AD1CON1bits.ADON=1;      //iniciar ADC
T3CONbits.TON = 1;      // Enable Timer3 and start the counter

no se ven en el codigo por que la secuencia de conversion es iniciada por medio del usuario al utilizar el UART. Me interesa una ventana especifica de tiempo.

Todo funciona bien. EL unico problea es la velocidad de muestreo.

saludos!

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: ADC no muestrea a velocidad correcta
« Respuesta #2 en: 16 de Marzo de 2012, 02:04:25 »
has probado a poner PR3 a menos para ver si se incrementa la velocidad?

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: ADC no muestrea a velocidad correcta
« Respuesta #3 en: 16 de Marzo de 2012, 13:19:27 »
hola merlinz.

 Lo he intentado y no hubo ningun cambio. Esto esta algo extraño

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: ADC no muestrea a velocidad correcta
« Respuesta #4 en: 16 de Marzo de 2012, 13:48:09 »
Hola finalmente he encontrado mi error:

EN el documento "Section 16. Analog-to-Digital Converter (ADC)" , wel cual es parte del family reference manual para la familia dspi33e se encuentra la tabla (pagina 33) que anexo.



Esto significa que en muestreo simultaneo los bits SMPI, controlan cuantas lecturas por canal se tomaran antes de la interrupcion. Entonces en realidad yo estaba interrmpiendo cada 4 lectuas, no cada 2.

Es una peculiaridad del dspic33 que no habia tomado en cuenta. Se los menciono por si alguien desea experimentar con ellos.

Al variar el timer 3 no habia cambiado el tiempo porque en ese momento tenia la conversion en lo mas lento. (250Tcy = 1tad y 31 ted para muestreo.)

saludos!