Ruido en ADC

Hola a todos los foristas, mi duda es con respecto a la conversion adc el micro, como se puede reducir el ruido para que el acople sea minimo, lo que estoy haciendo es convertir una señal que viene de un circuito integrado, esta señal es practicamente DC, pero cuando en la funcion principal llamo directamente a leer este valor y mostrarlo por el puerto serial, este varia mucho en dos o tres valores, es decir: Si la entrada analogica es de 2.5V la lectura del adc es de promedio de 512 pasos, (10 bits de resolucion), pero este cambia rapidamente entre 500 y 550, a pesar de que el valor de entrada no cambia (ya lo probe con un osciloscopio), la conversion fluctua demasiado entre valores cercanos, a pesar de que lo hago lo mas corto posible al micro, la configuracion es la siguiente

#include <18F4550.h>
#device adc=10

setup_adc_ports(AN0_TO_AN7|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_64 || 0x38 || 0x80);


Y en la llamada main

set_adc_channel(0);
delay_us(5);
lecturaC0=read_adc();
printf(cad2, "%d",lecturaC0);


lecturaC0 es 16 bits

gracias de antemano
 
Formas de mejorar la conversión:

- Del lado del hard:

1) Buen PCB, tratar de que la masa analógica y la digital estén separadas y solamente conectadas en un único punto. En caso de PCB de doble capas, evitar pistas paralelas de distintas señales/voltajes entre capas.

2) Usar los capacitores y los filtros que recomienda el fabricante del uP para su alimentación.

3) Dimensionar correctamente el filtro a la entrada del ADC.

4) Tener una tensión de referencia lo mejor posible, ej. un 7805 es una pésima referencia.

5) Tratar de que la señal tenga el menor recorrido posible (cables cortos).

- Del lado del soft:

1) Trabajar a la menor velocidad de clk posible en uC.

2) Trabajar a la menor velocidad de conversión posible (bajar el clk del ADC, mayor pre-escaler).

3) Si es posible, en algunos uC durante la conversión del ADC se puede entrar en modo de bajo consumo (un pseudo sleep) para eliminar el ruido adyacente que pueda meterse durante la conversión.

4) Tomar varias muestras y hacer un promedio móvil.
 
Hola cosmefulanito04, gracias por responder, bueno tome algunas consideraciones que mencionas, cual podria ser una buena referencia de 5v?, si lo estuve haciendo con 7805. Utilizo capacitores de 100nF en las dos entradas de alimentacion y filtros electroliticos de 47u.

A que te refieres cuando mencionas el filtro de entrada?
 
Utilizo capacitores de 100nF en las dos entradas de alimentacion y filtros electroliticos de 47u.

Bien.

¿Qué PIC estás usando?, ¿colocaste los capacitores cerca de la alimentación analógica?

cual podria ser una buena referencia de 5v?, si lo estuve haciendo con 7805.

El problema del 7805 es que si te fijás en su hoja de datos, te dice que su tensión de salida puede variar +/-250mV (5% sobre 5V), es evidente que mientras menos cargado esté, más cerca de los 5V deseado vas a estar.

¿En que te cambiaría tener una mejor tensión de referencia?

En que obtenés una medición con menor incertidumbre (si querés llamalo error).

¿Siempre necesito tener una buena tensión de referencia?

No necesariamente, dependerá de tu aplicación y eso lo tenés que evaluar bien en c/proyecto en particular.

Tensiones de referencias que podés conseguir (solo para conectar en la referencia del PIC, no para alimentar un circuito):

- LM336Z5.0, es un poco mejor que el 7805, no mucho => 200mV de variación (4% de 5V).
- LM317, usandolo como referencia de 1,25V => 50mV de variación (4% de 1,25V)
- REF02, solo 25mV de variación (0,5 % de 5v).
- AD586k, este lo usé en un proyecto y posee solo 5mV de variación () y no es tan caro para las mejoras que ofrece (0,1 % de 5v).

Pero volviendo a tu problema en particular, cambiando el 7805 por otra referencia no vas a solucionar el problema de ruidos.

De momento, te recomiendo que soluciones el problema de ruido y después evalúes si vale la pena o no cambiar el 7805 como tensión de referencia (no como regulador de alimentación).

A que te refieres cuando mencionas el filtro de entrada?

Tu señal antes de entrar al ADC puede venir con mucho ruido una forma práctica de eliminar ruido es eliminando el ancho de banda excedente que no vas a utilizar, por ej.:

- Si tu señal es continua, usas un bruto pasa bajos que tenga una frecuencia de corte muy baja.
- Si tu señal es alterna con una fmax, la frecuencia de corte de tu filtro pasa bajo deberá estar lo más cerca posible de fmax, con un cierto márgen.

Al eliminar el ancho de banda excedente, acotás el ruido que te pueda entrar a la entrada del ADC.

Lo más simple:

image6.JPG


Recapitulando un poco, probá esto:

1- Promediar la conversión => solo requiere agregar un par de lineas de código (esto es un filtro pasa bajos hecho por soft).

2- Si seguís teniendo mucha variación, agregá el filtro analógico más simple.

Si después de 1 y 2 seguís teniendo mucho ruido, con un osciloscopio medí la alimentación del PIC y comprobá que tenga poco ripple.
 
Perdon por la tardanza pero estaba un poco ocupado por otras actividades. La tension de referencia en este momento utilize un 7805 para hacer pruebas solamente, la que de verdad se colocara en aplicacion son baterias y con divisores resistivos, ahora, existe posibilidad de que exista ruido en las baterias?, gracias por el dato de los otros integrados ire a buscar si hay por donde vivo. Recien instalare el filtro pasabajos y colocare capacitores en la circuiteria analogica, te aviso los resultados en cuando lo pruebe, gracias cosmefulanito
 
...la que de verdad se colocara en aplicacion son baterias y con divisores resistivos, ahora, existe posibilidad de que exista ruido en las baterias?

Una batería tiene la ventaja de ser una fuente que no introduce ruido, no tiene ripple.

Pero tené en cuenta algo, la bateria a medida que se descarga, su tensión decae y por lo tanto tu tensión de referencia en el ADC va a sufrir ese inconveniente.

...Recien instalare el filtro pasabajos y colocare capacitores en la circuiteria analogica, te aviso los resultados en cuando lo pruebe, gracias cosmefulanito

Probá y cualquier cosa avisá.
 
Buenas!!, primero mil disculpas por no presentar los resultados, estuve fuera de esta actividad mucho tiempo por trabajo, pero ya de nuevo!!!, mira cosme hice lo que me recomendaste, el filtro pasabajos, lo calcule para una frecuencia de 0.5Hz, la mejoria de la conversion es evidente!!, existe todavia la variacion, pero ya es considerablemente pequeñacon lo que tenia antes, probare el filtro a frecuencias mas bajas. El circuito esta en una placa, pero vi que el camino que recorre el pin analogico es un poco larga y delgada, tu crees que exista mucha perdida en ese camino?, y Cosme gracias por la recomendacion!!!
 
...probare el filtro a frecuencias mas bajas.

Tené en cuenta que mientras mayor sea el filtro, más lenta será la variación que presente tu filtro.

O sea, en base al filtro que pusiste, el tao dá 2 segundos, entonces suponé que medías 1v y de pronto pasa a 4v, la variación la vas a ver bien después de 10 segundos (5*tao), más filtro... más lenta la medición.

El circuito esta en una placa, pero vi que el camino que recorre el pin analogico es un poco larga y delgada, tu crees que exista mucha perdida en ese camino?, y Cosme gracias por la recomendacion!!!

Los problemas que presenta una pista delgada son:

- Menos corriente pueden suministrar (no es tú problema).

- Mayor inductancia parásita, ya que una pista gruesa representa más inductancias parásitas en paralelo (inductancias en paralelo => se comportan como resistencias en paralelo).

Lo que te queda para mejorar la medición es por el lado del soft, bajar la frecuencias de clock a lo mínimo indispensable y tratar de usar un bajo consumo durante la conversión.
 
Última edición:
hola cosme, mira hice las modificaciones en el filtro, y la mejor respuesta la tuve en 1Hz, y el tiempo que tarda en la variación que mencionas, para mi aplicación, es suficiente. Por el lado lo del software le baje el tiempo de conversión al máximo y todavía mejoro mucho mas, ya es mas estable, pero tengo una duda en este lado, como mencionaba al inicio estoy con el CCS, entonces la primera vez que utilice el adc yo coloque la instrucción "ADC_CLOCK_DIV_64" que es igual a 0x06 según su librería para el pic18f4550, y al jugar con los valores segun el datasheet al colocar ADC_CLOCK_DIV_2, el adc se vuelve "loco" por decir asi, ya que con esta instruccion a 4.5V mas o menos de entrada el valor digital siempre salia 500, y subiendo a 5v (maximo), el adc daba 0, porque podria ser?. Muchas Gracias
 
... la primera vez que utilice el adc yo coloque la instrucción "ADC_CLOCK_DIV_64" que es igual a 0x06 según su librería para el pic18f4550, y al jugar con los valores segun el datasheet al colocar ADC_CLOCK_DIV_2, el adc se vuelve "loco" por decir asi, ya que con esta instruccion a 4.5V mas o menos de entrada el valor digital siempre salia 500, y subiendo a 5v (maximo), el adc daba 0, porque podria ser?. Muchas Gracias

Es muy probable que te haya quedado la frecuencia del ADC por arriba de lo que es capaz de convertir, para darte una idea en ciertos ARM's la frecuencia máxima de conversión no debería superar los 13,5MHz, entonces como vos le dabas un pre-escaler muy chico, tal vez la frecuencia de tu cristal era excesivo para el ADC, ese tipo de cosas las tenés que ver bien en la hoja de datos del uC.
 
Disculpas por el tiempo que paso, pero ahora retome de nuevo el proyecto, y si era lo que tu dijiste cosme, hay que tomar en cuenta todas esas recomendaciones y no hacerla a lo "loco", pero bueno ahora estoy muy conforme con el resultado que tuve con las pruebas, hice el filtro en hardware y software que me recomendaste, por la parte del hardware me fue suficiente con el filtro pasabajos RC de 1er orden, y para la parte del software lo hice con promedios de varias medidas, en mi caso 25 muestras. Hasta ahora todo bien, y muchísimas gracias por la ayuda que me brindaste, ya te estaré contando como va todo y tal vez te vuelva a molestar con otras dudas, jeje
 
Atrás
Arriba