TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Tercio en 04 de Agosto de 2014, 18:05:47
-
Hola,
Escribo para aclarar una duda que se me presento con el modulo ADC, resulta que estoy utilizando un PIC que solo tiene un modulo ADC y tiene 14 canales como entradas analógicas. Ya tengo funcionando el ADC a través de 1 un canal analógico, ahora lo que quiero es hacer la lectura de dos entradas analógicas con un solo ADC y lo que hago es un switch cada determinado tiempo intercalando la lectura analógica, pero en los resultados solo me funciona una entrada. Entonces me gustaría saber si esto es posible, como lo puedo hacer o que método puedo implementar.
-
como bien dices Es un solo ADC y se multiplexan los canales, pon el código para saber como lo haces
-
void main(void) {
OSCCON = 0X70;
TRISC = 0;
LATC = 0;
TRISE = 0;
LATE = 0;
//setup ADC
TRISBbits.TRISB2 = 1; //Potentiometor connected to RB2... set as input
ANSELBbits.ANSB2 = 1; //analog
TRISAbits.TRISA1 = 1;
ANSELAbits.ANSA1 = 1;
ADCON1 = 0b00100000; //left justified - Fosc/32 speed - Vref is Vdd
//setup PWM
CCP1CON = 0b00001100; //PWM mode single output
CCP2CON = 0b00001100;
PR2 = 255;
CCPTMRS0bits.C1TSEL = 0b00; //slect timer2 as PWM source
CCPTMRS0bits.C3TSEL = 0b00;
T2CONbits.T2CKPS = 0b00; //1:1 pre-escaler
T2CONbits.TMR2ON = 1; //start the PWM
while(1){
__delay_us(5); //wait for ADC charging cap to settle
GO = 1; //start the ADC conversion
while (GO) continue; //wait for conversion to be finished
ADCON0 = 0b00000101; //Select RA1 as source of ADC and enable the module (AN1)
CCPR2L = ADRESH; //put the top 8 MSbs into CCPR2L
CCP2CONbits.DC2B = (ADRESL>>6); //put the 2 LSbs into DC1B register to complete the 10bit resolution
__delay_us(5000);
ADCON0 = 0b00100001; //Select RB2 as source of ADC and enable the module (AN8)
CCPR1L = ADRESH; //put the top 8 MSbs into CCPR2L
CCP1CONbits.DC1B = (ADRESL>>6); //put the 2 LSbs into DC1B register to complete the 10bit resolution
}
}
-
El código que anexo es con el que estoy trabajando entonces quisiera saber si estoy haciendo bien las cosas o estoy cometiendo algún error.
-
Yo veo algo. Pones el GO = 1 solo 1 vez, y si quieres convertir 2 canales deberias ponerlo 2 veces (1 x canal).
Tambien veo que inicias la conversion y luego seleccionas el canal, el orden seria al contrario, primero seleccionas el canal: ADCON0 = 0b00000101; //Select RA1 as source of ADC and enable the module (AN1) y luego el GO=1;