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 = 0Schleife, die Pin 1+2 liest, keine Verzögerung zwischen Anrufen:
Pin 1 = 20, Pin 2 = ~800Schleife, die Pin 1 + 2 liest, analogRead zweimal aufruft:
Pin 1 = 6, Pin 2 = ~ 800Schleife 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.
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 .
analogRead(pin); delayMicroseconds(50); unsigned int val = analogRead(pin);
--- und Sie verwenden nur die 2. Lesung über val
.
uint128_t
Matt Jung
evsc
gbulmer
Matt Jung
evsc