TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Tercio en 04 de Agosto de 2014, 18:05:47

Título: Lectura de ADC a través de varios canales
Publicado 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.     
Título: Re: Lectura de ADC a través de varios canales
Publicado por: jhozate en 04 de Agosto de 2014, 18:13:28
como bien dices Es un solo ADC y se multiplexan los canales, pon el código para saber como lo haces
Título: Re: Lectura de ADC a través de varios canales
Publicado por: Tercio en 04 de Agosto de 2014, 18:34:23
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


    }
}
Título: Re: Lectura de ADC a través de varios canales
Publicado por: Tercio en 05 de Agosto de 2014, 17:01:44
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.
Título: Re: Lectura de ADC a través de varios canales
Publicado por: MerLiNz en 05 de Agosto de 2014, 19:09:01
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;