TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: javierexe22 en 03 de Septiembre de 2010, 16:09:21
-
Hola me encuentro realizando la configuracion del modulo ADC de 12 bits del Dspic 30f4013 con C30 y tengo problemas para observar lo medido en 2 entradas, solo me muestra el valor de An0, seguramente estoy cometiendo algun error de novato dado que recien me inicio, agradezco su ayuda y sugerencias!
El modulo lo configure de esta manera:
// config ADCON1
_ADON=0; // A/D apagado (bit15)
_ADSIDL=1; // detención del módulo en modo IDLE (bit13)
_FORM=0; // Formato Entero (bit 8-9)
_SSRC=7; // conversión automática después del muestreo (bit 5-6-7)
// ADCON1bits.SIMSAM=0; // muestrea múliples canales individualmente en forma secuencial (bit 3)
ADCON1bits.ASAM=1; // la captura se inicia despues q finaliza la ultima conversion (bit 2)
_SAMP=0; // los amplificadores de muestreo y retención no toman muestras (bit 1)
_DONE=0; // bit de estado de conversión finalizada (bit 0)
// config ADCON2
_VCFG=0; // Vref+ =AVdd; Vref- =AVss (bit 13-14-15)
_CSCNA=1; // entradas exploradas (bit10)
//ADCON2bits.CHPS=0; // convierte el canal CH0 (bit 8-9)
_BUFS=0; // no tiene importancia, el dato es de 16 bits (bit 7)
_SMPI=2; // genera interrupción con la 2da secuencia de muestreo y conversión (bit 2-3-4-5)
_BUFM=0; // buffer configurado como palabra de 16 bits (bit 1)
_ALTS=1; // usa el MUXA y MUXB(bit 0)
// config ADCON3
_SAMC=31; // Tiempo de muestreo automático =31*TAD (bit 8-9-10-11-12)
_ADRC=0; // señal de reloj obtenida del reloj del sistema (bit 7)
_ADCS=63; // reloj de conversión = 32*Tcy (bit 0-1-2-3-4-5-6)
// config ADCHS
ADCHS=0; // seleciona canal 0, entrada positiva AN0 y entrada negativa Vref-
// config ADCSSL
ADCSSL=0XFF;// 0b0000000000000101; // seleciona canal explorado
ADCON1bits.ADON = 1; // prende el módulo AD
IFS0bits.ADIF=0; //flag interrupcion limpiado
En el programa principal muestro los datos por LCD, :
IEC0bits.ADIE=1; // Habilita interrupcion
v1=(float)tension1*0.0012207;
//
v2=(float)tension2*0.0012207;
printf("V1:%1.2f V", v1); // Tension1
printf("V2:%1.2f v ", v2); // Tension2En la interrupcion realizo lo siguiente:
void __attribute__((__interrupt__,auto_psv)) _ADCInterrupt(void)
{
IEC0bits.ADIE=0; // Deshabilita interrupcion
tension1=ReadADC12(0);
tension2=ReadADC12(2);
IFS0bits.ADIF=0;
}
-
Respondo yo mismo, ya logre que funcione...mi error estaba en que declaraba que se realice una interrupcion en la segunda secuencia, pero sin embargo puse:
- _SMPI=2; cuando debia ser igual a 1
- Coloque _ALTS=0; de manera que solo usara el MUXA
- Y tambien CSCNA=1 que multiplexa las entradas segun ADCSSL
Ahora viene otro problema cuando cambio el canal que deseo explorar se vuelve a podrir el asunto, porque puede ser?
Esta es la declaracion que hago:
TRISBbits.TRISB1=1;
TRISBbits.TRISB11=1;
ADCSSL=0b000100000000001; // seleciona canal explorado
ADPCFG=0b111011111111110 ;// AN11, AN0 son analogicos / el resto digitales ( )
El canal AN12 marca 1,7V cuando deberia marcar 5, y el canal AN1 marca 0 (cero) en todo momento
-
:-/ Solucionado! Una desatención me costo una bronca.... Saludos a todos!
-
Profe, una preguntita. A tratado por casualidad usar MUXA & MUXB? Tengo 6 señales que leer simultaneamente. Estoy tratando de encontrar como hacerlo bien. La transicion hacia el MUXB no sale bien, los valores que recibo son negativos y el maximo de la variable (no 1023 pero -23547) y no encuentro un buen topic que me ayuda.
Me podrias decir si sabes de algo??
Gracias