Autor Tema: El ADC me modifica la tensión en el pin a leer  (Leído 5735 veces)

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

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
El ADC me modifica la tensión en el pin a leer
« en: 05 de Febrero de 2008, 11:49:06 »
Os comento: He montado un potenciómetro con una pata a 5V, otra a 0V y la central la conecto directamente al canal AN0 del PIC. Realizo la lectura y el valor es calcado al obtenido en un voltímetro conectado al mismo punto. Hasta aquí no hay problema.

Ahora cojo el sensor que debo medir, es un sensor potenciómetrico de tres cables. Un cable lo conecto a 5V, el otro a 0V y utilizo el común para realizar la lectura. Con el voltímetro obtengo una salida correcta, voy moviendo el potenciómetro y todo va perfecto pero a la que le conecto la entrada analógica del PIC ese pin se me va a 0V para la mayor parte del recorrido del potenciómetro y sólo varía hasta centenas de milivoltios en su punto máximo. El potenciómetro tiene un valor 20K. Qué puede estar pasando? Cómo me afecta el ADC a la medida?

Muchas gracias!!

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #1 en: 05 de Febrero de 2008, 13:02:53 »
Hola DarkVect!

Por si es un problema de adaptación de impedancias... podrías poner un operacional en modo seguidor de tensión a ver como tira la cosa. ¿?¿?


Un saludo desde Alicante.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #2 en: 05 de Febrero de 2008, 14:08:33 »
Es lo primero que he pensado, pero claro, es añadir otro componente más con su alimentación, etc...

El potenciómetro que utilizaba al principio era de 2K y la medida era correcta. Hice la prueba de poner un potenciómetro del mismo valor que el sensor (20K) y hace lo mismo que el sensor, es decir que por lo visto es demasiado para el PIC.

Pruebo lo del seguidor y comento a ver qué tal.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #3 en: 05 de Febrero de 2008, 14:54:58 »
Ya he colocado el AO seguidor y lo mismo. Sin conexión al ADC la Vout del AO coincide con la tensión que sale del cable de señal del potenciómetro, al conectar el canal analógico la tensión cae. El efecto con el AO no es tan bestia: antes obtenía siempre 0V y <1V en un pequeño rango donde la conversión funcionaba bien. Ahora la conversión funciona en un rango un poco mayor, llego a 1,4V y de ahí se corta a 0V.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #4 en: 05 de Febrero de 2008, 15:06:50 »
Puedes poner el circuito que usaste con el operacional?

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #5 en: 05 de Febrero de 2008, 15:14:19 »
El operacional es un TLC272 y el circuito es un seguidor tal cual. El cable común del potenciómetro lo conecto a la entrada + del AO (pin3), la pata - del AO (pin2) la llevo a la salida (pin1) y la alimentación es de 12V (pin8) y la masa en el pin4.

Esta configuración tal cual, sin el PIC, funciona perfectamente, la entrada se replica a la salida sin problema. Si mido el pin del ADC sin nada conectado leo 0V. Si conecto el ADC a la salida del AO (pin1) ese pin pasa a valer de 0 a 1V ´(sólo en un pequeño margen, en el resto vale 0) según donde esté el potenciómetro en lugar de dar de 0 a 5V. Parece como si el PIC impusiera la tensión en ese pin del AO. En la entrada + del AO sigue habiendo la tensión correcta.

Os pego el código por si acaso:

Código: [Seleccionar]
#include <16F818.h>                                //PIC a utilizar
#device adc=10                                     //numero de bits del ADC

#fuses XT                                          //configuracion de fusibles
#fuses NOWDT
#fuses PROTECT
#fuses PUT
#fuses NOBROWNOUT
#fuses MCLR
#fuses NOLVP
#fuses CPD
#fuses NOWRT
#fuses NODEBUG

#use delay (clock=3276800)                         //Fosc=3,2768Mhz

#define LED       PIN_A1                           //LED de funcionamiento
#define LCD_RS    PIN_B1                           //pinout del LCD
#define LCD_RW    PIN_B2
#define LCD_E     PIN_B3
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#byte ADCON0=0x1F                                  //parametros ADC
#byte ADCON1=0x9F
#byte ADH=0x1E
#byte ADL=0x9E

#include <flex_lcd.c>                              //libreria LCD


int nClocks=0, nDelay=0, flag_seg=0;


#INT_TIMER2
void Interrupcion_Timer2()                         //interrupcion cada 5ms
{
   nDelay++;

   if(nDelay==200)
   {
      nDelay=0;
      flag_seg=1;
      output_high(LED);
   }
   else
   {
      output_low(LED);
   }
}


void main(void)
{
   int16 valor_adc=0;
   int decimales=0;
   int unidades=0;
   int wind_dir=0;

   disable_interrupts(GLOBAL);                     //deshabilitar interrupciones
   disable_interrupts(INT_EEPROM);                 //deshabilitar interrupcion EEPROM
   disable_interrupts(INT_RB);                     //deshabilitar interrupcion portb
   disable_interrupts(INT_TIMER0);                 //deshabilitar interrupcion del timer0
   disable_interrupts(INT_TIMER1);                 //deshabilitar interrupcion timer1
   disable_interrupts(INT_CCP1);                   //deshabilitar interrupcion CCP1
   disable_interrupts(INT_SSP);                    //deshabilitar interrupcion I2C / SPI
   disable_interrupts(INT_AD);                     //deshabilitar interrupcion ADC
   disable_interrupts(INT_EXT);                    //deshabilitar interrupcion RB0

   setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_1);      //preescaler=1
   setup_TIMER_1(T1_DISABLED);                     //desactivar timer1
   setup_TIMER_2(T2_DIV_BY_1,255,16);              //preescaler=16
   setup_CCP1(CCP_OFF);                            //desactivar modulo captura
   setup_SPI(SPI_SS_DISABLED);                     //desactivar SPI
   setup_ADC_PORTS(AN0);                           //entradas analogicas
   setup_ADC(ADC_CLOCK_INTERNAL);                  //activar modulo ADC

   set_adc_channel(0);
   set_tris_a(0b00000001);                         //porta todo como salida menos A0

   ext_int_edge(H_TO_L);                           //interrupcion externa en flanco de bajada

   port_b_pullups(TRUE);                           //pullups portb activadas

   ADCON0=0b11000001;                              //configurar ADC
   ADCON1=0b10001110;

   enable_interrupts(INT_TIMER2);                  //habilitar interrupcion timer2
   enable_interrupts(GLOBAL);                      //interrupciones activadas

   lcd_init();
   delay_ms(50);
   output_a(0b0001000);

   do
   {
      if(flag_seg==1)
      {
         flag_seg=0;
         valor_adc=read_adc();
         
         wind_dir=valor_adc/2,8417;

         printf(lcd_putc,"\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"ADC=%lu", valor_adc);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"Dirección=%u", wind_dir);
      }

   }while(TRUE);
}

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #6 en: 05 de Febrero de 2008, 15:24:02 »
No uses un seguidor tal cual, porque es evidente que afecta la resistencia equivalente vista desde el punto de vista del potenciómetro. recuerda que ahora no tienes una fuente de alimentación.

Utiliza un amplificador de ganancia unitaria con resistencias de al menos 50K, y mira a ver que es lo que pasa.

Saludos
Reinier

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #7 en: 05 de Febrero de 2008, 15:26:45 »
OK!! Voy a hacer la prueba y te comento.

De todos modos quisiera aclarar de forma más precisa lo que sucede:

Con el potenciómetro al mínimo (punto común a masa) leo 0V en el ADC. A medida que voy aumentando el valor de tensión el valor del ADC va creciendo hasta llegar a 1V aprox. (valor ADC=200) donde se queda clavado sin seguir subiendo por mucho que aumente la tensión.

EDITO: no puedo hacer un ampli de G=1 tal cual porque sólo es posible con una configuración inversora.
EDITO2: He probado con un no inversor (G=2) y sigue igual. Ahora para una entrada de 0 a 0,5V mide bien, pero se queda anclado ahí.
« Última modificación: 05 de Febrero de 2008, 15:34:24 por DarkVect »

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #8 en: 05 de Febrero de 2008, 15:55:39 »
SOLUCIONADO!!!!  :-/ :-/

No me preguntéis por qué, pero he quitado la línea set_tris_a(0b00000001); y todo ha vuelto a funcionar!! Ahora mismo lo tengo con el seguidor pero me jugaría algo a que funciona sin. Por qué esa línea me lo fastidiaba? Cómo configuro entonces el resto de pines del puerto?

EDITO: pues funciona sin seguidor perfectamente!! Maldita línea!! Alguien sabe cómo configuro el resto de pines? No he utilizado fast_io.
« Última modificación: 05 de Febrero de 2008, 16:01:32 por DarkVect »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17755
    • MicroPIC
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #9 en: 05 de Febrero de 2008, 16:00:09 »
Sospecho que tenías el pin declarado como entrada digital, en lugar de como entrada analógica.
Por lo que veo en tu código mi única duda es con estas instrucciones, puesto que no he revisado la data:

   ADCON0=0b11000001;                              //configurar ADC
   ADCON1=0b10001110;

¿Será que tienes un fallo ahí?
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #10 en: 05 de Febrero de 2008, 16:09:03 »
Te comento la configuración tal y como sale en el Data:

ADCON0=0b11000001; el 11 es para seleccionar el reloj interno RC, los 3 ceros que siguen son para seleccionar el canal0, el siguiente cero es el GO/DONE, el siguiente bit no está implementado y el último 1 es el ADON para iniciar la conversión.

ADCON1=0b10001110; el primer 1 es justificación a la derecha, los 3 ceros siguientes no están implementados, y los últimos cuatro bits (1110) significan, según el Data: AN0=analógico y el resto digitales, con las Vref la alimentación.

Cuando se utilzia el ADC los tris cómo se configuran?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17755
    • MicroPIC
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #11 en: 05 de Febrero de 2008, 16:19:50 »
Ah, jeje, creo que he visto el problema.

No has puesto #use fast_io(A)

Al no tenerlo, en el momento que haces  output_a(0b0001000); me apuesto lo que quieras a que eso desconfigura la entrada analógica y la pone en digital.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #12 en: 05 de Febrero de 2008, 16:27:42 »
Entonces la cosa sería:

#use_fast_io(a);
set_tris_a(0b00000001);
ADCON0=0b11000001;                             
ADCON1=0b10001110;

Voy a probarlo!!

FANTÁSTCIO!! Ahora sí que sí!!

Ya que estás por aquí Nocturno, cómo puedo escalar el valor del ADC para que marque mi magnitud real? La conversión directa es:

real=val_ADC*0,3519 o real=val_ADC/2,8417

Ambas variables son int16 y teniendo en cuenta que val_adc puede llegar a valer 1023 sólo puedo hacer: val_adc*10/28 o val_adc*35/100 sin pasarme de los 2^16.
« Última modificación: 05 de Febrero de 2008, 16:36:20 por DarkVect »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17755
    • MicroPIC
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #13 en: 05 de Febrero de 2008, 17:23:15 »
Yo en esos casos hago uso del cast a float:

real=(int16)((float)val_ADC*0,3519);
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: El ADC me modifica la tensión en el pin a leer
« Respuesta #14 en: 06 de Febrero de 2008, 09:57:01 »
Nocturno he probado eso y no me da. Al mostrar real en el LCD aparece 3519.