dsPIC33E ADC con referencia de voltaje externo

0

Estoy usando dsPIC33EP64MC202-I / SP para leer entradas analógicas con el código que se muestra a continuación. Está utilizando una referencia de voltaje de 2.5V en el pin 5 (VREF +) como voltaje de referencia ADC. Cuando conecto 1.1V a pin3 (AN0) ADC1BUF1 (CH0) lee 0x1F5, que se convierte a 1.223V (501 * (2.5 / 1024)). AN3 (CH0) lee 0x3FF, lo que parece correcto. ¿Qué está causando el error en la lectura AN0?

Para probar la referencia de voltaje, cambié el código para usar AVDD (conectado a 3.3V) como referencia de voltaje al configurar AD1CON2bits.VCFG = 0. Luego AN0, ADC1BUF1 lee 0x155 = 341 * (3.3 / 1024) = 1.099V , que es la respuesta correcta.

¿Entonces me pregunto por qué la referencia de 2.5V no funciona como se esperaba?

void initAdc() {
    ANSELAbits.ANSA0 = 1;       // set AN0/RA0 as analog input
    ANSELAbits.ANSA1 = 1;       // set AN1/RA1 as analog input
    ANSELBbits.ANSB0 = 1;       // set AN2/RB0 as analog input
    ANSELBbits.ANSB1 = 1;       // set AN3/RB1 as analog input 2.5V
    TRISAbits.TRISA0 = 1;       // set AN0/RA0 as input
    TRISAbits.TRISA1 = 1;       // set AN1/RA1 as input
    TRISBbits.TRISB0 = 1;       // set AN2/RB0 as input
    TRISBbits.TRISB1 = 1;       // set AN3/RB1 as input 
    /* Initialize ADC module */
    AD1CON1 = 0;
    AD1CON1bits.SIMSAM = 1;     // Simultaneous sampling 
    AD1CON1bits.SSRC = 7;       // Auto convert
    AD1CON1bits.ASAM = 1;       // auto sample 
    AD1CON2 = 0;
    AD1CON2bits.CHPS = 2;       // all four channels
    AD1CON2bits.ALTS = 0;       // Always uses channel input selects for Sample MUXA. MUXB not used
    AD1CON2bits.VCFG = 1;       // External VREFH = VREF+, VREFL = Avss 
    AD1CON3 = 0;
    AD1CON3bits.SAMC = 0x1f;    // Auto-Sample Time for 31 TAD
    AD1CON3bits.ADCS = 0x0f;    // TAD = 16TP

    AD1CON4 = 0;

    /* Assign MUXA inputs */
    AD1CHS0bits.CH0SA = 3;      // Channel 0 Positive Input Select for Sample MUXA bits
                                // Channel 0 positive input is AN3
    AD1CHS0bits.CH0NA = 0;      // Channel 0 negative input is VREFL 
    AD1CHS123 = 0;              // CH1 = AN0 (voltage FB), CH2 = AN1 (I_OUT), CH3 = AN2 (temp) 
    /* Enable interrupts */
    IFS0bits.AD1IF = 0;
    IEC0bits.AD1IE = 0;

    /* Enable ADC module and provide ADC stabilization delay */
    AD1CON1bits.ADON = 1;
    __delay_us(20); 
} //initAdc
    
pregunta TreeCity

1 respuesta

1
  

Con referencia externa de 2.5V ADC, cuando conecto 1.1V a AN0, se lee   1.223V (501 * (2.5 / 1024)) en SW. Pero el voltaje real conectado es de 1.1V. Este es un error que estoy tratando de solucionar.

Los ADC no son perfectos y probablemente deberías tomar algunas medidas más. Aquí es donde pueden surgir los errores: -

  • error de medición básico, es decir, DVM no es del todo perfecto
  • Voltaje de referencia no 2.5 voltios pero quizás un poco más bajo
  • Error cero de ADC: puede estar en el reino del 1% y a veces se especifica en LSB
  • Error de ganancia de ADC: la escala completa puede estar "fuera" en +/- 1% en muchos ADC y esto sucede aunque la precisión de referencia sea perfecta.
  • Error de no linealidad integral: divergencia de la línea recta perfecta que representa la ganancia. Esto puede ser de varios LSB en magnitud
  • No linealidad diferencial: este es el factor que determina cuán imperfecta es la precisión del paso. Piense en ello como una escalera donde la altura / profundidad de cada paso tiene un factor aleatorio involucrado.

Si suma todo esto, podría aproximarse a un error total de quizás 5% y 5% en una escala completa de 2.5 voltios, es 0.125 voltios de error potencial y puede activar un voltaje de entrada real de 1.1 voltios a 1.225 voltios según lo percibido digitalmente.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas