Autor Tema: Precision del ADC en el PIC16F886  (Leído 3661 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Precision del ADC en el PIC16F886
« en: 04 de Marzo de 2011, 08:18:24 »
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);
     
     
}


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Precision del ADC en el PIC16F886
« Respuesta #1 en: 04 de Marzo de 2011, 09:59:19 »
  ¿Cómo estás conectando la batería hacia el PIC? Deberías conectarla con una resistencia en serie (habría que ver en el datasheet cual es el valor máximo para dicha resistencia), y para probar podrías empezar con 1K.

  La única prueba que hice con ADC fue con un pote entre 5V y GND y el cursor por medio de una resistencia de 1K ingresaba al PIC, la medición era buena. Como ejemplo con 2.5V (medidos con el tester) la salida del ADC fluctuaba entre 511 y 512 que corresponden a 2.4975 y 2.5024 respectivamente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Precision del ADC en el PIC16F886
« Respuesta #2 en: 04 de Marzo de 2011, 10:05:54 »
  ¿Cómo estás conectando la batería hacia el PIC? Deberías conectarla con una resistencia en serie (habría que ver en el datasheet cual es el valor máximo para dicha resistencia), y para probar podrías empezar con 1K.

  La única prueba que hice con ADC fue con un pote entre 5V y GND y el cursor por medio de una resistencia de 1K ingresaba al PIC, la medición era buena. Como ejemplo con 2.5V (medidos con el tester) la salida del ADC fluctuaba entre 511 y 512 que corresponden a 2.4975 y 2.5024 respectivamente.

Gracias Angel por tan rapida respuesta, si no es muxo pedir que comando o instruccion utilizabas para capturar el valor con el ADC, trabajabas en C o en asm?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Precision del ADC en el PIC16F886
« Respuesta #3 en: 04 de Marzo de 2011, 14:50:18 »
  Hice las pruebas sobre un PIC 16F876A y programando en C con el compilador HiTech. De todas maneras me hice unas funciones cuya sintaxis es similar a la de CCS.

  Lo que noto que te falta en el programa, es la configuración del conversor AD.

  Busca en la ayuda de CCS las funciones setup_adc y setup_adc_ports. Con la primera de ellas se configura el conversor propiamente dicho (frecuencia de trabajo) y con la segunda se configura que pines querés que funcionen como entradas para el conversor.

  Es conveniente también que tengas el datasheet del PIC a mano y de ser posible que mires el archivo .h del pic en cuestión que tiene el compilador.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas