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.
//
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:
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!