Estoy leyendo dos valores de entrada analógica (sensores de luz, con resistencias desplegables) en un Arduino MEGA 2560.
Se supone que un pin reporta el valor de 0, mientras que otro pin reporta un valor de ~800. Lo sé con certeza, porque si mi boceto lee SOLO 1 de estos pines, esos son los resultados que obtengo.
Si trato de leer ambos valores en un ciclo, entonces el primer pin parece estar influenciado por el segundo pin en su lectura, y es más alto que 0. Sé que es una buena práctica llamar al comando analogRead() dos veces o poner un pequeño retraso entre el cambio de lecturas de pines de entrada analógica para darle al ADC la oportunidad de estabilizarse . Pero, incluso si llamo a analogRead() dos veces Y le doy un valor de retraso de 1 segundo (!!) el primer pin todavía me da una lectura más alta de lo que debería.
lazo solo lectura pin 1:
pin 1 = 0bucle de lectura pin 1+2, sin demora entre llamadas:
pin 1 = 20, pin 2 = ~800bucle de lectura pin 1+2, llamando a analogRead dos veces:
pin 1 = 6, pin 2 = ~800bucle de lectura pin 1+2, con retraso (1000):
pin 1 = 6, pin 2 = ~800
Tratando de entender lo que está pasando...
Aquí está el código más simple para probar esto
int sensor[2];
void setup() {
Serial.begin(9600);
}
void loop() {
for (int i = 0; i < 2; i++) {
analogRead(i); // read pin twice and ignore first result
sensor[i] = analogRead(i);
delay(1000); // give long delay to let ADC stabilize
}
Serial.println(sensor[0]);
Serial.println(sensor[1]);
}
Aquí hay un esquema simplificado que muestra cómo 1 sensor ( transistor fotográfico TEMT6000 ) está conectado al pin analógico. Tiene una resistencia desplegable para evitar valores flotantes aleatorios en caso de que no se conecte ningún sensor. La resistencia desplegable es tan alta (220 K) que permite lecturas con poca luz. Los cables del sensor corren en paralelo con los cables que alimentan un LED. Lo he incluido, por si acaso. Pero tenga en cuenta que en todas las pruebas enumeradas anteriormente, el LED no se encendió.
Ahora multiplique esa configuración por 8. Como tengo 8 unidades de sensor conectadas a 8 pines analógicos.
Cuando hace lectura analógica, la capacitancia interna del MEGA 2560 está conectada al sensor y debe cargarse al voltaje correcto. Debido a que su sensor usa un pulldown de 220k, su sensor tiene una gran resistencia de salida y la recarga de las capacitancias internas puede llevar algún tiempo, especialmente cuando hay una gran diferencia entre los voltajes de dos pines de entrada ADC diferentes, pero analogRead solo conecta el pin y el interno. capacitancia del ADC durante algunos ciclos de reloj. Puede agregar un pequeño capacitor externo (1nF o algo así) al pin de entrada, de esa manera la capacitancia interna del ADC se puede recargar mucho más rápido desde ese capacitor. (Consulte la página 276 en la hoja de datos de ATmega2560 http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf )
Leer un pin de tierra ayuda, porque su valor esperado es cercano a 0. Pero si el valor no es cero o está cerca de eso, entonces leer primero la tierra no ayuda. Atmel quiere fuentes con una impedancia de salida de 10 kOhm o menos. Su fuente tiene básicamente una impedancia de fuente de 220 kOhm. ( http://www.atmel.com/Images/doc8444.pdf Página 5) Podría ayudar hacer incluso más de 2 lecturas analógicas, no se necesita demora entre ellas y debe usar el último valor medido en la última lectura analógica .
analogRead(pin); delayMicroseconds(50); unsigned int val = analogRead(pin);
---y solo usa la segunda lectura, a través de val
.
uint128_t
mate joven
evsc
gbulmer
mate joven
evsc