7
\$\begingroup\$

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%)?

\$\endgroup\$
  • \$\begingroup\$ I'm curious - Any reason for the feedback resistors and not just a voltage follower? \$\endgroup\$ – MdxBhmt Jun 22 '15 at 6:38
  • \$\begingroup\$ My ignorance. I guess a voltage follower is simpler. \$\endgroup\$ – Dave Jun 22 '15 at 6:43
  • 1
    \$\begingroup\$ Your opamps have a gain of 76, not ~1! \$\endgroup\$ – Nick Johnson Jun 22 '15 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 Jun 22 '15 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 Jun 22 '15 at 12:24
2
\$\begingroup\$

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.

\$\endgroup\$
  • \$\begingroup\$ Interesting suggestion. I'll let you know the results in a few hours... \$\endgroup\$ – Dave Jun 22 '15 at 14:12
  • \$\begingroup\$ Underclocking the Arduino further (to 100 kHz) solved the issue!!!! \$\endgroup\$ – Dave Jun 22 '15 at 22:16
0
\$\begingroup\$

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.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.