I. THE CIRCUIT:
Below, an Arduino Due measures voltage signals from two parallel voltage-divider circuits:
enter image description here
We want the Due to accurately measure the voltages at the places where it makes contact with the voltage-dividers. However, we see significant crosstalk - changing the resistance in one channel changes the voltage in the other channel:
$$\textbf{TEST I} ~~(R1 = R2 = 10 MΩ):$$ enter image description here
$$\textbf{TEST II} ~~(R2 = 3.3 MΩ < R2 = 10 MΩ):$$ enter image description here
However, we can theoretically trace these effects to current leaking through the Due: the Due usually has an input impedance of around 10 kΩ, but we have under clocked it from 20 MHz to 1 MHz, which raises its input impedance to 266 kΩ. So the electrons in the voltage divider circuit will certainly prefer to enter the Arduino, rather than traverse the 1 MΩ placed in front of them.
II. THE FOLLOW-UP:
Below, we have made a tiny modification to our original circuit, in hopes of making the voltage channels truly independent: both signals are buffered by one ADA 4528-2 (a dual-channel op amp):
enter image description here
The op amp is not there to amplify the signal: it provides a gain of ~1.003. Instead, it is there to hide the high impedance of the circuit that we're trying to measure. Instead of an output impedance of 1 MΩ, the impedance is now <0.1 Ω:
enter image description here
so the electrons should stay in the circuit, and there should be no crosstalk at all. However, to my surprise, although there is some improvement, there is still noticeable crosstalk!:
$$\textbf{TEST I} ~~(R1 = R2 = 10 MΩ):$$ enter image description here
$$\textbf{TEST II} ~~(R2 = 3.3 MΩ < R2 = 10 MΩ):$$ enter image description here
The red channel should not "know" that the blue channel has increased resistance. However, its signal drops, when I have not made any changes to the red channel - What am I missing from my analysis (By the way, I'm using low-tolerance resistors <1%)?
-
\$\begingroup\$ I'm curious - Any reason for the feedback resistors and not just a voltage follower? \$\endgroup\$MdxBhmt– MdxBhmt2015年06月22日 06:38:59 +00:00Commented Jun 22, 2015 at 6:38
-
\$\begingroup\$ My ignorance. I guess a voltage follower is simpler. \$\endgroup\$Dave– Dave2015年06月22日 06:43:38 +00:00Commented Jun 22, 2015 at 6:43
-
1\$\begingroup\$ Your opamps have a gain of 76, not ~1! \$\endgroup\$Nick Johnson– Nick Johnson2015年06月22日 09:49:04 +00:00Commented Jun 22, 2015 at 9:49
-
1\$\begingroup\$ Also, 10Mohm is a lot of resistance - you're likely to see parasitic effects all over the place, including from contaminants on the PCB. \$\endgroup\$Nick Johnson– Nick Johnson2015年06月22日 09:51:30 +00:00Commented Jun 22, 2015 at 9:51
-
1\$\begingroup\$ Are you sure your 3.3V can drive enough amperes? With r1, r2 10M there's 5.5M to GND. With r1 10M r2 3.3M, you only have 3M to GND. If your voltage source cannot drive any significant load, you might see the effects of your input voltage being lower 3.3V, resulting in the measurements you posted. I have worked with sensors that could only drive fractions of micro ampere before, so "regular" resistor sizes weren't high enough. \$\endgroup\$FRob– FRob2015年06月22日 12:24:58 +00:00Commented Jun 22, 2015 at 12:24
3 Answers 3
More than likely it is a problem to do with the analogue channels being multiplexed inside the arduino - try sampling with a greater time-gap between red and blue signals and this should hopefully solve/indicate the issue.
-
\$\begingroup\$ Interesting suggestion. I'll let you know the results in a few hours... \$\endgroup\$Dave– Dave2015年06月22日 14:12:09 +00:00Commented Jun 22, 2015 at 14:12
-
\$\begingroup\$ Underclocking the Arduino further (to 100 kHz) solved the issue!!!! \$\endgroup\$Dave– Dave2015年06月22日 22:16:22 +00:00Commented Jun 22, 2015 at 22:16
I am reading four pH meters sequentially, and have issues with one variable reading ("mV4") influencing the other three readings. When I implemented the dual read as mentioned in this previous answer to the question by Tom Binnekamp, that successfully alleviated the cross talk.
Maybe that helped, I also twisted the black/red wires of the pH meters into the board 5V and GND rails. What also really helped is using screw terminals (5mm Pitch (2-Pin)) to secure the 5V GND into the board.
Here is the Arduino code segment:
analogRead(PH1_PIN); // buffer signal to prevent ADC cross-talk
pHanalog1_temp[j] = analogRead(PH1_PIN); // read the voltage
delay(200);
analogRead(PH2_PIN); // buffer signal
pHanalog2_temp[j] = analogRead(PH2_PIN); // read the voltage
delay(200);
analogRead(PH3_PIN); // buffer signal
pHanalog3_temp[j] = analogRead(PH3_PIN); // read the voltage
delay(200);
analogRead(PH4_PIN); // buffer signal
pHanalog4_temp[j] = analogRead(PH4_PIN); // read the voltage
delay(200);
Before dual read
Figure 1: Before dual read
Dual read implemented
Figure 2: Dual read implemented
I hope this helps other people! I have spent days troubleshooting ...
-
\$\begingroup\$ Alexandra D. Holland - Hi, (a) As you're new here, please read the tour & help center as Stack Exchange (SE) site rules differ from typical forums e.g. the Q&A format. (b) Your post is largely confirming another answer. On its own, that would not make this a valid answer. (On SE, if you had success with an existing answer (i.e. it was useful), the etiquette is to consider upvoting it (when you have 15 points, the upvote is visible). It's not allowed to write an answer which just says that another answer worked.) However you added some additional points about cabling, so we'll allow it :) \$\endgroup\$2024年05月12日 04:19:03 +00:00Commented May 12, 2024 at 4:19
-
\$\begingroup\$ You said: "What also really helped is using screw terminals (5mm Pitch (2-Pin)) to secure the 5V GND into the board." What connection method were you using to connect power & Gnd to the board before? Do you have an explanation (or at least a theory) of why using screw terminals made a difference? If so, please edit your answer and add those details of the previous, less good, connection type & any theory or explanation of why using screw terminals made an improvement. || Are you sure it wasn't the twisting of the (presumably power?) wires to the pH meters, which made the difference? TY \$\endgroup\$2024年05月12日 04:24:12 +00:00Commented May 12, 2024 at 4:24
Although it is an old post, I recently experienced the same issue with the Arduino Due trying to readout two audio channels for a VU meter. When putting the balance towards one channel only, still a signal was seen on the output of both ADC channels. I tried a considerable delay between the readout of the two channels, but with no luck. What seemed to do the trick for me, is to readout each channel twice and only using the second conversion.
analogRead(Channel1);
ADCLeft = analogRead(Channel1);
analogRead(Channel2);
ADCRight = analogRead(Channel2);
Now I have complete separate channels when moving the balance slider from left to right and vice versa.