La conversión PIC12F ADC tiene un desplazamiento no deseado

La configuración actual se muestra a continuación. PIC12F1822 con un ADC de 10 bits.

PIC12F1822 Problema de ADC de 0-20 mA

Estoy usando una resistencia de precisión 250R 0.05% para obtener una buena entrada de 0-5V al pin analógico (AN2 si importa). Por lo que puedo decir, tengo el lado del software correcto, pero mostraré las partes relevantes del código en la parte inferior.

Estoy enviando los resultados de la conversión (ADRESH y ADRESL) directamente al pin SPI SDO que sé que funciona correctamente.

El problema es que para una entrada de 0 mA (ambos terminales de entrada conectados a tierra) obtengo una salida de 00 0011 0011 (51 de diciembre). Con mi fuente de corriente conectada y configurada lo más baja posible, aproximadamente 34,6 mV en la resistencia, obtengo un resultado de 00 0011 1010 (58 de diciembre). Un valor de 58 decimales debería corresponder a un voltaje de entrada de 0.283V dando una gran

Estoy luchando por ver por qué hay una compensación de alrededor del 5,6%. ¿Es la configuración interna una posible causa?

Figura 16-4 de la hoja de datos PIC12F1822

Está configurado para usar Vdd y Vss como voltajes de referencia, tiene un reloj de conversión de Fosc/2 (250kHz) y el módulo ADC se enciende durante una rutina de arranque.

Código relevante:

ADC_CONV
            banksel     ADCDATAH
            clrf        ADCDATAH
            banksel     ADCDATAL
            clrf        ADCDATAL
            banksel     ADCON0                  ;
            bsf         ADCON0,ADGO             ;Set ADGO conversion start bit
CONVTEST    clrwdt                              ;Clear Watchdog Timer
            call        DELAY                   ;Short delay
            btfsc       ADCON0,ADGO             ;If conversion finished skip next instr
            goto        CONVTEST                ;Conversion not yet finished
            call        DELAY
            banksel     ADRESH                  ;
            movf        ADRESH,0                ;Move the upper bits of conversion to W
            banksel     ADCDATAH
            movwf       ADCDATAH                ;W to ADCDATAH
            banksel     ADRESL                  ;
            movf        ADRESL,0                ;Move the lower bits of conversion to W
            banksel     ADCDATAL
            movwf       ADCDATAL                ;W to ADCDATAL
            return   


SPI_ADC_TRANSMIT
            banksel     PORTA
            bcf         CS                      ;Select DAC slave to receive data (16 bits)
            banksel     ADCDATAH
            movf        ADCDATAH,0              ;Move SPIDATAH data to W
            banksel     SSP1BUF
            movwf       SSP1BUF                 ;W to SSP1BUF
            call        DELAY                   ;Call delay (must be >8 inst cycles)
;
            banksel     ADCDATAL
            movf        ADCDATAL,0              ;Move SPIDATAL data to W
            banksel     SSP1BUF
            movwf       SSP1BUF
            call        DELAY
            banksel     PORTA
            bsf         CS
            return

¿Debería encender el módulo ADC solo al realizar una conversión? Su único propósito es como un ADC, por lo que no vi ningún sentido en apagarlo, ya que el uso de energía no es un problema.

Cuando dice que tenía 34,6 V en la resistencia, ¿eso se mide con un osciloscopio u otro voltímetro de alta precisión? ¿O se supone que se basa en el flujo de corriente conocido? Además, ¿cuánto tiempo transcurre desde que selecciona el canal hasta que inicia la conversión?
Esto es poco probable, pero ¿tiene habilitados los pull-ups? Están deshabilitados por defecto en el registro OPTION_REG.
Gran decisión sobre la activación de los pull-ups débiles, no configuré correctamente OPTION_REG cuando estaba configurando los bits Timer0 en ese registro. ¡Marcaría este comentario como la respuesta si pudiera!

Respuestas (1)

El crédito por esto debe ir a Dan Laks (ver el comentario sobre la pregunta original), pero esta pregunta todavía está en la sección 'sin respuesta', por lo que le estoy dando una respuesta.

Asegúrese de que los pull-ups débiles en OPTIONS_REG no estén activos.