Autor Tema: Lectura inestable del Adc en 18f2550  (Leído 3307 veces)

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

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Lectura inestable del Adc en 18f2550
« en: 26 de Diciembre de 2011, 10:32:36 »
Hola!Pues el tema es que estoy intentado hacer un programa de prueba, que lea el valor en un potenciometro y lo muestre por un LCD, pero no consigo hacerlo funcionar bien.Este es el codigo:

Código: C
  1. #include <18F2550.h>
  2. #device ADC=8
  3. #fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOUSBDIV,VREGEN
  4. #use delay(clock=4000000)
  5. //Para poder acceder al registro
  6. #byte ADCON2=0xFC0
  7.  
  8. //Pines para lcd_flex
  9. #define LCD_DB4   PIN_B4
  10. #define LCD_DB5   PIN_B5
  11. #define LCD_DB6   PIN_B6
  12. #define LCD_DB7   PIN_B7
  13.  
  14. #define LCD_RS    PIN_C0
  15. #define LCD_RW    PIN_C1
  16. #define LCD_E     PIN_C2
  17.  
  18. #include "flex_lcd.c"
  19.  
  20. int valor;
  21.  
  22. void main()
  23. {
  24.    setup_spi(SPI_SS_DISABLED);
  25.    setup_wdt(WDT_OFF);
  26.    setup_timer_1(T1_DISABLED);
  27.    setup_timer_2(T2_DISABLED,0,1);
  28.    setup_comparator(NC_NC_NC_NC);
  29.    setup_vref(FALSE);
  30.    //Establecer a como entrada
  31.    set_tris_a(0x01); //Entrada an0
  32.    //Se configura el ADC
  33.    //Reloj para el conversor
  34.    setup_adc(ADC_CLOCK_DIV_2);//De 2 a 64
  35.    /*
  36.    Se debe configurar el tiempo de adquisicion, para ello se accede al registro
  37.    ADCON2,Pag 257 datasheet, para un valor de 20Tadq se debe cargar el valor 111
  38.    en los bits 5-3 del registro, para ello aplicaremos una mascara OR 00111000
  39.    */
  40.    ADCON2= ADCON2 | 0b00111000;
  41.    //Se define entradas analogicas y valores referencia
  42.    setup_adc_ports (AN0); //Elige terminales análogicas
  43.    //Se selecciona el canal
  44.    set_adc_channel(AN0);
  45.    
  46.    lcd_init();         //inicializa lcd
  47.    lcd_putc('\f');   //borra lcd
  48.    lcd_gotoxy(1,1);
  49.    
  50.    disable_interrupts(global);
  51.    
  52.       while(1)
  53.       {
  54.             //Se selecciona el canal
  55.       set_adc_channel(AN0);//Si no va volver a poner
  56.       delay_ms(1);
  57.       valor=read_adc();//Inicia conversion y lee, hara espera automatica
  58.       delay_ms(1);
  59.       lcd_putc('\f');   //borra lcd
  60.       lcd_gotoxy(1,1);
  61.       printf(lcd_putc,"Adc es : %u",valor);//muestra dato
  62.       delay_ms(250);
  63.       }
  64. }

Buscando por el foro he encontrado un post propio de otra vez que tuve este problema y lo solucione determinando el tiempo de adquisicion del ADC, pero en este caso no funciona ni haciendo eso:

Serie18F configurando Tadq

He probado con dos pics distintos, revisado el circuito, cambiando el potenciometro...Y siempre falla. Lo curioso es que la primera lectura que hace si es correcta, pero despues sin tocar el potenciometro el dato va variando : 255,12x,6x,3x, y se queda oscuilado entre 15-18; otra cosa curiosa es que una vez ha bajado a esos niveles, usando el potenciometro siolo varia de 5-6 hasta 28-29.

No se a que se puede deber, pero por mas vuelta que le doy no lo veo. A ver si a alguien se le ocurre algo, muchas gracias
Saludos desde Córdoba, españa

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Lectura inestable del Adc en 18f2550
« Respuesta #1 en: 26 de Diciembre de 2011, 10:59:12 »
¿qué valor tiene el potenciometro? Pásalo por un seguidor de tensión para que la resistencia sea cuanto más alta mejor: sí sigue ocuriendo lo mismo te aseguras de que el problema es de software.

saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Lectura inestable del Adc en 18f2550
« Respuesta #2 en: 26 de Diciembre de 2011, 11:11:03 »
He probado con uno de 4,7k y otro de 100k, aunque estos mismos los use en su dia con el 16F876 y no tuve problemas ninguno, incluso despues de ponerse con los valores 5-30 conectandolo directamente a tierra o a 5v no da lecturas correctas Yo creo que debe de estar el problema en algun bug o algo evidente que se me pasa
Saludos desde Córdoba, españa

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Lectura inestable del Adc en 18f2550
« Respuesta #3 en: 26 de Diciembre de 2011, 13:31:52 »
Hola.

Los ADC de los PICs tienen cierto nivel de ruido en los LSB's, te recomiendo que hagas varias muestras y las promedies. Debes fijar el valor del VREF para el ADC.

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Lectura inestable del Adc en 18f2550
« Respuesta #4 en: 26 de Diciembre de 2011, 14:18:12 »
¿qué valor tiene el potenciometro? Pásalo por un seguidor de tensión para que la resistencia sea cuanto más alta mejor: sí sigue ocuriendo lo mismo te aseguras de que el problema es de software.

saludos.

Que resistencia?  :roll: La que "ve" el ADC o la que "ve" el potenciomentro? La que ve el ADC debe ser menor a un valor especificado por el datasheet y entre más baja mejor  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Lectura inestable del Adc en 18f2550
« Respuesta #5 en: 26 de Diciembre de 2011, 17:01:53 »
Lo siento: se me ha ido la cabeza :?. La resistencia de salida de un seguidor es MUY BAJA...

Disculpas.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Lectura inestable del Adc en 18f2550
« Respuesta #6 en: 26 de Diciembre de 2011, 20:31:42 »
Gracias por las respuestas, mañana volvere con ello. Antes tenia puestas las tensiones de referencia, las quite en una de las pruebas, creo que de todas formas CCS las pone por defecto si no especificas otra cosa. Y lo del valor promedio lo hare, aunque en este ejemplo y para disminuir el "ruido" en la conversion ya uso solo los 8 bits mas significativos.

Yo creo que el problema debe venir de algun bug o cosa rara que haga ccs, lo digo por cosas como la que me paso hace tiempo que puse el bit arriba. Y sino creo que puede estar en que este todo el rato funcionando, mañana hare uno que solo convierta cuando se pulse un boton. Sé que no son cosas razonables, pero recuerdo que hace tiempo cuando programaba ccs tenia sus bug puñeteros
Saludos desde Córdoba, españa

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re: Lectura inestable del Adc en 18f2550
« Respuesta #7 en: 10 de Enero de 2012, 10:57:22 »
dale mas tiempo a los delay...

Desconectado ranelcom

  • PIC10
  • *
  • Mensajes: 2
Re: Lectura inestable del Adc en 18f2550
« Respuesta #8 en: 30 de Enero de 2012, 01:26:20 »
Me parece que el problema está en esta linea:

setup_adc(ADC_CLOCK_DIV_2);//De 2 a 64

Como estas usando un cristal de 4Mhz(por tu código), eso te da un periodo de reloj de 0,25us. Debes encontrar un multiplo que te de el minimo TAD de ese micro. Estuve viendo el datasheet del 18F2550 y el minimo TAD(tabla 28-29) es 0.7us. Entonces debes buscar un multiplo que multiplicado por 0,25us te de igual o mas que el minimo TAD y no mas que el maximo TAD(25us).

Puedes usar: 4, 8, 16, 32 y 64. Te recomiendo 4 porque obviamente quieres una conversion rápida. Ojo que la conversion toma 11 TAD.

Cito el datasheet:" For correct A/D conversions, the A/D conversion clock
(TAD) must be as short as possible but greater than the
minimum TAD (see parameter 130 in Table 28-29 for
more information)."

Asi que cambia la linea en cuestion a:
setup_adc(ADC_CLOCK_DIV_4);//De 2 a 64


 

anything