1.24 I2C-ADC-2

I2C-ADC  Precisión y Tiempos

 

De mi primer contacto me había quedado contento. Pero….Han quedado muchas preguntas por contestar.
 
En este paso voy a tratar de estudiar:
Precisión de las lecturas. ¿Gano algo con la conversión de 12 bits frente a los 10 bits del Arduino?
Cuanto tiempo tardo el proceso.

He adaptado el programa para:

Poder decirle por el teclado el “canal” que quiero muestrear. Subrutina ordeTeclado()
Recoger un número suficiente de datos para poder hacer un análisis estadístico. (200)
Calcular el tiempo medio que tarda en  el ciclo de pedir un dato y  tenerlo disponible.
 La primera sorpresa desagradable es que los canales: 0, 5 y 6 funcionan erróneamente.
Y el programa se “cuelga” por el exceso de datos diferentes.

 

Para los cincos canales restantes, que estaban unidos al mismo punto.
Las “medias” y las “desviaciones típicas”  han sido prácticamente iguales.
 Veamos los datos que he obtenido
 
 
En este caso la “media” y la “moda” prácticamente coinciden, por lo que podemos trabajar con “medias” que es mucho más fácil.
 
El “volcado” de los datos es para poder representarlos gráficamente.
 

 

Inicialmente podemos considerar que la distribución se ajusta más o menos a una “Campana de Gaus” (distribución normal).

Recordando un poco  a la Sra. Estadística, podemos estimar que el 95,4% de las lecturas tienen que estar comprendidas en el intervalo

 Media +- 2 σ (desviación)  =  3.269 – 2*6 y 3.269 + 2*6 = 3.257 y 3.281

       Y el 68,2 % en +- 1 σ.      Es decir  en el intervalo:  3.263 – 3.275

Nada es perfecto . Pero no está tan mal.

 

La precisión se puede mejorar con un “filtrado”. Eso será tema para otro momento.

 

Quizás no todos los errores vengan del I2C-ADC.

Como ya he comentado en algún otro capitulo los “americanos” dicen que la salida de 3,3 voltios de Arduino es bastante “sucia” (de aquí he tomado la tensión).
Tendré que repetir la prueba con una tensión de referencia más “limpia” y/o  “filtrar” la salida de 3,3 v. con un par de condensadores (electrolítico + cerámico).

 

Hablemos un poco de tiempo:

 

Recordemos brevemente los pasos a dar para obtener una “lectura:

Abrir las comunicaciones I2C: (Wire.begin())
Identificar al dispositivo con el que quiero hablar: (Wire.beginTransmission ()).
Le pido al I2C que efectué una “lectura”: (Wire.send())
Decirle que he terminado de “hablar”. (Wire.endTransmission())
Espero que efectué una lectura y la conversión a digital. . He comprobado que no es necesario (el ya se toma su tiempo)
Pedirle los datos (Wire.requestFrom)
Mirar si tengo algo en el “buzón de entrada- Buffer”-  . (Wire.available())
Pasar de Bytes > Enteros (union).

En todo este proceso gasta como media 651 microsegundos.

 

Me queda pendiente por investigar:

Si los resultados son mejores o peores que los del Arduino con su  “analogRead()”

Si  ahorro tiempo de ciclo

Si se puede pedir de golpe varios o todos los datos
Si puedo recibir mas de un canal ( por ejemplo 8 bytes en lugar 2)
Etc.
 

Enlaces:

Código

Componentes y Montaje (Los mismos que en I2C-ADC-1)

Comments