Hola a todos estoy programando un PIC 16f886 con el CCS C, y estoy utilizando el adc propio del pic con una resolucion de bits,lo quiero utilizar para medir la tension de una bateria que voy a tener a conectada al pic.
Ahora bien estoy haciendo pruebas con la Fuente de alimentacion conectada al PIC, teniendo en cuenta que la maxima tension a medir por el ADC tiene que ser menor que la tension de alimentacion de 5V del PIC y estoy viendo que si le meto a la fuente un valor de 2 voltios y lo conecto al pic por el RA0 por ejemplo para que me muestre por pantalla ese valor, ya sea en decimal o como sea, cada vez que le doy a la intruccion para que muestre ese valor me da un valor diferente comprendido en un rango pequeño, !!!o sea que no es muy preciso el ADC vamos!!! para un valor de 2 voltios con el pic programado el adc a 10 bits, me muestra valores comprendidos entre 369 y 426 y igual si le meto 2,20 voltios me muestra 399 a 433.
Hay manera de comprobar la tension de la bateria de forma un poco mas precisa con el pic, que puedo hacer??
Os adjunto mi programa en C por si el fallo estubiera por ahi.
Gracias.
//Fuses o Encabezdo del Programa
#include <16F886.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#include <string.h>
#include <stdlib.h>
//#use delay(clock=4000000) //Osc Interno a 4 Mhz
#use delay(clock=2000000) //Osc Interno a 2 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3) //Configuracion I2c
#use fast_io(b)
//Cuando introduzco el comando ADC por el Hiperteminal me salta a este subprograma:
void Adc()
{
int16 valor;
set_adc_channel(0); //Asi Captura el valor teniendo como referencia Vcc y Gnd o sea de 0 a 5v
delay_us(10);
valor = read_adc();
printf("\r\n %Lu ",valor);
printf("\r\n %Ld ",valor);
}