I am using the ADS1243 in an half bridge measurement application where the ADC reference is derived from the bridge excitation voltage Vexc, and the ADC is intended to measure sensor output ideally spanning from 0 to Vexc against an half-way voltage point obtained from the same bridge excitation voltage Vexc by using a precision resistive divider (sketch attached, %Vsupply, up to 5V Vref, RANGE=1).
The system is intended to measure voltages in the 0.5Vexc to Vexc range doubling the ADC native Vref/2 range with a "software trick": sensor voltages in the (0.5 Vexc to Vexc) range are measured connecting the sensor output to the ADC positive input and the half-way voltage point (= 0.5 Vexc) to the ADC negative input, while sensor voltages in the (0 to Vexc) range are measured inverting the inputs, that is connecting the sensor output to the ADC negative input and the half-way voltage point (= 0.5 Vexc) to the ADC positive input. The software do the work of inverting positive and negative inputs when zero ADC output is read, taking a new ADC read after the input inversion and then multiplying the new non-zero ADC output by -1 so that code -16777216 is obtained for 0V sensor output and code +16777216 is obtained for Vexc sensor output. The disadvantage of the trick is that a real "zero" ADC output code cannot be read, however since several (10...16) successive readings are averaged to produce the final trusted sensor reading the interval of missing codes around the "zero" is pushed reasonably low (close to twice the noise level in my evaluation).
In the real world things works very well when the sensor output moves inside the same (0 to 0.5 Vexc) or (0.5 Vexc to Vexc) interval but, when it crosses the boundary at 0.5 Vexc an unexpected shift apperas: for example at sensor output inside the (0.5 Vexc to Vexc) range I have ADC readings between 5958 and 5664 (noise around 300 = 45uV), moving down I have readings between 2312 and 1975 (50uV noise) and finally when I get close enough to the boundary (reding below 300..350) to activate the software trick that inverts the ADC inputs due to the noise, I experience readings between codes 38 and -4044 (that would be 610uV noise). The strange thing is that when I move deeper into the new (0 to 0.5 Vexc) interval I have again a lower noise, for example readings between -6929 and -7252 (noise 323 = 48uV).
It seems like an anomalous offset shift of amplitude around 3782 ADC code appears just due to the inversion of the inputs.
Device self offset and gain calibration is performed each time a reading cycle is started following this procedure:
- device reset,
- clear setup register to force gain = 1 and Burnout = off
- write to ACR register to isable input buffer and clear the RANGE bit
- clear ODAC
- self gain calibration
- self offset calibration
- write ACR for normal operations
- dummy ADC read to purge buffer
I did an additional test to see where this offset comes from, since I supposed that after ADC calibration, connecting both positive and negative ADC inputs to the same pin (same mux setting for pos and neg input) the ADC should read close to zero, but I was suprised to see that setting the MUX register to connect both ADC inputs to the half-way voltage point pin the ADC reading was between 2013 and 1873, while conneting them both to the sensor output I had ADC readings between 1959 and 1838
Curiously this unexpected boundary crossing "offset" is very close to the sum of the two unexpected offsets measured with both adc inputs routed on the same pin.
Is there an explanation for this?
How can I get rid of this "extra" offset?
Thanks in advance