La configuración actual se muestra a continuación. PIC12F1822 con un ADC de 10 bits.
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?
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.
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.
dan laks
dan laks
joseverde1