ADC del PIC: ¿es normal esto?

Hola,

Estoy usando un canal AD del pic 16f877 configurado para resolucion de 8 bits y como prueba estoy visualizando el valor de la conversion en un LCD 16x2, lo muestro en formato decimal, pero lo que sucede es que nunca se queda estatico el resultado, digo estoy midiendo un voltaje de una bateria el cual no varia en absoluto, pero el resultado del convertidor AD si lo hace. Por ejemplo se la pasa oscilando del 133,134,135,138 a veces hasta el 140 y vuelve al 133 y asi.

Asi que me pregunto: ¿Es normal esto? y si no lo es: ¿como lo soluciono?

Hasta el momento no he usado niguna entrada para voltaje de referencia y se supone que la referencia la toma de la alimentacion 5v del PIC. No se si pueda ser ese el problema. Por que la verdad si me interesa que el resultado sea lo mas estable posible, presisamente para poder notar en caso de que haya verdaderas variaciones en el voltaje que estoy midiendo.

Saludos,
 
Pone un capacitor de 100 nF. Una patita de este en la entrada de la señal analógica y la otra a masa. Si no me equivoco, esto soluciona estos problemas.

Saludos
 
Hola Loktar,

Pues ya le coloque el condensador como me indicas, y la variación sigue, nunca se queda estable. Otra cosa que probé es poner la entrada a masa, se supone que debería ponerse en 0, pero no, aun así se mantiene variando: 0, 1, 2, 4, etc.

De momento todo esto lo tengo montado en protoboard, no creo que ese sea el problema, pero pienso que es como una interferencia o algo así. Cualquier idea es bienvenida.

Saludos y gracias,
 
Mmm, a mi entonces me parece que se debe a un error en el mismo PIC. Pienso que puede ser el programa. Estás seguro que esperas todos los tiempos necesarios provisto por Microchip? Osea el tiempo de adquisición y eso. Y también comprobando que la conversión está lista?
 
Hola, y cuales son los tiempos mas adecuados ¿?, yo le hago así: Primero configuro las entradas que van a ser análogas, luego elijo el canal a leer y espero 5 ms, leo el valor del ADC, espero otros 5 ms, hago uso del valor y finalmente tengo un retardo de 100 ms entre cada conversión, esto en un ciclo infinito.

Eso de si la conversion esta lista, la verdad no estoy seguro, ya que no lo hago en ASM sino en C y pues no se si eso lo haga la funcion read_adc() por automatico.

¿Tendría que esperar más en algun punto?

Saludos,
 
Perdón, no había visto tu segundo mensaje, pues no lo tengo en ASM pero igual pongo el C, para que lo chequen:

Código:
#include <16F877.h>
#device ADC=8
#fuses   HS,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT
#use delay (clock=20000000)
#use standard_io(b)
#use standard_io(d)
#use standard_io(e)

int valor_bateria=0x00;
int valor_alimentacion=0x00;

/* Mandar un comando al LCD */
void lcd_comando(int comando)
{
   output_low(PIN_E0);     /* Modo registro en el LCD */
   output_b(comando);      /* Manda el comando por el puerto B */
   output_high(PIN_E2);    /* Habilita el LCD */
   delay_us(5);            /* 5 us */
   output_low(PIN_E2);     /* Deshabilita el LCD */
   delay_ms(1);            /* 1 ms */
}

/* Mandar un caracter al LCD */
void lcd_caracter(char caracter)
{
   output_high(PIN_E0);    /* Modo caracter en el LCD */
   output_b(caracter);     /* Manda el caracter por el puerto B */
   output_high(PIN_E2);    /* Habilita el LCD */
   delay_us(5);            /* 5 us */
   output_low(PIN_E2);     /* Deshabilita el LCD */
   delay_ms(1);            /* 1 ms */
}

/* Funcion para mandar el cursor a posicion reuqerida */
void lcd_posicion(int linea, int posicion)
{
   switch (linea)
   {
      case 1:
         lcd_comando(0x80+(posicion-1));  /* Linea 1 posicion requerida -1 */
      break;

      case 2:
         lcd_comando(0xC0+(posicion-1));  /* Linea 2 posicion requerida -1 */
      break;
   }
}

/* Iniciar el LCD 16x2 JHD */
void lcd_iniciar(void)
{
   set_tris_b(0x00);       /* Salidas en el puerto B */
   set_tris_e(0x00);       /* Salidas en el puerto E */
   output_e(0x00);         /* Puerto e bajo */

   lcd_comando(0x38);      /* LCD Linea 1 */
   lcd_comando(0x38);      /* LCD Linea 2 */
   lcd_comando(0x0C);      /* Cursor apagado */
   lcd_comando(0x80);      /* LCD linea 1 */
   lcd_comando(0x06);      /* Desplazamiento del cursor a la derecha */
}

/* Funcion para leer el ADC */
void medir_entradas(void)
{
   /* ADC0 */
   set_adc_channel(0);              /* Lectura del canal 0 */
   delay_ms(5);                     /* 5 ms */
   valor_alimentacion=read_adc();   /* Se lee el canal 0 y pasa a valor_alimentacion */
   delay_ms(5);                     /* 5 ms */

   /* ADC1 */
   set_adc_channel(1);              /* Lectura del canal 1 */
   delay_ms(5);                     /* 5 ms */
   valor_bateria=read_adc();        /* Se lee el canal 1 y pasa a valor_bateria */
   delay_ms(5);			    /* 5 ms */	
}

/* Principal */
void main(void)
{
   setup_adc(ADC_CLOCK_INTERNAL);         /* Configuracion del convertidor */
   setup_adc_ports(RA0_RA1_RA3_ANALOG);   /* RA0 como entrada analogica */

   lcd_iniciar();                         /* Iniciar el LCD 16 x 2 */

   do
   {
      medir_entradas();          /* Manda medir */

      lcd_comando(0x01);      /* Limpiamos pantalla   */
      lcd_comando(0x02);      /* Cursor a casa*/

      printf(lcd_caracter,"AD0=%U AD1=%U",valor_alimentacion,valor_bateria);

      delay_ms(100);

   }while(true);
}

Saludos,
 
Hola. En C nunca programe. Los tiempos de adquisición parecen suficientes. Cuando empiezas la conversión, tienes que verificar que el bit GO/DONE se ponga a cero. Eso te dirá que la conversión está lista. Lo que no sé es si la función en C te hace eso automáticamente. Prueba hacer esto: Luego de que empieces la conversión, haz un ciclo que verifique que el bit GO/DONE (bit 2 de la dirección 1FH), Si el bit está a cero es que la conversión está lista, si no, el bucle continúa hasta que el bit se ponga a cero.

También sugiero la opinión de alguien más experimentado.

Saludos.
 
Hola,

Esa idea me gusta, de verificar el bit GO/DONE del ADCON0, solo que no veo en que punto meter tal verificación, esto por que la función read_adc() me deja sin control de esa parte. Ya que es ella quien me devuelve el valor de la conversión, pero como tu bien dices yo igualmente ignoro la estructura de esa función como para poder determinar si verifica el estado del bit GO/DONE o no.

Hasta ahorita no me he encontrado la referencia de esa función, así que si alguien sabe donde se puede checar esto pues no se quede callado.

Saludos,
 
Hola de nuevo, pues no se pero creo que el problema es el montaje, pues muevo o pongo la mano sobre algunos de los alambres del protoboard y casi se queda quieto, digo casi por que la variación es mínima, de estar en 139 se mueve a 140, o sea muy poco e inclusive se llega a quedar estático. Debo decir que tiendo a dejar un poco largos los puentes, a tal grado que al final me queda como una araña de colores alrededor y sobre el PIC, pero no se si esto es una causa real del problema o ya me sugestione ¿?.

Saludos,
 
Hola de nuevo, pues no se pero creo que el problema es el montaje, pues muevo o pongo la mano sobre algunos de los alambres del protoboard y casi se queda quieto, digo casi por que la variación es mínima

Si sucede algo asi me late que alguna referencia esta flotada, es decir no esta correctamente referenciada a tierra. Intenta medir con el multimetro que todas tus tierras estes conectadas entre si. Incluso ve si hay diferencias de potencial entre tierras.
 
HOLA alejandro_oo:

YO HE MANEJO C PARA PROGRAMAR PICS, Y LA FUNCION DE ADC_READ(); SE EN CARGA DE TODO EL PROCESO DE CONVERCION, ASI QUE CON ESTA INSTRUCCION NO HAY PROBLEMA, AHORA SI ESTAS UTILIZANDO VARIOS CANALES PARA LEER DATOS ANALOGOS, HAY PUEDE ESTAR EL PROBLEMA, POR QUE CUANDO SE HACE CAMBIO DE CANALES PARA LEER DATOS MUCHAS VECES EL CANAL SE QUEDA ESTATICO, ES DECIR QUE NO CAMBIA EL DATO SI NO QUE SE QUEDA LEYENDO EL DEL ANTERIOR CANAL, ESTO SUCEDE CUANDO LA CARGA DE ENTRADA DEL ADC NO CUMPLE CON LA EXIGENCIA MINIMA POR EL FABRICANTE, EN LA HOJA TECNICA DE MICROCHIP SE SUGIERE COLOCAR UNA RESISTENCIA DE 10k EN LA ENTRADA DE CADA ADC PARA REALIZAR UNA ADECUADA CIONVERCION SI ESTAS CONECTANDO LA BATERIA O LAS SEÑALES DIRECTAMENTE AL PUERTO SIN LAS RESISTENCIAS LO MAS SEGURO ES QUE EL PROBLEMA DE LA VARIACION SE DEBA A ESTO, DE IGUAL FORMA TRATA DE TRABAJAR CON FUENTES MUY BIEN FILTRADAS EN LO POSIBLE QUE NO SEAN "SWICHADAS", COMO LAS DE LOS PC POR ESTAS GENERAN DEMACIADO RUIDO :D
 
la respuesta que busca alejandroo es ; NO es normal, y para mi el problemos es que debes darle un mayor tiempo entre la adquisicoin de datos de adc0 y adc1, ya que actuelmente estas tomando los datos de manera seguida y el retardo es corto.
 
Hola panita, mira lo que creo q está pàsando es que la bateria a la que te estás conectando, puede estar variando ese potencial en unos cuantos mV,aunque no debería, pero que son lo suficientemente elevados para generar un salto en los registros ADRES..Como sabrás la resolución del ADC para producir un salto es de 4.8 mV, o sea que si tu entrada análógica varia en al menos 4.8mV, experimentarás un cambio en la salida................Para mi eso es lo que está pasando!!!
 
Hola a todos, gracias por sus amables respuestas.

Les comento que las variaciones ya se venían dando inclusive cuando manejaba un solo canal (AN0). Y llegue a pensar que eso era normal, pero ahora que se que no lo es, me desconcierta bastante.

La conexión de la batería la realizo por medio de un divisor de voltaje con resistencias, de este modo si tengo por decir 25 v a la entrada se divide entre 10 y me quedan 2.5 v los cuales conecto a la entrada del AD acompañado por el condensador de 100 nf a masa. Vigilo el máximo voltaje con un zener de 5.1 v. He puesto el esquema para que me corrijan en caso de estar mal en algún punto.

Por otro lado me gustaría que me recomendaran un voltaje de referencia de 5.0 v el mejor que se pueda. Por acá solo he sabido del LM336Z-5.0 no se que tan preciso sea, pues no lo he comprado, por eso pido sus opiniones.

Lo que pretendo es ir descartando todas las posibles causas para así lograr corregir el problema.

Turkito: pero mido el voltaje con mi multimetro y no se mueve para nada, a no ser que con este multimetro no se logre captar las variaciones de mV.

Saludos,
 

Adjuntos

  • an0_129.png
    an0_129.png
    5.4 KB · Visitas: 735
Ahora lo he pasado al simulador y funciona y muy bien, ahí si que se queda estable el AD y todo, pero esto quiere decir que el problema esta en el montaje del protoboard ¿?

¿O simplemente funciona estable por ser un simulador?

Saludos,
 

Adjuntos

  • m_v_152.gif
    m_v_152.gif
    21.4 KB · Visitas: 731
K onda alejandro_oo, fijate que lo mismo me pasaba cuando lo montaba en el protoboard, note que a veces le acercas la mano y la conversion varia, Trata de no pasar cables muy cerca del PIC, muchas veces esto mejoro un poco mis conversiones.

La otra es tratar de ir aproximando valores, tal vez tu conversion es muy pequeña que le afectan las pequeñas variaciones, a lo mejor si haces uso de metodos numericos para aproximar la recta que esperas
 
Hola Trent, Voy a cuidar lo de los cables, a ver que tal, ahora que lo ensamble te platico.

Lo que no se es de donde puedo sacar los 5.0 v precisos para Vref+, en el simulador muy bonito que me los da de la alimentación general, pero en la realidad ¿Cómo?, una referencia de voltaje ¿Cuál?

Saludos,
 
Atrás
Arriba