La conversión de ADC PIC12F tiene un desplazamiento no deseado

2

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

Estoyusandounaresistenciadeprecisiónde250R0.05%paraobtenerunabuenaentradade0-5Valpinanalógico(AN2siesimportante).Porloquesé,tengoelladocorrectodelsoftware,peromostrarélaspartesrelevantesdelcódigoenlaparteinferior.

Presionolosresultadosdeconversión(ADRESHyADRESL)directamentealpinSPISDOqueséquefuncionacorrectamente.

Elproblemaesqueparaunaentradade0mA(ambosterminalesdeentradaconectadosatierra)obtengounasalidade0000110011(51dec).Conmifuenteactualconectadayconfiguradalomásbajaposible,aproximadamente34.6mVatravésdelaresistencia,obtengounresultadode0000111010(58dec).Unvalorde58decimaldebecorresponderaunvoltajedeentradade0.283Vquedaunvalorbastantealto

Estoyluchandoparaverporquéhayunacompensacióndealrededordel5,6%.¿Eslaconfiguracióninternaunacausapotencial?

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

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

¿Debo encender el módulo ADC solo cuando realizo una conversión? Su único propósito es como un ADC, así que no vi ningún punto en apagarlo ya que el uso de energía no es un problema.

    
pregunta JoshGreen1

1 respuesta

2

El crédito para esto debe ir a Dan Laks (ver comentario en la pregunta original), pero esta pregunta aún está en la sección 'sin respuesta', así que le estoy poniendo una respuesta.

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

    
respondido por el slightlynybbled

Lea otras preguntas en las etiquetas