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