Autor Tema: ADC con mucho error  (Leído 4583 veces)

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

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
ADC con mucho error
« 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);
        }


}


Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado Arbolito

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 893
Re: ADC con mucho error
« Respuesta #1 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
Existo, aunque pienses que no pienso

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ADC con mucho error
« Respuesta #2 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.

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
Re: ADC con mucho error
« Respuesta #3 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...

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
Re: ADC con mucho error
« Respuesta #4 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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ADC con mucho error
« Respuesta #5 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


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado piclord

  • PIC12
  • **
  • Mensajes: 52
Re: ADC con mucho error
« Respuesta #6 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

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: ADC con mucho error
« Respuesta #7 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.


 
Xavi (Barcelona)

Desconectado pelusac

  • PIC16
  • ***
  • Mensajes: 118
Re: ADC con mucho error
« Respuesta #8 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.

Desconectado piclord

  • PIC12
  • **
  • Mensajes: 52
Re: ADC con mucho error
« Respuesta #9 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

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: ADC con mucho error
« Respuesta #10 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.

 
Xavi (Barcelona)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ADC con mucho error
« Respuesta #11 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.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: ADC con mucho error
« Respuesta #12 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










Xavi (Barcelona)

Desconectado JavisusII

  • PIC12
  • **
  • Mensajes: 79
Re: ADC con mucho error
« Respuesta #13 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
 
Xavi (Barcelona)

Desconectado piclord

  • PIC12
  • **
  • Mensajes: 52
Re: ADC con mucho error
« Respuesta #14 en: 07 de Agosto de 2006, 23:56:41 »
xxx
« Última modificación: 08 de Agosto de 2006, 02:11:03 por Nocturno »


 

anything