Autor Tema: Re: Convertidor A/D [SOLUCIONADO]  (Leído 5626 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Convertidor A/D [SOLUCIONADO]
« 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
« Última modificación: 13 de Junio de 2013, 04:20:45 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Convertidor A/D
« Respuesta #1 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
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado alperez

  • PIC18
  • ****
  • Mensajes: 255
Re: Convertidor A/D
« Respuesta #2 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

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Convertidor A/D
« Respuesta #3 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.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Convertidor A/D
« Respuesta #4 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.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Convertidor A/D
« Respuesta #5 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
"Nada es imposible, no si puedes imaginarlo"

Desconectado alperez

  • PIC18
  • ****
  • Mensajes: 255
Re: Convertidor A/D
« Respuesta #6 en: 07 de Junio de 2013, 03:32:31 »
Página 132 del datasheet


Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Convertidor A/D
« Respuesta #7 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!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Convertidor A/D
« Respuesta #8 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
"Nada es imposible, no si puedes imaginarlo"

Desconectado alperez

  • PIC18
  • ****
  • Mensajes: 255
Re: Convertidor A/D
« Respuesta #9 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 

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Convertidor A/D
« Respuesta #10 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Convertidor A/D
« Respuesta #11 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.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Convertidor A/D
« Respuesta #12 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.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado alperez

  • PIC18
  • ****
  • Mensajes: 255
Re: Convertidor A/D
« Respuesta #13 en: 08 de Junio de 2013, 18:30:45 »
Curioso, a mi me compila, cierto es, que no con ese PIC

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Convertidor A/D
« Respuesta #14 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.


 

anything