Hi
I am using LTC2497. I am trying to get the ADC conversion reading, could anyone explain how does the conversion of 2's compliment to decimal works on this ADC? I tried many times and it does not seem to be working.
Thank you.
LTC2497
Production
The LTC2497 is a 16-channel (eight differential), 16-bit, No Latency ?S™ ADC with Easy Drive technology and a 2-wire, I2C interface. The patented sampling...
Datasheet
LTC2497 on Analog.com
Hi
I am using LTC2497. I am trying to get the ADC conversion reading, could anyone explain how does the conversion of 2's compliment to decimal works on this ADC? I tried many times and it does not seem to be working.
Thank you.
The LTC2497 is 16 Bits + Sign. B22-B6 are in two's complement format. For example Code 1010 0000 0000 0000 0000 0000
B23 and B22 are 10. This indicates the output code is greater than or equal to 0 and less than full scale . Bits 22-6 are 0 1000 0000 0000 0000. This is equal to decimal +32768.
A negative code example would be 0111 1111 1111 1111 1111 1111. B23 and B22 are 01. This indicates the output code is less than 0 and reater than or equal to -FS. Bits 22-6 are 1 1111 1111 1111 1111. this is equal to decimal -1.
I did quite a few data sets and all point to having a amplified digital value of 2.78-2.80.
Any possible error which might have caused this readings?
what is your reference voltage? Are you doing single-ended or differential measurement? Is the -input at ground or at vref/2? Decoding the input voltage of 0.507, assuming a 5V reference and the -input grounded, I come up with 0.5407V. That is in the ballpark. Remember +FS is only Vref/2. Can you provide a schematic or give more details? you might have a filter settling issue to account for the rest of the error.
1. Vref = Vss = 5v
2. Single ended
3. -ve Input = GND
I have attached the schematics below... Resistors: 0 ohms, I2C Res: 4.7k ohms, Caps = 0.1uF & 10uF
Thank you for helping.
My assumptions were correct. So the output code you are seeing is off by about 6.6%. Your schematic doesn't show what is driving the ADC inputs. COM is connected directly to ground. If the channel you are driving does not have a similar low impedance path to ground, the mismatch in impedance could be causing the error. Please include in your schematic how the inputs are being driven. Is your circuit built on a PCB with a solid ground plane? Are your bypass capacitors as close as possible to the pins being bypassed? What is the 5V_REF source?
Hi ghoover
1. ADC inputs are driven by the molex connectors on the left.
2. The ADC traces are on top layer and full plane on layer 2.
3. I missed out the bypass caps.
4. Vref is connected to my Vss. Will you recommend using a external Vref for this application?
Thank you.
Telling me the ADC is driven by molex connectors still doesn't tell me what is driving the ADC. Is it an opamp, a sensor (what's the output impedance?), a battery? Is there a long trace between the molex connector and the ADC inputs? For Vss, what generates it? If it's a switching regulator, you may need something a little quieter.
The ADC is driven by a variable resistor now for testing.
No, the trace is short, about 7-8cm.
VSS is driven by Isolated DCDC converter, powered by USB.
Thanks for your help and suggestion, maybe i will test with another supply.
I do have another question, I am trying to read the ADC internal registers in sequence but it is returning 24bits of '1' when the ADC is grounded. As per our convo earlier, GND => '00'. I wanted to check if there is any setting bits i missed?
Upon completing the conversion, I wrote a '1' to the ADC but it still returns 24 bits of '1'. Am i doing this right?
After the conversion, it is necessary to send the read address which the LTC2497 should ACK and then read out the data. It sounds like the ADC is not acknowledging the read address you are providing. Can you send an oscilloscope photo of the data transfer?
Hi ghoover
You are right, it seems the ADC is NACK my change of channel register. I attached the photo of the osocilloscope I2C comms and serial output.
Hi ghoover
You are right, it seems the ADC is NACK my change of channel register. I attached the photo of the osocilloscope I2C comms and serial output.
Decoding your oscilloscope photo, this appears to be a read not a write (A 1 is sent after the 7-bit address). The ADC ACKs the read address and sends 5C0D40 as a result. The controller NACKs after the data is read ending the read.
Hi ghoover
With some help, I got to the following step,
I decoded the waveform to derive at "0x14 and 0xB0" which is my ADC address and channel 0. On both waveform, the MCU ACK the values.
I applied 5v to the ADC Channel 0 and it returns "0xC000" which translates to "11".
I am still having issues updating the channel to the ADC. On my serial monitor, it does shows that my channel is updated but it is not the case on the ADC. Any idea what might be the issue?
You are telling the ADC to measure CH0 with respect to COM. COM is connected to GND. +FS is only 0.5VREF. The 11 is telling you the ADC input voltage is greater than FS. Reduce the input voltage to less than 2.5V and try again.
Hi ghoover
Yup, I tried and the conversion is correct when my ADC voltage is less than 2.5V.
The problem I am facing is the ADC not responding to the request to change channel. I have no issues reading a single channel but when i try to change the channel, the ADC feeds the value of CH 0 only.
Please provide scope photos showing the command you send to program another channel and the ADC read command results following the write command.
Hi ghoover
This is the scope photo. What I coded,
1. For loop to increment the channel address
2. Write I2C addres
3. Write channel address
4. Read data
5. loop back to step 1
This is where the problem lies, the code runs for 1 cycle and keep repeating the same channel address without increment...On the serial monitor, i did a printout to check, the channel address is increasing but the scope is not showing it / ADC not responding to the change in channel address...
This sounds like a problem with your program, not the ADC.
Hi ghoover
I tried the code and it reflects the change of ADC Channel address correctly. Would you be able to test changing the channel on your end to prove that it is not the fault of the ADC?
Based on my scope result above, we can only conclude that the input and data out from 1 channel is correct, we are not able to confirm the problem lies with my code because it is showing that I coded on the serial monitor.
The scope photo that you provided does not show the address to the ADC changing. Until there is a scope photo showing that you are changing the ADC channel but the ADC is not responding, I'm not sure why you would think the problem could be the ADC.