TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: QIQE en 12 de Julio de 2006, 13:14:42

Título: ADC con mucho error
Publicado por: QIQE en 12 de Julio de 2006, 13:14:42
Hola llevo unos dias dandole vueltas a un proyecto, dejo el codigo mas abajo, esta reducido a simplemente una entrada analogica, el problema es que la lectura varia entre 1 y 2 grados en cada conversión, sin que realmente halla cambiado la temperatura del sensor, esto puede ser debido al error del conversor??, tengo algun error en mi codigo??, si hago la media, me dará un valor fiable??



Código: [Seleccionar]

#include <16F877A.h>
#device adc=10

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                    //Crystal osc <= 4mhz
#FUSES NOPUT                  //No Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES BROWNOUT              //Reset when brownout detected
#FUSES NOLVP                    //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                  //No EE protection
#FUSES NOWRT                  //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)

#include <LCD.C> // Se incluye la libreria con definiciones de la LCD
#include <ctype.h>
#include <string.h>
#include <stdlib.h>


int16 hola;

float TEM;

void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_internal);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(VREF_LOW|0);

   lcd_init(); //Inicializa la pantalla LCD
   set_adc_channel(0);
   While (1)  //Bucle infinito

       {
        hola=(read_adc());
        TEM=(((hola*5.0)/1024.0)*100.0);//(((hola*0.48828125)));
        lcd_gotoxy (1,2); //Pone el cursor en una posicion determinada columna=x fila=y
        Printf(lcd_putc,"DATO: %3.1f       ",TEM);  //Escribe la cadena de caracteres de interes
        delay_ms (1000);
        }


}


Título: Re: ADC con mucho error
Publicado por: Arbolito en 12 de Julio de 2006, 13:25:47
Hola gige
Mira aca el amigo Danone desarrollo un termometro de 4 canales alli esta como utilizar el conversor y mas.
si tenes alguna duda pregunta por este post que por aca andamos
un saludo
http://www.todopic.com.ar/foros/index.php?topic=12258.120
Título: Re: ADC con mucho error
Publicado por: Nocturno en 03 de Agosto de 2006, 09:01:46
Tendríamos que ver cómo tienes conectado tu circuito. ¿Has puesto un condensador pequeño entre el ADC y masa?, creo que podrías eliminar ruidos poniendo uno de 100nF, por ejemplo.
Título: Re: ADC con mucho error
Publicado por: wqtrp en 03 de Agosto de 2006, 09:49:42
hola,
  te diria q al imprimir el valor TEM tambien imprimas a variable 'hola'
  veras q seguro la variable hola varia al menos en 1 y eso hace q tu 'bella' cuenta de TEM haga cualquier cosa...
  luego de eso revisa la cuenta y reformulala tratando de no usar float ni conversiones, en lo posible todo int32

Suerte y contanos como va...
Título: Re: ADC con mucho error
Publicado por: pelusac en 03 de Agosto de 2006, 15:24:42
A mi me pasó igual con el LM35, aquello no dejaba de oscilar incluso con condensador (aunque realmente mejoró mucho).
Así que me decanté por realizar un promedio de lecturas, para ser mas exacto unas 100 lecturas.
Hasta ahora todo de maravilla, no se si es una solución un poquito cutre ,pero vamos funciona, y en mi caso no era necesaria una gran precisión.

Saludos.
Título: Re: ADC con mucho error
Publicado por: maunix en 03 de Agosto de 2006, 15:49:45
A mi me pasó igual con el LM35, aquello no dejaba de oscilar incluso con condensador (aunque realmente mejoró mucho).
Así que me decanté por realizar un promedio de lecturas, para ser mas exacto unas 100 lecturas.
Hasta ahora todo de maravilla, no se si es una solución un poquito cutre ,pero vamos funciona, y en mi caso no era necesaria una gran precisión.

Saludos.


Es una muy buena solución, has hecho un rudimenario 'filtro digital'  :) :) sin agregar nada más de hardware que el capacitor (el cual es casi una obligación más que una sutileza).

Saludos


Título: Re: ADC con mucho error
Publicado por: piclord en 03 de Agosto de 2006, 19:03:40
Hola

El promedio tampoco es lo ideal, lo mejor es calcular la desviacion estandard, lo cual no es dificil.....

Saludos
Título: Re: ADC con mucho error
Publicado por: JavisusII en 04 de Agosto de 2006, 08:05:04
Buenas gige,

Me uno a la respuesta de Mauricio, una muy buena solución es la del filtrado digital, es una solución barata y eficaz. Ademas
te evita diseños complejos de entender como filtros de 2do orden etc..(fáciles de implementar ciertamente.)

Pero Pelusac... :D, je je, un poco bestia tio:  100 muestras y media  :2]

Pelusac explicale un poco mejor hombre,  :?

-  Gige debes definir por ejemplo unas 20 variables. (uivar1-20)
-  1 coges una muestra del ADC y la pones en la variable uivar1 --->suma las 20 y divide entre 20
- 2 coges la muestra 2 del ADC y la pones en la variable uivar2 ---->suma las 20/20
- y así sucesivamente.... cuando lleges a la 20 vuelta a empezar, sin borrar o tocar ninguna variable.

Hemos echo con lo anterior lo que realmente haría un condensador real


Saludos, y por favor los que tengan el veranito encima diviértanse.


 
Título: Re: ADC con mucho error
Publicado por: pelusac en 04 de Agosto de 2006, 15:05:09
Me imagino que si que es un poko burrito hacer un promedio de tantas muestra :lol: :lol: :lol:
pero como funcionó pues lo di por válido.

De todas formas creo que lo ideal también es calular la desviación, pero como por ahora no sè , ya lo iré investigando. :mrgreen:

Un saludo.
Título: Re: ADC con mucho error
Publicado por: piclord en 05 de Agosto de 2006, 19:00:45
Hola muchachos

No me parece que 100 muestras sea algo exagerado si se trata de la media...diria incluso que 20 es poco....sin embargo, eso no es lo más importante...Lo valioso es evitar visualizar las tediosas variaciones...Si el tiempo transcurrido entre las primeras 20 medidas y las proximas en reducido, entonces nuestras medidas igualmente debieran variar mucho....entonces, primero filtrar con un capacitor, y luego sacar la desviacion standard de la cantidad de muestras deseadas....ahora bien, para este ultimno caso, 20 muestras seria bueno, por cuanto es necesario guardar las muestras en un buffer de 20 posiciones, con la consecuente perdidad de RAM....si son 100 las muestras la cosa se complica..a esto se suma el hecho de que hay que desarrolar mas calculos, que en definita aumenta el consumo de recirsos del PIC, una por otra.....
Probemos con 20 muestras y un pseudo código..favor corregir si me equivoco por favor...

Código: [Seleccionar]
set_adc_channel(1);
For (i=0; i<20;i++){        //capturar las muestras y obtener la suma
Adc_buffer[i]=read_adc();   //registra la muestra
Suma+=adc_buffer[i];        // realiza la suma total para luego obtener la media
}
promedio=suma/20;             //calcula la media

for (i=0;i<20;i++) {             //obtener la suma de los cuadrados de las diferencias parciales respecto de la media
x+=(adc_buffer[i]-promedio)*( adc_buffer[i]-promedio)   // cuadrado de la diferencia
}
varianza=x/promedio

desviacion=sqrt(varianza);   //valor deseado

T=float(desviación*escala)  // Temperatura medida. escala  depende del sensor y resolucion del ADC.


Bueno..eso

Saludos
Título: Re: ADC con mucho error
Publicado por: JavisusII en 07 de Agosto de 2006, 04:55:52
Buenas,

Piclord, dos cosas,

- A lo que nos referimos tanto Maunix, como yo al hablar de un filtro rudimentario, nos referimos a un filtro no un promedio.(leete bien mi post)
- Para que quiero la desviación? , no quiero valorar si la muestra es más o menos heterogénea, si es más o menos representativa de los valores que
recogo. Necesito un filtro digital y punto.

No entiendo de dónde sacas esto.

- Cuando hablas de que hay que filtrar con un capacitor, a que te refieres, un capacitor ??, puntualiza, diseña el filtro, que tipo de filtro?, primer orden, segundo???

Saludos.

 
Título: Re: ADC con mucho error
Publicado por: maunix en 07 de Agosto de 2006, 15:01:21
No entiendo de dónde sacas esto.

- Cuando hablas de que hay que filtrar con un capacitor, a que te refieres, un capacitor ??, puntualiza, diseña el filtro, que tipo de filtro?, primer orden, segundo???


JavisusII lo del capacitor es una cosa común, poner un pequeño capacitor entre el pin de uno de los canales A/D y GND para filtrar ruidos de alta frecuencia.

Título: Re: ADC con mucho error
Publicado por: JavisusII en 07 de Agosto de 2006, 17:05:29
Buenas

je je je  :D, claro claro Mauricio, hay algunos del foro los cuales ya empiezo a conocer... :mrgreen:

Por supuesto no me refiero a tu "capacitor", ya sé que tú sabes para que lo pones.

 Yo hablo del capacitor de piclord :....entonces, primero filtrar con un capacitor, y luego sacar la desviacion standard de la cantidad de muestras deseadas....ahora bien, para este ultimno caso, 20 muestras seria bueno, por cuanto ...bla bla bla.

Haber piclord una cosa es poner un condensador para desacoplar interferencias y ruidos de alta, (como dice
Mauricio) y otra cosa es lo que tú referencias, un filtro pasa bajos . Un filtro pasa bajos es un poco más que un
capacitor : es también una resistencia.  :D 

Y lo de las muestras , hablas de pocas, muchas, que si 20 que si 100, en fin no dices nada, nada  8). Habrá que ver primero cual es la frecuencia de la componente oscilatoria, y luego calcular el período de muestreo necesario.(necesitas lo que tarda el ADC en recoger una muestra) que produzca el retardo o delay requerido.

Entiéndeme Mauricio es que no sé lo que me está diciendo piclord y como lo dice tan seguro.

Haber piclord: el filtro que antes he puesto es para ahorrarnos un filtro paso bajo. La típica resistencia
de 10K+100nf es todo un tópico, es el capacitor que dice Mauricio pero éste lo doy por echo.

El filtro digital que he comentado antes es un típico filtro FIR (de coeficientes finitos) en este caso 20 por decir algo.

A saber filtro FIR:

    y(n)=Suma Bk x X(n - k)

Si por ejemplo tenemos 5 muestras seria
 B1=0.5 (1/2) la primera es la media con cero entendéis 1/2=0.5
 B2=0.3 (1/3)
 B3=0.25 (1/4)
 B4=0.2  (1/5)
 B5=0.16
 imaginaros que el ADC da siempre 1 (para que lo veáis más claro.)

es decir la muestra 1:
   y(5)=0.5x1+0.3x1+0.25x1+0.2x1+0.16x1=1

En fin piclord esto es lo que entendemos por un filtro rudimentario. ¿ok?

Lo del número de muestras depende como he dicho de la frecuencia de la señal. A partir de aquí de doble x2
y tenemos la frecuencia de muestreo mínima. y el número de muestras mínimo.

Saludos al foro










Título: Re: ADC con mucho error
Publicado por: JavisusII en 07 de Agosto de 2006, 17:30:21
Je je siempre posteo muy rápido , supongo que entenderéis que el filtro FIR puede sufrir muchas variaciones.

Una de ella por supuesto , ya se que os habéis dado cuenta es que el filtro que comenté unos cuantos posts
anteriores es un filtro basado en la media algo así como

y(n)=Bk[ (x(n)+x(n-k) ]


Que manía de postear rápido sin volver a mirar atrás  ,  :oops:

Qué? muestra 1 y pongo la 5 , sí mejor será  :ni)

Saludos
 
Título: Re: ADC con mucho error
Publicado por: piclord en 07 de Agosto de 2006, 23:56:41
xxx
Título: Re: ADC con mucho error
Publicado por: Nocturno en 08 de Agosto de 2006, 02:10:17
Señores, por favor, debatid, discutid y porfiad, pero no os faltéis al respeto.

Es mucho más bonito y divertido aprender de vuestros mensajes si no entráis en descalificaciones, sino que argumentáis vuestro punto de vista.

Piclord, edito tu mensaje.
Javisus, baja el tono, por favor.
Título: Re: ADC con mucho error
Publicado por: maunix en 08 de Agosto de 2006, 10:56:42
Señores, por favor, debatid, discutid y porfiad, pero no os faltéis al respeto.

Es mucho más bonito y divertido aprender de vuestros mensajes si no entráis en descalificaciones, sino que argumentáis vuestro punto de vista.

Piclord, edito tu mensaje.
Javisus, baja el tono, por favor.


Sí, creo que se han caldeado los ánimos pero esperemos sea solo en este post ;)

El punto central es que creo que es un tema super interesante y muy basto.  Hay libros completos escritos sobre el tratamiento de señales y a veces 'saber comunicar el pensamiento de uno' es lo más dificil , mezclado con el orgullo... es una mezcla explosiva.

Creo que hay que tratar de buscar puntos en común y no tanto en las diferencias.  Tratar de hacerle entender al otro con argumentos técnicos y no con agresiones.

Nocturno coincido contigo 100%.

Si no nos calmamos con una charla técnica, que podemos esperar de evitar guerras... :(

Título: Re: ADC con mucho error
Publicado por: micro_pepe en 09 de Agosto de 2006, 15:57:52
Retomando el tema y dejando de lado los malos rollos:
Citar
A saber filtro FIR:

    y(n)=Suma Bk x X(n - k)

Si por ejemplo tenemos 5 muestras seria
 B1=0.5 (1/2) la primera es la media con cero entendéis 1/2=0.5
 B2=0.3 (1/3)
 B3=0.25 (1/4)
 B4=0.2  (1/5)
 B5=0.16
 imaginaros que el ADC da siempre 1 (para que lo veáis más claro.)

es decir la muestra 1:
   y(5)=0.5x1+0.3x1+0.25x1+0.2x1+0.16x1=1


JavisusII no entiendo bien lo del filtro, y(5) segun lo tienes puesto no da 1, sino 1.41, me gustaria saber como se obtiene exactamente el valor valido de la medida, que en el ejemplo tendria que ser 1, si como dices el ADC siempre da 1.

Saludos y gracias.
Título: Re: ADC con mucho error
Publicado por: JavisusII en 09 de Agosto de 2006, 18:32:34
je je , efectivamente micro_pepe este post me da un poco de mal rollo .

El filtro FIR se describe mediante una ecuación en diferencias, es la suma de unas muestras digitales valoradas
mediante un multiplicador.Esas muestras son finitas.

El ejemplo no da uno. cierto.
 El ADC=1 o 5 o 2.5V en fin cualquier cosa.
Efectivamente si se aplica a una excitación de tipo escalón. Ejemplo 1xu(t)

podríamos poner 4 muestras y coeficientes de filtrado  b1=0.4, b2=0.3, b3=0.2, b4=0.1.
Si te fijas sólo estamos ponderando las muestras.

que mal rollito me da este post  :c)

saludos