Reading a differential analog encoder signal

I am trying to build an encoder interpolator using an Arduino, because commercial interpolators are very expensive.

I am using a Baumer ITD42 encoder, which outputs a 1Vpp differential signal on two phases (A and B).

I understand that the differential signal can't be used to drive the Arduino analog input pins directly, so I got a pair of LTC1286 serial ADCs. These are advertised as having differential inputs.

However when I wired up the encoder to the LTC1286's I am only getting the positive-going part of the waveform. The negative-going part gets clipped at zero.

My understanding is the Baumer encoder outputs are actually centred about 2.5V and are 1Vpp (i.e. they go from 2V to 3V). But this is not what I am getting. The maximum count I get from my LTC1286 is about 450 counts - which is 500mV with the ADC reference set at 5V.

Any ideas? (of course a differential amplifier would work, but I'm trying to reduce the parts count as much as possible, and used the LTC1286 precisely because it has differential inputs).

You don't need a differential ADC if running at slow speeds, just use two analog inputs per differential signal and compute the difference in software. However for an encoder its probably best to have simultaneous sampling of the difference.

Without knowing how you've wired things its impossible to say what's going wrong - links to datasheet for the devices is always good to provide. Some differential ADCs have several modes, so you may need to ensure you've programmed it into differential mode - otherwise it'll be single-ended.

Actually at speed you also need simultaneous sampling of A+/- and B+/-, which complicates things, but
you also want fast ADC if running at speed, so one strategy is to use a really fast ADC and multiplex the
readings. Often the stronger requirement for accuracy is when turning slowly anyhow.

I realized what my problem was.

The LTC1286 is not a true differential ADC. If the A- input goes higher than the A+ input, the ADC outputs zeroes (it has no sign bit). That is why my readings clip whenever the sinusoid goes negative (but still above GND).

I should have used an MCP3301 (same pinout as the LTC1286, 1/3 the price, and it is 13 bit, with the MSB being the sign bit).

Anyway the MCP3304 costs almost the same as the 3301, and has four differential analog inputs (it also costs 1/3 of the LTC1286). So I'll get that and reduce my parts count even further.

.. and no, I don't need speed, but I need arc-second level accuracy. The encoder is 5000 ppr, and between each slot I want to interpolate some more. Based on my LTC1286 setup, I can capture both A and B channels in 10 milliseconds, each channel being read 16 times (interleaved) and then averaged. That is plenty for me, because I only need to do something every 172 milliseconds.

My use case is a precise angle sensor for a telescope drive, that will sense the RA axis angle in real-time, and send corrections to the telescope drive controller to correct for periodic error and mechanical deficiencies in the drive.