Arduino analogread: ruido de pin vecino en ADC incluso con gran retraso

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 = 0

bucle de lectura pin 1+2, sin demora entre llamadas:
pin 1 = 20, pin 2 = ~800

bucle de lectura pin 1+2, llamando a analogRead dos veces:
pin 1 = 6, pin 2 = ~800

bucle 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.

esquema simplificado

¿Podría publicar el código mínimo requerido para duplicar este problema?
Ate un tercer pin analógico a tierra. Lea el primer pin analógico, luego el nuevo pin conectado a tierra, luego el segundo.
Hola, @MattYoung, gracias, lo intenté. En un combo con lectura analógica dos veces Y lectura de un pin conectado a tierra en el medio, mi valor ahora se ha reducido a 1-2. Aunque todavía no es 0.
¿Cuáles son los sensores de luz a los que están conectadas las entradas analógicas? Publique más información sobre ellos, idealmente hojas de datos y tal vez un esquema del circuito. ¿Por qué tiene "resistencias desplegables" en valores analógicos?
Publique el esquema, apuesto a que sus señales no tienen búfer.
@MattYoung: se agregaron esquemas simplificados. definitivamente no hay almacenamiento en búfer? Gracias

Respuestas (1)

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 .

Gracias por esto. Terminé con 4 lecturas analógicas seguidas (sin demoras) y eso hizo que funcionara.
La publicación n. ° 12 aquí indica que los retrasos entre las lecturas ayudarán ( forum.arduino.cc/index.php?topic=169000.0 ). Él dice: "El retraso mínimo requerido es de aproximadamente 1 us por cada 10 K adicional de resistencia de la fuente". Entonces, esto también podría funcionar: analogRead(pin); delayMicroseconds(50); unsigned int val = analogRead(pin);---y solo usa la segunda lectura, a través de val.
No, esto no funcionará porque el problema es la capacitancia interna. Esta capacitancia interna solo se conectará a la salida una vez que realice una lectura analógica, esperar entre lecturas analógicas solo ayuda si el problema también son las capacitancias externas.