Autor Tema: Problemas en lecturas analógicas  (Leído 7417 veces)

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

Desconectado rr4v

  • PIC10
  • *
  • Mensajes: 15
Problemas en lecturas analógicas
« 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);
            }


Desconectado Vayadespiste

  • PIC12
  • **
  • Mensajes: 53
Re: Problemas en lecturas analógicas
« Respuesta #1 en: 06 de Mayo de 2008, 18:01:05 »
Hola.  ¿y dices que está configurado para leer a 16 bits?.


Un saludo.

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Problemas en lecturas analógicas
« Respuesta #2 en: 06 de Mayo de 2008, 18:22:50 »
Puedes poner el resto del código???


Desconectado rr4v

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas en lecturas analógicas
« Respuesta #3 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


Desconectado rr4v

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas en lecturas analógicas
« Respuesta #4 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

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Problemas en lecturas analógicas
« Respuesta #5 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)

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Problemas en lecturas analógicas
« Respuesta #6 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
 
« Última modificación: 08 de Mayo de 2008, 09:57:46 por NANO1985 »
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas en lecturas analógicas
« Respuesta #7 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.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Problemas en lecturas analógicas
« Respuesta #8 en: 08 de Mayo de 2008, 14:42:49 »
lamentablemente es asi Gonzalo_BlackHawk, no nos queda otra. gracias por tu respuesta.
saludos.
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas en lecturas analógicas
« Respuesta #9 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:
« Última modificación: 09 de Mayo de 2008, 01:37:19 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Problemas en lecturas analógicas
« Respuesta #10 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)
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas en lecturas analógicas
« Respuesta #11 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:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas en lecturas analógicas
« Respuesta #12 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.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas en lecturas analógicas
« Respuesta #13 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:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado rr4v

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas en lecturas analógicas
« Respuesta #14 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?