TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Miquel_S en 06 de Junio de 2013, 18:01:18

Título: Re: Convertidor A/D [SOLUCIONADO]
Publicado por: Miquel_S en 06 de Junio de 2013, 18:01:18
Hola, estoy intentando hacer una aplicacion donde uso el convertidor analogico/digital, y para probar su funcionamiento he compilado este codigo:
Código: C
  1. #include <16F873a.h>
  2. #device adc=10
  3. #use delay(clock=4000000)
  4. #fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
  5. #use standard_io(b)
  6.  
  7. #include "flex_lcd.c"
  8. //#define LCD_DB4   PIN_B4
  9. //#define LCD_DB5   PIN_B5
  10. //#define LCD_DB6   PIN_B6
  11. //#define LCD_DB7   PIN_B7
  12.  
  13. //#define LCD_RS    PIN_B0
  14. //#define LCD_RW    PIN_B1
  15. //#define LCD_E     PIN_B2
  16.  
  17. void main()
  18. {
  19.    int16 q;
  20.    float p;
  21.    
  22.    setup_adc_ports(AN0);               // Canal 0 analógico
  23.    setup_adc(ADC_CLOCK_DIV_8);      // Fuente de reloj RC
  24.    
  25.    lcd_init();
  26.    printf(lcd_putc, "\fConvertidor A/D");
  27.    delay_ms(1000);
  28.    
  29.    while(TRUE)
  30.    {
  31.       set_adc_channel(0);        // Habilitamos canal 0
  32.       delay_us(20);
  33.      
  34.       q = read_adc();         // Lectura canal 0
  35.       p = 5.0 * q / 1024.0;   // Conversion a tension
  36.      
  37.       printf(lcd_putc, "\fADC = %4ld", q);
  38.       printf(lcd_putc, "\nVoltage = %01.3fV", p);
  39.      
  40.       delay_ms(150);
  41.    }
  42. }
Pero al montarlo en la protoboard me encuentro con que los numeros no dejan de oscilar, y como no estoy seguro de si son interferencias o fallo en el programa, agradeceria que alguien de ustedes me sacase de dudas.

Gracias.

Miquel_S
Título: Re: Convertidor A/D
Publicado por: QIQE en 06 de Junio de 2013, 18:08:35
La funcion readadc implica poner en marcha el adc esperar a que esté la lectura y leer el resultado del adc? Mira en algún ejemplo por si necesitas arrancar la conversión y esperar un tiempo
Título: Re: Convertidor A/D
Publicado por: alperez en 06 de Junio de 2013, 18:12:52
Como te dice QIQE, tienes que esperar un tiempo a que se estabilice mas el tiempo de integración
Título: Re: Convertidor A/D
Publicado por: KALLITOS en 06 de Junio de 2013, 19:06:17
Esas oscilaciones normalmente se presentan lo que hago es hacer promedios y mostrarlo/manejarlo para tu caso realiza por ejemplo tantas lecturas y promedias, teniendo en cuenta la pausa en us que usas, para lograr que el valor sea mas estable, una impresion cada 300 ms estara muy buena.

saludos.
Título: Re: Convertidor A/D
Publicado por: MGLSOFT en 06 de Junio de 2013, 20:58:13
El secreto en esto es que no tengas que cambiar el canal, en tu caso es posible, saca el setADCchanel afuera del while(true) y veras como mejora.
La pausa de 20 us aumentala a 20 ms y creo que dejara de oscilarte bastante.
Título: Re: Convertidor A/D
Publicado por: rivale en 06 de Junio de 2013, 21:14:21
como te comentan solo saca el set_acd_channel de tu while y poras hacer lecturas continuas.

que tienes conectado a tu canal?, puede que el ruido sea de tu sensor
Título: Re: Convertidor A/D
Publicado por: alperez en 07 de Junio de 2013, 03:32:31
Página 132 del datasheet

Título: Re: Convertidor A/D
Publicado por: Miquel_S en 07 de Junio de 2013, 18:12:01
Gracias a todos por la ayuda, he modificado el codigo con lo minimo para hacer funcionar el A/D pero sigue oscilando, voy a volver a leer el datasheet para ver que estoy pasando por alto.
Código: C
  1. #include <16F873a.h>
  2. #device adc=10
  3. #use delay(clock=4000000)
  4. #fuses XT,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
  5. #use standard_io(b)
  6.  
  7. #include "flex_lcd.c"
  8. //#define LCD_DB4   PIN_B4
  9. //#define LCD_DB5   PIN_B5
  10. //#define LCD_DB6   PIN_B6
  11. //#define LCD_DB7   PIN_B7
  12.  
  13. //#define LCD_RS    PIN_B0
  14. //#define LCD_RW    PIN_B1
  15. //#define LCD_E     PIN_B2
  16.  
  17. void main()
  18. {
  19.    int16 Valor;
  20.    
  21.    lcd_init();
  22.    setup_adc_ports(AN0);               // Canal 0 analogico
  23.    setup_adc(ADC_CLOCK_DIV_8);      
  24.    set_adc_channel(0);            // Habilitamos Canal0
  25.    delay_ms(20);
  26.  
  27.    do
  28.    {
  29.       Valor = read_adc();         // Lectura canal 0
  30.       printf(lcd_putc, "\fCanal1 = %4ld", Valor);    
  31.       delay_ms(300);
  32.    }while(TRUE);
  33. }
como te comentan solo saca el set_acd_channel de tu while y poras hacer lecturas continuas.

que tienes conectado a tu canal?, puede que el ruido sea de tu sensor
Hola rivale al canal tengo conectado un simple potenciometro de 250K.

Saludos a todos!
Título: Re: Convertidor A/D
Publicado por: rivale en 07 de Junio de 2013, 22:58:37
Pues no veo error en tu código, que tanto oscilan tus valores?, intenta cambiar tu configuración del adc y ponle ADC_clock_internal.

y no hay algún error en tu protoboard?, o intenta con otro canal
Título: Re: Convertidor A/D
Publicado por: alperez en 08 de Junio de 2013, 03:24:53

Citar
Hola rivale al canal tengo conectado un simple potenciometro de 250K.


Pon el esquema espero que tenga las refencias a cero y a VREF y asegurate que las tensiones son estables, por ejemplo con pequeños condensadores, lo más cerca posible del PIC

¿La tension de referencia es VDD?:
Código: [Seleccionar]
setup_adc_ports(AN0|VSS_VDD);
Y haz un filtrado, es imprescindible en todos los DAC, por ejemplo así:

Código: [Seleccionar]
for(i=0; i<200;i++)                                   //Tomas 200 muestras y las sumas
         {
           adc_valor+= read_adc();
           delay_us(11);                                //Demos tiempo al ADC para terminar la conversión anterior (TAD)
          }
adc_valor /= 200;                                    //aqui calculas el promedio de 200 muestras 
Título: Re: Convertidor A/D
Publicado por: Picuino en 08 de Junio de 2013, 06:14:31
Puedes tener problemas por el reloj del ADC.
Intenta configurar el reloj del ADC con la menor frecuencia posible, a ver si deja de oscilar la medida.

Saludos.
Título: Re: Convertidor A/D
Publicado por: Picuino en 08 de Junio de 2013, 06:18:09
Intenta:
setup_adc(ADC_CLOCK_DIV_128);

Y no hace falta que añadas ningún delay_ms();

Saludos.
Título: Re: Convertidor A/D
Publicado por: Miquel_S en 08 de Junio de 2013, 17:57:45
Intenta:
setup_adc(ADC_CLOCK_DIV_128);

Y no hace falta que añadas ningún delay_ms();

Saludos.
Hola Picuino esta noche voy a hacer pruebas, aunque por lo que lei en el datasheet solo puedo configurar hasta 32.

Citar
Hola rivale al canal tengo conectado un simple potenciometro de 250K.


Pon el esquema espero que tenga las refencias a cero y a VREF y asegurate que las tensiones son estables, por ejemplo con pequeños condensadores, lo más cerca posible del PIC

¿La tension de referencia es VDD?:
Código: [Seleccionar]
setup_adc_ports(AN0|VSS_VDD);
Y haz un filtrado, es imprescindible en todos los DAC, por ejemplo así:

Código: [Seleccionar]
for(i=0; i<200;i++)                                   //Tomas 200 muestras y las sumas
         {
           adc_valor+= read_adc();
           delay_us(11);                                //Demos tiempo al ADC para terminar la conversión anterior (TAD)
          }
adc_valor /= 200;                                    //aqui calculas el promedio de 200 muestras 

Tambien voy a estudiar tu opcion, aunque en el manual de CCs la instruccion que tu propones, setup_adc_ports(AN0|VSS_VDD) da error de compilacion tiene que ser sin VSS_VDD.

Gracias de nuevo a todos.
Título: Re: Convertidor A/D
Publicado por: alperez en 08 de Junio de 2013, 18:30:45
Curioso, a mi me compila, cierto es, que no con ese PIC
Título: Re: Convertidor A/D
Publicado por: Picuino en 09 de Junio de 2013, 09:44:40
A mi el ADC no me da problemas. No necesito ni condensadores ni calcular el promedio de muchas muestras.
El único caso que me dió problemas (la lectura variaba mucho arriba y abajo) fue el de un programa en el que configuré el oscilador del ADC con una frecuencia demasiado elevada. Me costo bastante llegar a la solución.

De todas formas, deberías descartar que haya ruido en la entrada del ADC o en la referencia positiva del ADC (la alimentación). Se puede conseguir llevando la entrada a un potenciómetro, alimentas el potenciómetro entre Vdd y GND y el cursor a la entrada del ADC.
En una protoboard con distancias cortas y sin ruido eléctrico cercano, la lectura debería ser estable.

Saludos.
Título: Re: Convertidor A/D
Publicado por: alperez en 09 de Junio de 2013, 11:31:22
En la alimentación del ADC, cerca del PIC es donde digo que es conveniente poner un pequeño condensador, así eliminamos algunos ruidos y estabilizar la tensión
Título: Re: Convertidor A/D
Publicado por: MerLiNz en 09 de Junio de 2013, 11:43:34
El ADC en las protoboards suele dar muchas lecturas erroneas y oscilan mucho, los condensadores ayudan algo, aun asi no esperes precision en una protoboard, ya de por si la resistencia entre pistas/cables hace que la vref sea incorrecta.

Lo ideal es una board y soldado todo.
Título: Re: Convertidor A/D
Publicado por: Miquel_S en 09 de Junio de 2013, 12:19:14
El ADC en las protoboards suele dar muchas lecturas erroneas y oscilan mucho, los condensadores ayudan algo, aun asi no esperes precision en una protoboard, ya de por si la resistencia entre pistas/cables hace que la vref sea incorrecta.

Lo ideal es una board y soldado todo.
En esto estoy MerLiNz, en cuanto tenga el modulo analogico terminado para poder conectar a la entrenadora os cuento los resultados.
A mi el ADC no me da problemas. No necesito ni condensadores ni calcular el promedio de muchas muestras.
El único caso que me dió problemas (la lectura variaba mucho arriba y abajo) fue el de un programa en el que configuré el oscilador del ADC con una frecuencia demasiado elevada. Me costo bastante llegar a la solución.

De todas formas, deberías descartar que haya ruido en la entrada del ADC o en la referencia positiva del ADC (la alimentación). Se puede conseguir llevando la entrada a un potenciómetro, alimentas el potenciómetro entre Vdd y GND y el cursor a la entrada del ADC.
En una protoboard con distancias cortas y sin ruido eléctrico cercano, la lectura debería ser estable.

Saludos.
Perdona mi torpeza Picuino, pero como puedes configurar el setup_adc(ADC_CLOCK_DIV_128); si en el datasheet te dice:
Fosc/2
Fosc/8
Fosc/32
Frc

Saludos!
Título: Re: Convertidor A/D
Publicado por: Picuino en 09 de Junio de 2013, 12:48:26
La torpeza es mía, que no repasé el manual del 16F873.

En principio ADC_CLOCK_DIV_8 te debería valer hasta 5Mhz. Puedes probar con ADC_CLOCK_DIV_32 a ver si mejora.

Otro punto a considerar es el tiempo de adquisición, pero para una medida de una tensión constante no debería darte problemas.

Otro punto que te puede dar problemas es la referencia positiva y negativa del ADC. Si si usas como referencia la tensión de alimentación y esta oscila mucho, intenta colocar un buen condensador o utiliza los pines de entrada de tensión de referencia y llévalos a un buen condensador.

¿Entre qué valores oscila?

Saludos.
Título: Re: Convertidor A/D
Publicado por: Miquel_S en 09 de Junio de 2013, 17:06:12
En principio ADC_CLOCK_DIV_8 te debería valer hasta 5Mhz. Puedes probar con ADC_CLOCK_DIV_32 a ver si mejora.
Otro punto a considerar es el tiempo de adquisición, pero para una medida de una tensión constante no debería darte problemas.
¿Entre qué valores oscila?
Saludos.
Hola de nuevo Picuino, el ADC_CLOCK_DIV_32 precisamente acabo de probarlo con un cristal de 20MHz y sigue haciendo lo mismo, al oscilar no tiene unos valores fijos, mueves el potenciometro a cualquier posicion y aunque dejes de moverlo el valor de la medicion va subiendo y bajando sin parar.

Miquel_S
Título: Re: Convertidor A/D
Publicado por: Picuino en 10 de Junio de 2013, 13:14:07
¿Y si conectas la entrada a Vdd o a GND?
¿Has probado con resistencias fijas?
Título: Re: Convertidor A/D
Publicado por: Miquel_S en 10 de Junio de 2013, 17:34:49
¿Y si conectas la entrada a Vdd o a GND?
¿Has probado con resistencias fijas?
Conectando directamente a Vdd o Vss la medicion es correcta, lo que si me he dado cuenta es que el A/D es muy sensible, teniendo el pin de entrada sin conectar en ningun sitio con acercarlo a una fuente los valores oscilan, por lo cual doy por seguro que el problema que tengo es de interferencias.
Terminare por montar el modulo analogico en una PCB y probar.

Saludos!
Título: Re: Convertidor A/D
Publicado por: Picuino en 10 de Junio de 2013, 19:11:14
Pero si la señal de entrada va a una resistencia, las interferencias no pueden ser muy grandes.
Prueba conectando una resistencia a GND y otra a Vdd (un divisor de tensión) a ver si es estable.
Puede que el potenciómetro esté mal.

Saludos.
Título: Re: Convertidor A/D
Publicado por: AngelGris en 10 de Junio de 2013, 20:15:41
  ¿El pote es de 250K? Yo probaría con un pote de 5K
Título: Re: Convertidor A/D
Publicado por: Miquel_S en 11 de Junio de 2013, 17:19:37
Pero si la señal de entrada va a una resistencia, las interferencias no pueden ser muy grandes.
Prueba conectando una resistencia a GND y otra a Vdd (un divisor de tensión) a ver si es estable.
Puede que el potenciómetro esté mal.

Saludos.

Gracias Picuino, he probado con el divisor de tensión y la medición es mucho más perfecta, apenas oscila.
 ¿El pote es de 250K? Yo probaría con un pote de 5K
Gracias AngelGris, intentare encontrar uno de 5k para probar.

Saludos!
Título: Re: Convertidor A/D (SOLUCIONADO)
Publicado por: Miquel_S en 13 de Junio de 2013, 04:16:50
Al final conseguí que me funcionara, lo monte en PCB y cambie por otro potenciómetro mas pequeño . Gracias a ustedes entendí un poco mejor el funcionamiento de A/D.

Saludos!  
Título: Re: Convertidor A/D [SOLUCIONADO]
Publicado por: rivale en 13 de Junio de 2013, 11:10:52
Que bueno que funcionó finalmente  :-)