TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: rr4v en 06 de Mayo de 2008, 17:53:17

Título: Problemas en lecturas analógicas
Publicado por: rr4v en 06 de Mayo de 2008, 17:53:17
Hola amigos,

hace unos días escribí acerca de este tema. Por desgracia no he tenido oportunidad de seguir experimentando hasta ahora, y aquí relato mi problema, algo más detallado.

He hecho hoy pruebas de lecturas por el canal analógico AN0 de un PIC 18F4525. Para facilitar el seguimiento del problema le he aplicado a la entrada del canal AN0 una tensión constante de unos 1.35 V. El resto de canales los dejo "al aire", sin conectar. El PIC estaba configurado para leer a 16 bits. No utilizo Vref+- así que, para convertir el valor leido por el ADC, lo multiplico por 5/65536. El resultado es, sin embargo, que leo 1.31 V en el microcontrolador y no sé a que se debe este error de medida. Además en los canales 1 y 2 leo tensiones de casi 1.2V y 1V respectivamente. Si conecto a tierra el resto de canales analógicos menos el AN0 la cosa empeora porque por el canal AN0 leo apenas 1V. Todo esto me llevó a pensar que, como se ha comentado en otros hilos podría ser un problema de no esperar el tiempo suficiente para la lectura del canal así que hice pruebas variando el tiempo de espera. Para ello puse un retardo justo antes del read_adc() y otro unas lineas despues. Hice pruebas variando este retardo entre 5us y 250us sin que variara en ningun caso el resultado de la lectura, así que no me explico el problema ni se me ocurre como resolverlo.

¿Se os ocurre alguna pista que pueda ayudarme?

Os adjunto la parte del codigo donde leo el valor que luego envio por puerto serie para leer en un ordenador. (Esta parte del codigo está incluida a su vez en un bucle)

Código: [Seleccionar]
set_adc_channel( j2 );
            for(k2=1; k2<=(TScan); ++k2)
            {
            delay_us(5);
            }
            value = Read_ADC();
            valfl= (float) value;
            valfl *=5.0/65536.0;
            VMed[j2] = (VMed[j2]*(i3-1) + valfl)/(i3);
            for(k2=1; k2<=(TScan); ++k2)
            {
            delay_us(5);
            }
            if (transmitir_sesion)
            {
            printf("%s0> Temp,Arbol:%u,Ch:%X,Ct:%lu,value:%lu,valfl:%f@",UMX,NArbol,make8(j2,0),CONTADOR,value,valfl);
            }

Título: Re: Problemas en lecturas analógicas
Publicado por: Vayadespiste en 06 de Mayo de 2008, 18:01:05
Hola.  ¿y dices que está configurado para leer a 16 bits?.


Un saludo.
Título: Re: Problemas en lecturas analógicas
Publicado por: Slalen en 06 de Mayo de 2008, 18:22:50
Puedes poner el resto del código???

Título: Re: Problemas en lecturas analógicas
Publicado por: rr4v en 06 de Mayo de 2008, 19:31:09
Te pongo algo más de codigo, no lo pongo todo porque es bastante largo y enrevesado, pero si me concretas que parte te interesa te lo pongo.

Código: [Seleccionar]
   #include <18F4525.h>
   #device ADC=16
   #fuses HS,NOWDT,NOPROTECT,NOLVP
   #use delay(clock=20000000)
   #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, errors, disable_ints)

....
//ME SALTO UNA PARTE IRRELEVANTE DE CODIGO
....

  WHILE (CONTADOR < TSesion)
   {
      for(i3=1; i3<=PuntosMedia; ++i3)
      { // ciclo para calcular la media de muestras

       for(j2=0; j2<NumCanales; j2++) // ciclo para recorrer los canales analog.
       {
            set_adc_channel( j2 );
            for(k2=1; k2<=(TScan); ++k2)
            {
            delay_ms(5);
            }
            value = Read_ADC();
            for(k2=1; k2<=(TScan); ++k2)
            {
            delay_ms(5);
            }

            valfl= (float) value;
            valfl *=5.0/65536.0;
            VMed[j2] = (VMed[j2]*(i3-1) + valfl)/(i3);
            if (transmitir_sesion)
            {
            printf("%s0> Temp,Arbol:%u,Ch:%X,Ct:%lu,valfl:%f@",UMX,NArbol,make8(j2,0),CONTADOR,valfl);
            }
       } //recorrido por canales
      } //Media de muestras
      //-----------------------------
         for(j2=0; j2<NumCanales; j2++)
         {
          if ((metodo) && (VMed[j2]>VMax[j2])) //Calcula Vmax
            {
             VMax[j2] = VMed[j2];
             TMax[j2] = CONTADOR;
            }
 
        else if (!(metodo) && (VMed[j2]<(Vini[j2])+Vmin) && (Tz[j2]<=1)&& (CONTADOR>=770))
            {
             Tz[j2] = CONTADOR;
             detectado_cero=true;
             valfl2= (float)(Tz[j2]);
             valfl2 *=(26.0/1000.0);
             if (transmitir_sesion)
            {
             printf("%s0> Tz!,VMed[j2]:%f,Vini[j2]:%f,Vmin:%f,Arbol:%u",UMX,VMed[j2],Vini[j2],Vmin,NArbol);
             printf("Ch:%X,Ct:%lu,valfl:%f,Tz:%f@",make8(j2,0),CONTADOR,valfl,valfl2);
            }
            }
         }
      //-----------------------------

   }//END WHILE

Título: Re: Problemas en lecturas analógicas
Publicado por: rr4v en 07 de Mayo de 2008, 05:29:15
Como detalle añadido, les indico los resultados de mis pruebas.

He impuesto una tensión constante de 1.338V durante varios segundos en el pin AN0 y el micro me leía 1.289V. Luego cambiaba la tensión de entrada gracias a un potenciómetro a 1.113V y el micro me leía 1.069V, y asi he ido bajando sucesivamente la tensión de entrada y comprobando la lectura del micro con los siguientes resultados:

Micro      Voltimetro
-------     ------------
0.053      0.104
0.219      0.263
0.376      0.425
0.851      0.892
1.069      1.113
1.289      1.338

He comprobado que la relación entre el valor "real" y el medido guarda una relación lineal con r2=0.999 del tipo:

Vvoltimetro=0.9981*Vmicro+0.0476

¿Sabeis a que puede deberse esta discrepancia? La verdad es que me tiene loco esto! jejeje
Título: Re: Problemas en lecturas analógicas
Publicado por: Slalen en 07 de Mayo de 2008, 15:10:58
Como detalle añadido, les indico los resultados de mis pruebas.

He impuesto una tensión constante de 1.338V durante varios segundos en el pin AN0 y el micro me leía 1.289V. Luego cambiaba la tensión de entrada gracias a un potenciómetro a 1.113V y el micro me leía 1.069V, y asi he ido bajando sucesivamente la tensión de entrada y comprobando la lectura del micro con los siguientes resultados:

Micro      Voltimetro
-------     ------------
0.053      0.104
0.219      0.263
0.376      0.425
0.851      0.892
1.069      1.113
1.289      1.338

He comprobado que la relación entre el valor "real" y el medido guarda una relación lineal con r2=0.999 del tipo:

Vvoltimetro=0.9981*Vmicro+0.0476

¿Sabeis a que puede deberse esta discrepancia? La verdad es que me tiene loco esto! jejeje

Por lo que dices, el pic está haciendo bien la conversión.

Ese error se debe al error en la medida del voltímetro y al del pic.

Estás midiendo tensiones muy bajas, en cuanto tengas algo de error lo vas a notar mucho.

Mira en el manual de tu voltímetro el valor del error en la medida de la escala que utilices y calcula si la medida del pic está en esos valores aproximadamente (ya que tendrías que sumar el error de lectura del pic)
Título: Re: Problemas en lecturas analógicas
Publicado por: NANO1985 en 08 de Mayo de 2008, 09:54:14
HOLA! rr4v! antes que nada bienvenido el foro!  8), veo que por fin secumple mi teoría, "las entradas analógicas del pic son alinealineales", te cuento que yo tambien estuve por varios meses con éste problema, y aun sigo sin resoverlo, tambien realicé un estudio de linealidad de los canales analógicos y obtuve una ecuacion de respuesta de la siguinte forma:
Tensión Medida=(0.9974*Tension micro)+0.0481
fueron interminables dolores de cabeza, porque el equipo que había armado era un Datalogger de corriente de 5 canales, que en su entrada tenia un complejo grupo de operacionales que convertian señales de corrientes 4-20mA en tension 0-5v (es decir que adaptaban la señal y trasformaban la magnitud corriente - tension para ser introducida al cada una de las entradas analógicas el pic), entonces al analizar por completo el sistema, me daba cuenta que existía un gran problema de linealidad y empecé por desconfiar de la deriva térmica de los operacionales antes que del pic,.... y bue  :shock: .... me llevé un sorpresa el error o desvío total era superior en el pic.... y no en los operacionales...
nunca supe que hacer....
fijate.... date una vueltapor acá ...
http://www.todopic.com.ar/foros/index.php?topic=20505.0
 
Título: Re: Problemas en lecturas analógicas
Publicado por: Gonzalo_BlackHawk en 08 de Mayo de 2008, 14:20:50
Hola a todos, NANO y rr4v, me ha sorprendido la similitud que han obtenido en sus ecuaciones de nolinealidad, deben haber hecho un gran trabajo con eso. NANO, tu teoria de "las entradas analogicas del pic son alineales" ya es ley hace rato en los manuales de microchip, y en realidad cualquier ADC discreto o embebido tiene una nolinealidad por más caro que sea. En los datasheet vienen especificadas las características de nolinearidad como nolinearidad diferencial o DNL (Differential Non-Linearity) y nolinearidad integral o INL (Integral Non-Linearity) y se expresan en LSb.

Cuando obtuviste esa ecuación en realidad lo que hiciste fue calcular la función de transferencia del ADC en base al error de offset del mismo (los 0.0481 que colocaste, si te fijas en el datasheet de los PIC el rango de este valor está especificado como Offset Error) y el error de plena escala o el tambíen llamado error de ganancia (el 0.9974 que colocaste en la ecuación, en los datasheet esta especificada en su forma inversa como Gain Error).

Lamentablemente  :( aqui no queda otra solución que encontrar la funcíon de transferencia real del ADC, tal como ustedes han hecho y aplicarla a las lecturas para corregirlas, tal como lo explica microchip en alguno de sus manuales, no recuerdo cual en este momento. Espero haberles sido de ayuda, un saludo.
Título: Re: Problemas en lecturas analógicas
Publicado por: NANO1985 en 08 de Mayo de 2008, 14:42:49
lamentablemente es asi Gonzalo_BlackHawk, no nos queda otra. gracias por tu respuesta.
saludos.
Título: Re: Problemas en lecturas analógicas
Publicado por: firepic en 09 de Mayo de 2008, 01:15:35
Saludos amigos!

Interesante el planteamiento... yo pensaba que el error podía deberse a que generalmente uno toma Vdd=5 para hacer el ajuste de lo que ha medido el pic (valor a 16bits) al valor de tensión real, pero en realidad casi nunca Vdd=5 voltios exactos, pero ahora se me ha aclarado la cosa.
Sin embargo, me llama la atención la frase que usan: "no linealidad".
Me explico, si la ecuación es tal como menciona nano, Tension medida=0.9974*Tension micro + 0.0481, esa ecuación sigue siendo de la forma y=mx+b. Si graficamos eso... no sigue siendo una línea recta? Claro que ahora hay un error de offset (b) y de multiplicación (la pendiente m, que aún así es bastante cercano a 1).
Así que tengo duda sobre la aplicación del término "no linealidad"... me imagino que eso sería si la ecuación diera una potencia, una exponencial o algo así...
Bueno tal vez me estoy yendo muy al pie de la letra... pero es que soy aficionado a la matemática también!  :D

Ok nos leemos!  :mrgreen:
Título: Re: Problemas en lecturas analógicas
Publicado por: NANO1985 en 09 de Mayo de 2008, 11:16:23
hola firepic!!no te fuiste muy al pie de la letra,... el término "no linealidad" lo usamos porque:
para una señal de entrada analógica Vi que ingresa al conversor, no obtenemos un valor de salida (vo) exacto correspondiente en su equivalente binario del conversor del pic, es decir que el sistema posee un error de conversion que se observa al no obtener valores correspondidos a lo largo de toda la variacion de valores de la entrada Vi.
la expresion que obtuvimos Tensión Medida=(0.9974*Tension micro)+0.0481, como vos bien dices, es lineal, pero ésta representa una funcion de correción para lograr que los valores finales "tiendan" a ser lineales.
Espero haber saldado tududa y si dije algo medio errado por favor corrijanme.
muchas gracias saludos.
 8)
Título: Re: Problemas en lecturas analógicas
Publicado por: firepic en 09 de Mayo de 2008, 11:49:21
Saludos Nano!  :-)
Gracias por tu tiempo y tu respuesta.
Aunque ahora se me ha enredado un poco más el papagayo...
Déjame ver si lo desenredo...

la expresion que obtuvimos Tensión Medida=(0.9974*Tension micro)+0.0481, como vos bien dices, es lineal, pero ésta representa una funcion de correción para lograr que los valores finales "tiendan" a ser lineales.

O sea que la expresión ya es lineal (matemáticamente hablando).

Ahora bien, como defines antes linealidad:

el término "no linealidad" lo usamos porque:
para una señal de entrada analógica Vi que ingresa al conversor, no obtenemos un valor de salida (vo) exacto correspondiente en su equivalente binario del conversor del pic.

Entonces claro, la cosa ya cambia... o sea que para lo que ustedes mencionan, en el ámbito de las CAD, "no linealidad " sería cuando la ecuación es diferente de y=x, la función identidad?
Es decir, mientras no sea y=x, no es lineal ("picmente" hablando)?

Creo que eso es lo que das a entender, si no es así corrígeme por favor.
Ok gracias de nuevo...
No más pues, nos leemos!  :mrgreen:
Título: Re: Problemas en lecturas analógicas
Publicado por: Gonzalo_BlackHawk en 09 de Mayo de 2008, 14:06:10
Firepic, yo he empezado con esta confuncion cuando postee mi mensaje, en él trate dos temas diferentes, la nolinealidad y la función de respuesta del ADC. Aunque los he tocado a ambos en un mismo mensaje, en el primer parrafo he hablado sobre un tema y en el segundo parrafo sobre otro, los cuales no quise relacionar pero ahora que leo el mensaje de nuevo veo que no especifique el cambio de asunto. Sorry, my bad!!  :D :D :D

Los ADC convierten el rango de tensiones en pequeños escalones según la resolución del mismo, por lo tanto en realidad la curva de respuesta de un ADC es una escalera y no una recta. De todas formas promediando esos pequeños escalones se obtiene una recta con pendiente unidad, es decir que por cada milivolt de entrada, el ADC tendria que indicar el mismo incremento de tensión. Ahora bien, como cualquier discretizacion de un sistema analógico supone errores, esa recta ideal sufrirá modificaciones.

Aunque hay muchos tipos de errores en los ADC, los que quiero recalcar aca son, primero, el error de offser y el error de fondo de escala que son los que, aunque mantienen una relacion lineal de respuesta en el ADC, modifican la pendiente y la ordenada al origen de esta recta haciendo que la medicion varíe en forma absoluta. Esos son los errores que NANO y rr4v han corregido con sus ecuaciones. Ahora vamos con el segundo tipo de error que quiero resaltar.

Sin embargo, en la realidad, los ADC tampoco son lineales en forma perfecta (jeje, para que tanta explicación sobre una recta si al final no son lineales preguntarán). Cada escalón de la conversión no se siempre se produce para un mismo incremento de tensión y eso da lugar a errores que deforman la recta en forma aleatoria y dan lugar a que la curva de respuesta del ADC ya no pueda representarse con una función finita. Estos son los errores que estan especificados por el fabricante como DNL y INL. Sin embargo, nada podemos hacer sobre estos errores porque son aleatorios y varían con cada lectura, es una condición intrínseca del convertidor y no hay forma de predecir su comportamiento. Sin embargo como esta nolinealidad es muy pequeña (generalmente del orden de +-1 o 2 LSb) lo unico que nos queda es asumir la nolinealidad y seguir considerando la función de transferencia del ADC como una recta, si afectadas por otros errores absolutos como el error de ganancia, el de offser, etc, etc

Asi que la conclusión es que los ADC no son lineales matematicamente hablando, pero su función de transferencia se puede aproximar a una recta de pendiente positiva y cercana a la unidad y con un error relativo despreciable en la mayoria de los casos. Les recomiendo que lean el la Aplicattion Note numero 546 "Using the analog to digital converter" de Microchip, explica todos los tipos de error del ADC en forma muy entendible y con figuras, además de tratar otros temas interesantes como la definición de la tensión de referencia.

Nos estamos escribiendo. Gonza.
Título: Re: Problemas en lecturas analógicas
Publicado por: firepic en 09 de Mayo de 2008, 15:23:52
Saludos Gonzalo!
Ya estaba esperando tu respuesta, me había extrañado la tardanza  :D
Tus explicaciones siempre terminan por aclararlo todo, excelente!  :)
Si, lo de la curva en escalera lo había leído por alguna parte... ahora sí entiendo lo que mencionabas de la no linealidad, por lo que muy bien explicas, como siempre...
Ok Dr. Gonzalo, nos leemos!  :mrgreen:
Título: Re: Problemas en lecturas analógicas
Publicado por: rr4v en 11 de Mayo de 2008, 17:58:36
Guau!
Vuelvo de viaje y me encuentro con tantas y tan acertadas respuestas!
Gracias a todos, una y otra vez abris claros de sol en mi nuboso entendimiento de este mundo, jeje.

Ahora estoy un poco más cerca de mi solución. Aun así, despues de corregir la deriva del micro con mi ecuación lineal empírica, encuentro mucho ruido en la medida de mi señal. Me imagino que este es un problema diferente, pues se trata de un ruido aleatorio y no una deriva constante.
Tengo la impresión de que este ruido no proviene de la señal, sino de la lectura por parte del PIC, aunque no tengo forma clara de asegurarme por falta de equipamiento. No dispongo de un multimetro que registre los valores en el tiempo para comparar el ruido que lee el multimetro con el que lee el pic. No obstante, como digo, tengo sospechas de que en el pin de entrada del PIC la señal no es tan ruidosa como la leida por este. ¿Sabeis como puedo chequear mi placa para comprobar que no me estoy equivocando en algo? ¿Cual es el ruido que puede tener el pic 18f4525? Si quisiera cambiar las tensiones de referencia para el ADC, ¿que diferencias máximas podría haber entre Vref+ y Vref-? Alimento el pic con 5V por lo que me da la impresion leyendo el datasheet que Vref+ - Vref- >3V ¿es esto posible? Me parece un valor muy grande porque me interesa medir tensiones < 0.4 V. Quizás el problema es que tenga que amplificar mi señal leida, ¿que opinais?
Título: Re: Problemas en lecturas analógicas
Publicado por: Slalen en 11 de Mayo de 2008, 18:08:12
Lo primero, el ruido: Para saber de donde viene un osciloscopio. Mides la señal que le llega y si la ves limpia es del pic

Lo de medir señales de tan baja tensión... Tendrás muchos errores por el ruido. Lo mejor es que amplifiques la señal y la filtres para quitar ruidos.

No se si habrá algún cad integrado que te permita transformar señales tan bajas.
Título: Re: Problemas en lecturas analógicas
Publicado por: firepic en 12 de Mayo de 2008, 11:23:28
Saludos!  :-)
Coincido totalmente con Slalen, lo mejor es que amplifiques la señal antes de leerla por el pic... porque si mides esa señal tan pequeña con el pic, vas a tener una exactitud algo baja en tu medición...
Ok nos leemos!   :mrgreen:
Título: Re: Problemas en lecturas analógicas
Publicado por: rr4v en 12 de Mayo de 2008, 17:05:02
Ok, en cuanto tenga oportunidad probaré a amplificar la señal aun más, de hecho ya la estoy amplificando (viene de un termopar tipo T). Pero quizás me he quedado algo corto y pueda amplificarla x10.

Tambien me queda comprobar los tiempos de muestreo necesarios para que las señales que entran por un canal no afecten a los canales adyacentes.

Os tendré al corriente de mis ensayos.

Gracias por los consejos.