Mediciones más estables
Ruido en las lecturas
Habitualmente vemos que la medición de pH tiene variaciones aleatorias, aún cuando la sonda está perfectamente quieta y lleva un tiempo razonable en la solución. Sin embargo, si uno mide con un voltímetro la salida de la sonda de pH (la salida analógica del amplificador) se ve que la tensión es muy estable. Por lo tanto, el ruido en la lectura tiene que ver con el proceso de conversión analógico-digital. El ruido aleatorio está relacionado con 2 cosas fundamentalmente:
- La estabilidad de la tensión de referencia
- Interferencia de otras señales durante la conversión A/D.
Estabilidad de la tensión de referencia
El conversor A/D utiliza como tensión de referencia, el voltaje de alimentación del Arduino (5V) a menos que indiquemos otra cosa. Esa tensión suele tener fluctuaciones, que se trasladan a las medidas del ADC. La forma de resolver ésto es utilizar una fuente de tensión de referencia externa que sea estable. La solución más adecuada es utilizar un LM4040 que entrega una tensión de referencia de 4.096V muy estable en temperatura:
Luego debe configurarse el ADC para utilizar una referencia externa:
analogReference(EXTERNAL);
Si se necesita el valor absoluto de la tensión, hay que tener en cuenta que ahora la referencia es 4.096V. Por lo tanto, la tensión es:
V = 4.096 \times ADC\_value / 1024
Si no es posible conseguir el LM4040, se puede utilizar un diodo zener. Viene de muchos valores distintos, por ejemplo de 4.3V. No tienen la misma estabilidad en temperatura, pero son mejores que la referencia interna:
La resistencia debe ser tal que permita la circulación de la corriente nominal del Zener. Las pruebas se hicieron con un diodo Zener 1N5229B, cuya corriente nominal es aproximadamente 20mA:
R = (5V - V_{zener})/I_{zener} = (5V - 4.3V)/0.02A = 35 Ohm
Se puede agregar un capacitor de 1uF
para mejorar la un poco más la estabilidad.
De la misma forma, hay que indicarle a arduino que utilice la referencia externa.
Por otro lado, es posible aumentar la precisión del ADC si se utiliza el modo ADC_Sleep_Mode, que pone el microprocesador a dormir mientras se hace la conversión AD para eliminar cualquier interferencia de las señales internas del micro. La función a continuación realiza una lectura del conversor AD utilizando el modo sleep:
#include <avr/sleep.h>
float getReading(const byte port)
{
ADCSRA = bit (ADEN) | bit (ADIF); // enable ADC, turn off any pending interrupt
ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); // prescaler of 128
//ADMUX = bit (REFS0) | (port & 0x07); // AVcc
ADMUX = (port & 0x07); //AREF
noInterrupts ();
set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample
sleep_enable();
// start the conversion
ADCSRA |= bit (ADSC) | bit (ADIE);
interrupts ();
sleep_cpu ();
sleep_disable ();
// awake again, reading should be done, but better make sure
// maybe the timer interrupt fired
while (bit_is_set (ADCSRA, ADSC))
{ }
return ADC;
} // end of getReading
El firmware del peachímetro incluye estas mejoras a partir de 0c551146.