Autor Tema: Deriva en conversor ADC mcp3204  (Leído 2548 veces)

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

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Deriva en conversor ADC mcp3204
« en: 14 de Octubre de 2008, 05:49:07 »
¡¡Hola a tod@s!!

Os planteo una pequeño problema que me surge desde hace unos dias. Estoy trabajando con un conversor AD MCP3204. Le tengo conectado en Vref una referencia de tension de error de unos 10 uV (micro voltios). Todo funciona con tensiones de 5V. He hecho una pequeña rutina en la que hago una conversion y la muestro por un display, utilizo la libreria mcp3204.c, el codigo os lo adjunto abajo:

Código: [Seleccionar]

long int lectura = 0;

while(1){

   adc_init();

   lectura = read_analog(0);

   printf(lcd_putc,"\fLectura: %lu",lectura);

   output_toggle(LED_VERDE);

   delay_ms(250);

}


En el canal 0 simplemente he conectado un potenciometro de 10K Ohm, en el que sus terminales de los extremos estan entre alimentacion y masa, y el terminal de enmedio lo llevo a la entrada del canal 0. La tension de alimentacion, que es de 5V, la he medido con diversor polimetros y osciloscopios, y solo tiene variaciones de unos 2mV y suelen ser lentas.

El caso es que en el display nunca veo un valor de la conversion estable, sino que en cada conversion el valor cambia sin haber variado la tension a la entrada. Entiendo que surja alguna pequeña deriba, pero eske veo que la deriba que tengo actualmente es de 25 valores.

Si el conversor es de 12 bits = 4096 valores, y tengo 5V entre 4096 valores, en teoria tengo una resolucion de 1,2 mV. Si tengo una deriva de 25 cuentas, tendré un error de 25 + 1,2mV = 30mV. Necesito que mi sistema tenga una precision aproximada de 5mV.

¿Sabeis que puede estar ocurriendo?
__El conocimiento humano pertenece al mundo__

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Deriva en conversor ADC mcp3204
« Respuesta #1 en: 23 de Octubre de 2008, 18:27:52 »
La bibliteca de funciones del MCP3204 de CCS (deduzco que es el compilador que usas), tiene algunos defectos basicos.

Un defecto es el uso de Delay_cycles().

Cualquier pausa que hagas con esta instruccion, irremediablemente sufre el efecto del cambio de un cristal, ya que usa un NOP para establecer una pausa.
Esa pausa es variable al cambiar el cristal.

Hay tiempos minimos a respetar en la comunicacion con el MCP (ver hoja de datos), que no se pueden cambiar demasiado, ya que afectan el resultado.

Mi solucion al respecto fue usar Delay_us() en reemplazo de las originales Delay_cycles().
Luego ajustar bien las pausas y listo!!
Ahora me funciona con cristales de 4 MHZ (para el cual fue hecha la rutina) de 10, 20 MHZ y tambien ahora con 40 MHZ !!

El otro problema puede ser de hardware, es posible que no hayas hecho planos de masa, no hayas filtrado como corresponde, hayas mezclado las lineas de comunicacion digital con los trazos de las entradas analogas, y muchas otras cosas posibles.
En la pagina de Microchip hay notas de aplicacion que hablan de como hacer un buen diseño para evitar estos problemas, que son utiles para cualquier conversor, no solo el de ellos...

Igual nunca pude obtener mejor que +/-2 lsb, pero aunque apenas lo cumple, por lo que veo te servira para tus fines.

Suerte!!  :lol: :lol:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything