Arduino Analogread: Nachbarstiftrauschen auf ADC auch mit großer Verzögerung

Ich lese zwei analoge Eingangswerte (Lichtsensoren mit Pulldown-Widerständen) auf einem Arduino MEGA 2560.

Ein Pin soll den Wert 0 melden, während ein anderer Pin einen Wert von ~800 melden soll. Ich weiß das mit Sicherheit, denn wenn meine Skizze NUR 1 dieser Pins liest, sind dies die Ergebnisse, die ich bekomme.

Wenn ich versuche, beide Werte in einer Schleife zu lesen, scheint der erste Pin beim Lesen vom zweiten Pin beeinflusst zu werden und ist höher als 0. Ich weiß, dass es eine gute Praxis ist, den Befehl analogRead() entweder zweimal aufzurufen oder zu setzen eine winzige Verzögerung zwischen dem Umschalten der Analog-Input-Pin-Reads, um dem ADC eine Chance zu geben, sich zu stabilisieren . Aber selbst wenn ich analogRead() zweimal aufrufe UND ihm einen Verzögerungswert von 1 Sekunde (!!) gebe, gibt mir der erste Pin immer noch einen höheren Messwert als er sollte.

Schleife liest nur Pin 1:
Pin 1 = 0

Schleife, die Pin 1+2 liest, keine Verzögerung zwischen Anrufen:
Pin 1 = 20, Pin 2 = ~800

Schleife, die Pin 1 + 2 liest, analogRead zweimal aufruft:
Pin 1 = 6, Pin 2 = ~ 800

Schleife lesen Pin 1+2, mit Verzögerung (1000):
Pin 1 = 6, Pin 2 = ~800

Ich versuche zu verstehen, was los ist ...


Hier ist der einfachste Code, um dies zu testen

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]);
}

Hier ist ein vereinfachtes Schema, das zeigt, wie 1 Sensor ( TEMT6000 Fototransistor) mit dem analogen Pin verbunden ist. Es verfügt über einen Pulldown-Widerstand, um zufällige schwebende Werte zu vermeiden, falls kein Sensor angeschlossen ist. Der Pull-Down-Widerstand ist so hoch (220 K), dass auch Messungen bei schwachem Licht möglich sind. Sensorkabel verlaufen parallel zu Kabeln, die eine LED speisen. Ich habe es für alle Fälle eingefügt. Beachten Sie jedoch, dass bei allen oben aufgeführten Tests die LED nicht eingeschaltet war.

Multiplizieren Sie nun dieses Setup mit 8. Da ich 8 Sensoreinheiten mit 8 analogen Pins verbunden habe.

vereinfachtes Schema

Könnten Sie den Mindestcode posten, der erforderlich ist, um dieses Problem zu duplizieren?
Verbinden Sie einen dritten analogen Stift mit Masse. Lesen Sie den ersten analogen Pin, dann den neuen Pin, der mit Masse verbunden ist, dann den zweiten.
Hey @MattYoung thx, das habe ich versucht. In einer Kombination mit zweimaligem analogem Lesen UND dazwischenliegendem Lesen eines geerdeten Pins ist mein Wert jetzt auf 1-2 gesunken. Immer noch nicht 0.
An welche Lichtsensoren sind die analogen Eingänge angeschlossen? Bitte posten Sie weitere Informationen darüber, idealerweise Datenblätter und vielleicht einen Schaltplan der Schaltung. Warum haben Sie "Pulldown-Widerstände" bei analogen Werten?
Posten Sie den Schaltplan, ich wette darauf, dass Ihre Signale ungepuffert sind.
@MattYoung: Vereinfachte Schaltpläne hinzugefügt. definitiv keine Pufferung? Danke

Antworten (1)

Beim analogen Lesen sind die internen Kapazitäten des MEGA 2560 mit dem Sensor verbunden und müssen auf die richtige Spannung aufgeladen werden. Da Ihr Sensor einen 220k-Pulldown verwendet, hat Ihr Sensor einen großen Ausgangswiderstand und das Aufladen der internen Kapazitäten kann einige Zeit dauern, insbesondere wenn ein großer Unterschied zwischen den Spannungen zweier verschiedener ADC-Eingangspins besteht, aber analogRead nur den Pin und den internen verbindet Kapazität des ADC für einige Taktzyklen. Sie können dem Eingangspin einen kleinen externen Kondensator (1 nF oder so ähnlich) hinzufügen, sodass die interne Kapazität des ADC von diesem Kondensator viel schneller wieder aufgeladen werden kann. (Siehe Seite 276 im ATmega2560-Datenblatt http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf )

Das Lesen eines Erdungsstifts hilft, da Ihr erwarteter Wert nahe bei 0 liegt. Wenn der Wert jedoch nicht Null oder nahe daran ist, hilft es nicht, zuerst die Erdung zu lesen. Atmel möchte Quellen mit 10 kOhm oder weniger Ausgangsimpedanz. Ihre Quelle hat grundsätzlich eine Quellenimpedanz von 220 kOhm. ( http://www.atmel.com/Images/doc8444.pdf Seite 5) Es könnte hilfreich sein, sogar mehr als 2 analoge Lesevorgänge durchzuführen, eine Verzögerung zwischen ihnen ist nicht erforderlich und Sie sollten den letzten Wert verwenden, der in dem letzten analogen Lesevorgang gemessen wurde .

Danke dafür. Am Ende hatte ich 4 analoge Lesevorgänge hintereinander (ohne Verzögerungen) und damit hat es funktioniert.
Beitrag Nr. 12 hier zeigt an, dass Verzögerungen zwischen den Lesungen hilfreich sein werden ( forum.arduino.cc/index.php?topic=169000.0 ). Er sagt: "Die erforderliche Mindestverzögerung beträgt etwa 1 us pro zusätzlichen 10 K Quellenwiderstand." Das könnte also auch funktionieren: analogRead(pin); delayMicroseconds(50); unsigned int val = analogRead(pin);--- und Sie verwenden nur die 2. Lesung über val.
Nein, das wird nicht funktionieren, da das Problem die interne Kapazität ist. Diese internen Kapazitäten werden erst dann mit dem Ausgang verbunden, wenn Sie ein analogRead durchführen. Das Warten zwischen analogReads hilft nur, wenn das Problem auch externe Kapazitäten sind.