Apéndice 8. Conversor analógico-digital (A/D)
Un conversor analógico-digital es un dispositivo electrónico capaz de convertir una señal analógica en un valor binario, en otras palabras, este se encarga de transformar señales analógicas a digitales (0's y 1's).
El dispositivo establece una relación entre su entrada (señal analógica) y su salida (Digital) dependiendo de su resolución . La resolución determina la precisión con la que se reproduce la señal original.
Esta resolución se pude saber, siempre y cuando conozcamos el valor máximo de la entrada a convertir y la cantidad máxima de la salida en dígitos binarios.
Resolución = +Vref/2n(n-bits)
Por ejemplo, un conversor A/D de 8-bits puede convertir valores que van desde 0V hasta el voltaje de referencia (Vref) y su resolución será de:
Resolución = Vref/256 (28)
Lo que quiere decir que mapeará los valores de voltaje de entrada, entre 0 y Vref voltios, a valores enteros comprendidos entre 0 y 255 (2n-1).
La tarjeta Arduino utiliza un conversor A/D de 10-bits, así que: Resolución = Vref/1024 (210)
Mapeará los valores de voltaje de entrada, entre 0 y Vref voltios, a valores enteros comprendidos entre 0 y 1023 (2n-1). Con otras palabras, esto quiere decir que nuestros sensores analógicos están caracterizados con un valor comprendido entre 0 y 1023. (Ver analogRead()).
Si Vref es igual a 5v, la resolución es aproximadamente de 5 milivoltios. Por lo tanto el error en las medidas de voltaje será siempre de sólo 5 milivoltios.
Caso de transmisión o envío de datos (comunicación) por el puerto serie:
Al enviar datos por el puerto serie, tenemos que tener en cuenta que la comunicación se realiza a través de valores con una longitud de 8-bits (Ver serialWrite(c) o serialRead(c) ), mientras que como ya se hemos indicado, el A/D (Convertidor) de Arduino tiene una resolución de 10-bits.
Por ejemplo, si capturamos los valores de un sensor analógico (e.j. potenciómetro) y los enviamos por el puerto serie al PC, una solución podría se transformarlos en un rango entre 0 y 9 y en modo de codificación ASCII (carácter).
(dato capturado del sensor analógico * 9 / 1024) + 48;
0 ASCII -->decimal = 48
1 ASCII -->decimal = 49
etc.
En forma de código podría quedar como:
value1 = analogRead(analogPin1); //captura del valor de sensor analógico (0-1023)
serialWrite(treatValue(value1)); //volcado al puerto serie 8-bits
int treatValue(int data) {
return (data * 9 / 1024) + 48;// fórmula de transformación
}
Otra fórmula sería dividiendo por 4 ¿Esto es correcto? (1024/256)los valores capturados de los sensores analógicos, para convertirlos en valor de byte válido (0 - 255).
value = analogRead(analogPin)/4;
serialWrite(value);