Autor Tema: ADC del PIC: ¿es normal esto?  (Leído 2897 veces)

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

adbensi

  • Visitante
ADC del PIC: ¿es normal esto?
« en: 23 de Diciembre de 2006, 11:32:06 »
Hola,

Estoy usando un canal AD del pic 18f4550 configurado para resolucion de 10 bits y como prueba estoy visualizando el valor de la conversion en un LCD, 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 quimica 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.

Estoy alimentando el microcontrolador con una bateria, asy no creo que exista interferencia por alimentacion. Yo tieno uno capacitor de 100nF en la patita AD del PIC a massa, e já utilizei outros PICs 18F4550.

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.

Acredito que estoy con dificuldade en lo codigo con C18, me gusta se for possible verificar-lo.

/** D E C L A R A T I O N S **************************************************/
#pragma config  CPUDIV = OSC1_PLL2   // External Oscillator with PLL
#pragma config  FOSC = HSPLL_HS      // PIC USB clock is 48 MHz
#pragma config  PLLDIV = 5         // clock for full speed USB (20MHz)
#pragma config  USBDIV = 2         // high speed USB
#pragma config  VREGEN = ON         // turn on USB regulator
#pragma config  WDT = OFF         // spot, the watchdog turned off
#pragma config  WDTPS = 32768      // watchdog count (131 seconds)
#pragma config  PWRT = OFF         // power up timer on
#pragma config  BOR = OFF          // brown-out voltage

/****************************************************************************/
unsigned int DescriminarCanal(unsigned char canal)
/****************************************************************************/
{
   ADCON0bits.CHS0=(canal&0b00000001);
   ADCON0bits.CHS1=((canal&0b00000010)>>1);
   ADCON0bits.CHS2=((canal&0b00000100)>>2);
   ADCON0bits.CHS3=((canal&0b00001000)>>3);
         
   // Configure A/D interrupt
   PIR1bits.ADIF = 0; // The A/D conversion is not complete
   // Start conversion: Wait for A/D conversion to complete
   ADCON0bits.GO = 1;            // Start AD conversion

   while(ADCON0bits.GO);      // Wait for conversion
   return ADRES;
}

/****************************************************************************/
void main(void)
/****************************************************************************/
{
   // Configure analog pins, voltage reference and digital I/O (ADCON1)
   //   — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
   //   0 0     0     0     0     1     0     1 = 0x05
   // Select A/D acquisition time (ADCON2)
   // Significant bits - Right justified - 20 TAD - FOSC/64
   // ADFM — ACQT2 ACQT1 ACQT0 ADCS2 ADCS1 ADCS0
   //    1 0     1     1     1     1     1     0 = 0xBE
   ADCON1 = 0x05;
   ADCON2 = 0xBE;
   // Turn on A/D module (ADCON0bits.ADON)
   ADCON0 = 0x01;
   
   while(1)
   {
      MostrarLCD(DescriminarCanal(0)); // Aquision en AN0
      MostrarLCD(DescriminarCanal(1)); // Aquision en AN1
      MostrarLCD(DescriminarCanal(2)); // Aquision en AN2
      ...
      MostrarLCD(DescriminarCanal(8)); // y ciclo infinito
   }
}

Saludos,
Alexandre.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ADC del PIC: ¿es normal esto?
« Respuesta #1 en: 23 de Diciembre de 2006, 12:58:35 »
Que varíe levemente puede ser, ya que estamos hablando de una precisión de 5mV por dato, de todas formas si es una batería y no tienes ruido eléctrico de ninguna índole, no debería ocurrir.

De todas formas, unas sugerencias

Alimenta al pic con la batería pero no olvides de poner en el mismo un capacitor de .1uF para que puedas filtrar el ruido de conmutación.

En cuanto al A/D, puedo ver en tu código que no estas esperando un tiempo de estabilización de la tensión.   Luego de seleccionar un canal esperate unos 20 o 30 useg antes de iniciar la conversión. 

Tal vez este hilo te sea de mucha uilidad

http://www.todopic.com.ar/foros/index.php?topic=14529.msg88942#msg88942


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: ADC del PIC: ¿es normal esto?
« Respuesta #2 en: 23 de Diciembre de 2006, 13:47:30 »
viejo maunix simpre en tus presiciones analogicas

discupas por el comentario que no aporta nada a la inquitud del forista.
bien bien

saludos y gracias.

adbensi

  • Visitante
Re: ADC del PIC: ¿es normal esto?
« Respuesta #3 en: 23 de Diciembre de 2006, 13:50:10 »
Gran Maumix,

 Yo link me ayuda mui, gracias  :-/ Estoy adotando 50uS após ADCON0bits.GO, ok?
 Remomiendas turn on/off el conversor A/D para cambiar los canais? Ejemplo (***):

/****************************************************************************/
unsigned int DescriminarCanal(unsigned char canal)
/****************************************************************************/
{
   ADCON0bits.CHS0=(canal&0b00000001);
   ADCON0bits.CHS1=((canal&0b00000010)>>1);
   ADCON0bits.CHS2=((canal&0b00000100)>>2);
   ADCON0bits.CHS3=((canal&0b00001000)>>3);

   *****************
   ADCON0bits.ADON = 1; // Turn on el A/D module
   *****************
        
   // Configure A/D interrupt
   PIR1bits.ADIF = 0; // The A/D conversion is not complete
   // Start conversion: Wait for A/D conversion to complete
   ADCON0bits.GO = 1;            // Start AD conversion

   while(ADCON0bits.GO);      // Wait for conversion

   *****************
   DelayUs(50);
   *****************

   *****************
   ADCON0bits.ADON = 0; // Turn off el A/D module
   *****************

   return ADRES;
}

/****************************************************************************/
void main(void)
/****************************************************************************/
{
   // Configure analog pins, voltage reference and digital I/O (ADCON1)
   //   — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
   //   0 0     0     0     0     1     0     1 = 0x05
   // Select A/D acquisition time (ADCON2)
   // Significant bits - Right justified - 20 TAD - FOSC/64
   // ADFM — ACQT2 ACQT1 ACQT0 ADCS2 ADCS1 ADCS0
   //    1 0     1     1     1     1     1     0 = 0xBE
   // Turn off A/D module (ADCON0bits.ADON)

   **************
   ADCON0 = 0x00;
   **************

   ADCON1 = 0x05;
   ADCON2 = 0xBE;
  
   while(1)
   {
      MostrarLCD(DescriminarCanal(0)); // Aquision en AN0
      MostrarLCD(DescriminarCanal(1)); // Aquision en AN1
      MostrarLCD(DescriminarCanal(2)); // Aquision en AN2
      ...
      MostrarLCD(DescriminarCanal(); // y ciclo infinito
   }
}

Un grande Saludo!!
Alexandre.

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: ADC del PIC: ¿es normal esto?
« Respuesta #4 en: 24 de Diciembre de 2006, 08:59:54 »
Creo que el problema esta en la alimentación, como estas tomando como referencia del conversor AD la tensión de alimentación del pic, cualquier variación en esta te genera variaciones en la salida, decís que alimentas el pic con una batería, pero no especificas si usas un regulador o no, o si este esta correctamente alimentado
Por otro lado no deberías usar el mismo regulador para el pic y para el display.

Suerte

Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ADC del PIC: ¿es normal esto?
« Respuesta #5 en: 24 de Diciembre de 2006, 12:46:54 »
viejo maunix simpre en tus presiciones analogicas

discupas por el comentario que no aporta nada a la inquitud del forista.
bien bien

¿Porqué opinas eso microcom? Creo que nuestro amigo está teniendo casualmente problemas con su alimentación y con que no espera el suficiente tiempo de muestreo y es por ello que le indiqué eso mismo en mi post.   En general trato siempre de ver cual es la inquietud del que pregunta y trato también de no ser muy extenso en la explicación porque a veces se hace tedioso si solamente hace falta un par de consejitos.

El link pasa a explayar las causas por las cuales no se puede convertir "de inmediato".

Gran Maumix,

 Yo link me ayuda mui, gracias  :-/ Estoy adotando 50uS após ADCON0bits.GO, ok?
 Remomiendas turn on/off el conversor A/D para cambiar los canais? Ejemplo (***):

No, el retardo debe ser antes de la conversión.

Apagar el A/D tampoco es bueno, todo lo contrario.  Enciende el A/D al inicio de tu aplicación y déjalo siempre encendido.

Te muestro donde debe estar el retardo.

/****************************************************************************/
unsigned int DescriminarCanal(unsigned char canal)
/****************************************************************************/
{
   ADCON0bits.CHS0=(canal&0b00000001);
   ADCON0bits.CHS1=((canal&0b00000010)>>1);
   ADCON0bits.CHS2=((canal&0b00000100)>>2);
   ADCON0bits.CHS3=((canal&0b00001000)>>3);

   DelayUs(50);

   // Configure A/D interrupt
   PIR1bits.ADIF = 0; // The A/D conversion is not complete
   // Start conversion: Wait for A/D conversion to complete
   ADCON0bits.GO = 1;            // Start AD conversion

   while(ADCON0bits.GO);      // Wait for conversion

   ADCON0bits.ADON = 0; // Turn off el A/D module
   *****************

   return ADRES;
}

Pasos

1) Enciende el A/D.  Esto lo puedes hacer al inicio de la aplicación
2) Selecciona el canal.
3) Espera un tiempo (ej 50 useg), este tiempo el cual está comentado en el datasheet y en el link que te pasé anteriormente es para darle tiempo al capacitor del A/D a que se cargue a la misma tensión que el canal A/D.
4) Inicia la conversión
5) Espera el resultado


Además de todo esto, la referencia de voltaje del A/D en tu aplicación está dada por la referencia de la alimentación de tu pic.  Si no filtras bien la alimentación (no importa si estás con batería o no) la conversión tendrá una pequeña variación también.

El capacitor de .1uF al lado del pic es para evitar que los cambios bruscos de consumo de corriente del pic por las características de los semiconductores digitales que funcionan a CORTE y SATURACION, entonces por momentos no se consume corriente y unos microsegundos después se está consumiendo el máximo de corriente.  Por esta razón se usa el capacitor el cual está muy próximo al microcontrolador (en realidad se usa para cualquier semiconductor) y permite entonces que la corriente sea abastecida por el capacitor que tiene una capacidad de entregar corriente más veloz (por estar muy próximo y por ser de baja capacitancia) que la batería o fuente de alimentación que tal vez esté mas lejos dentro del circuito.

Espero hayas entendido mi español, sino , trataré de ensayar una explicación en inglés

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

adbensi

  • Visitante
Re: ADC del PIC: ¿es normal esto?
« Respuesta #6 en: 26 de Diciembre de 2006, 17:36:30 »

 Una excelente explicacion Maumix, tieno entendido todo, eso aprendi  :-/
 Uno grande saludo!
  :-)  :-)  :-)

Alexandre.