I don't have a proper explanation as for the why, but the op amp
problem
I had recently is solved by using a virtual ground set to 1/2 Vsupply.
My understanding there is that the differential amplifier acts as both an
inverting and non inverting amplifier, and that it needs a negative supply (or
a virtual ground, which amounts to the same thing) for the non-inverting part.
Using a virtual ground as mentioned above has two drawbacks:
- it brings the reference point of Vout to 1/2 Vsupply, which
makes it much less nice to use with the Arduino's analog input (only the
upper-half of the input range is used because of this offset) and
- the maximum allowable range for the signals is between 1/2 Vsupply
and Vsupply-1.5V (for the LM324), which is not much even when
Vsupply is 12 V.
Moreover, the differential amplifier needs well matched resistors: R1||R2 =
R3||R4 (R1||R2 is the equivalent resistance of R1 in
parallel with R2), othwerwise it has an additional DC offset which gets amplified by the
gain of the differential amplifier, making the whole thing useless for my purpose of
amplifying the very small voltage across a shunt.
On the bright side though, I found another op amp, the LT1495, that can accept
inputs beyond Vsupply and with a very low input offset. Its only
drawback is that it costs 25 times more than the LM324 (which was very, very
cheap, but still).