¿Cómo valido si la salida de datos de ADC que estoy obteniendo es correcta o no?

1

He programado el ADC interno de 10 bits en PIC18F458 y se muestra la salida de ADC a través de UART. He conectado un potenciómetro de 10 K a la entrada RA0 de ADC y variando para ver la salida de ADC correspondiente. Dado que es un ADC de 10 bits configurado con + Vref = + Vdd = 5V y -Vref = Vss = Gnd, supongo que para 0 Kohms, la salida de ADC debería ser 0 y para 10 K ohms, debería ser 1023, sin embargo He estado obteniendo algunos valores de salida de ADC extraños cuando se simula en Proteus, y no estoy seguro de cómo validar si es la salida correcta o no. He adjuntado las imágenes de las simulaciones de proteus, tabla de datos y el código. Y otra cosa es que, si estoy usando un tipo de datos int sin signo (ADC_data) para mostrar las salidas de ADC, entonces, ¿por qué sigo obteniendo valores negativos también ?, siempre + Vref = 5V y -Vref = Gnd = 0V. ¿Alguien puede explicar esto?

 #define _XTAL_FREQ 20000000
 #include<P18F458.h>
 #include"UART.h"

#pragma config OSC=HS
#pragma config OSCS=OFF
#pragma config PWRT=OFF
#pragma config BOR=OFF
#pragma config WDT=OFF
#pragma config STVR=ON
#pragma config LVP=OFF
#pragma config CP0=OFF
#pragma config CP1=OFF
#pragma config CP2=OFF
#pragma config CP3=OFF
#pragma config CPB=OFF
#pragma config CPD=OFF
#pragma config WRT0=OFF
#pragma config WRT1=OFF
#pragma config WRT2=OFF
#pragma config WRT3=OFF
#pragma config WRTC=OFF
#pragma config WRTB=OFF
#pragma config WRTD=OFF
#pragma config EBTR0=OFF
#pragma config EBTR1=OFF
#pragma config EBTR2=OFF
#pragma config EBTR3=OFF
#pragma config EBTRB=OFF

#pragma config DEBUG=OFF

unsigned int ADC_data = 0;
void ADC_Init()
{

ADCON0bits.ADON = 1;
ADCON1bits.PCFG3 = 1;
ADCON1bits.PCFG2 = 1;
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG0 = 0;
ADCON1bits.ADFM = 0;

ADCON0bits.CHS0 = 0;
ADCON0bits.CHS1 = 0;
ADCON0bits.CHS2 = 0;

ADCON1bits.ADCS2 = 0;
ADCON0bits.ADCS1 = 1;
ADCON0bits.ADCS0 = 0;
}

void ADC_Convert()
{
ADCON0bits.GO_DONE = 1;
while(ADCON0bits.GO_DONE == 1);
ADC_data = (((unsigned int)ADRESH)<<8)|(ADRESL);
}


void main (void)
{
TRISAbits.TRISA0 = 1;
UARTInit();
ADC_Init();
while(1)
{
__delay_us(20);
ADC_Convert();
UARTNextLine("ADC Output is ");
UARTWriteInt(ADC_data,255);
}
}

Información adicional:

Fosc = 20 MHz Tosc = 1 / 20MHz = 0.05us 32Tosc = 0.05us * 32 = 1.6us 11Tad = 11 * 1.6us = 17.6us

Tenga en cuenta que, en el código, he dado un retraso de 20us antes de que comience la conversión A / D y no de 17.6us.

No estoy seguro de si el ADC produce lo que tengo correcto o si hay algún error en el código que está generando valores inexactos. Cualquier comentario, sugerencia y consejo sobre cómo verificar si mi anuncio está funcionando correctamente me sería útil para continuar y entender.

Gracias a todos por adelantado ~ VD

    
pregunta PsychedGuy

2 respuestas

4

En la inicialización de su ADC, cambie esta línea

ADCON1bits.ADFM = 0;

a esto

ADCON1bits.ADFM = 1;

Como la hoja de datos se explica en la página 242

Suconfiguraciónresultóenunnúmeroquesedesplazó6bitsaladerecha,porloquefue64vecesmásgrandedeloesperado.

Estoseilustraenlasiguientefiguradelamismaseccióndelahojadedatos:

    
respondido por el Roger Rowland
2

No he buscado su dispositivo ADC pero puedo decirle que los resultados que está viendo son consistentes con el convertidor A / D que devuelve sus resultados de 10 bits justificados en los 16 bits en los que leyó el resultado en .

Tome sus lecturas y muévalas a la derecha 6 lugares y puede comenzar a obtener lo que espera.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas