PIC16F1936 Lecturas de canales ADC múltiples

1

Estoy programando un PIC16F1934 y estoy usando dos canales ADC, a saber, AN0 y AN1.

Tomo el máximo de un puñado de lecturas para la lectura AN0 y luego solo una muestra para AN1.

Aquí está mi código:

    ADCON0 = 0b00000001;                // Source: AN0, Enable ADC
    for (uint8_t i = 0; i < 46; i++) {

        ADCON0bits.GO_nDONE = 1; // start conversion
        while (!ADCON0bits.GO_nDONE); // wait for result

        rawADCResult = *((uint16_t*) & ADRESL);

        ADCResult = ((uint32_t) rawADCResult * 500ul) >> 10; // Scale it to 100x volts

        if (maxADCResult < ADCResult) // Check if value has changed
            maxADCResult = ADCResult; // and update last value

        __delay_us(50);

    } 


    ADCON0 = 0b00000100;                // Source: AN1, Disable ADC
    __delay_ms(500);
    ADCON0 = 0b00000101;                // Enable ADC
    __delay_ms(500);


    ADCON0bits.GO_nDONE = 1; // start conversion
    while (!ADCON0bits.GO_nDONE); // wait for result

    rawADCResult = *((uint16_t*) & ADRESL);

    ADCPORTA1 = ((uint32_t) rawADCResult * 500ul) >> 10; // Scale it to 100x volts

El maxADCResult del canal AN0 está bien. Pero el valor de ADCPORTA1 siempre coincide con el valor del canal AN1.

Estoy imprimiendo estos valores en la pantalla LCD y me he asegurado de que no estoy copiando la misma variable dos veces:

lcdSetCursor(1, 1);
sprintf(msg, "AN0: %d  ", ADCResult);
lcdWriteString(msg);
lcdSetCursor(2, 1);
sprintf(msg, "AN1: %d  ", ADCPORTA1);
lcdWriteString(msg);

Una cosa más, si cambio el orden de la lectura del canal (primero AN1, luego AN0). La situación se invierte. Ahora el resultado de AN1 se copia a AN0.

Probé estas cosas, pero no sirve de nada:

  1. Deshabilitando la habilitación del ADC en b / w cada cambio de canal.
  2. Presentamos grandes retrasos para permitir que el MUX cambie el canal o que el ADC se encienda.
  3. Escribir registros completos en cada comando para asegurarse de que todos los bits estén de acuerdo con la necesidad.
  4. Cambiando completamente los nombres de las variables utilizadas con AN0 y AN1.

¿Puede alguien ayudarme con una visión de este problema?

    
pregunta Mohsin

1 respuesta

1

Tiene el sentido equivocado en su código de adc: "while (! ADCON0bits.GO_nDONE);" debe ser "while (ADCON0bits.GO_nDONE);". Desea quedar atrapado en el bucle while mientras ADCON0bits.GO_nDONE es "1". Cuando es "0", el ADC ha completado la medición y luego puede salir del bucle while y leer el resultado. De lo contrario, lea el registro ADC inmediatamente después de iniciar la conversión. El resultado es entonces de la conversión anterior.

    
respondido por el John Birckhead

Lea otras preguntas en las etiquetas