Maker Pro
Maker Pro

How to increase ADC precision knowing input signal characteristic?

G

gretzteam

Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Thanks,

David
 
P

Pooh Bear

gretzteam said:
Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Yes it's called windowing. Some 'front end' processing of your input signal will
do the job.

Do you have a negative supply available ?

Graham
 
S

Stanislaw Flatto

gretzteam said:
Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
I guess this is a standard problem but I can't really find an easy
solution. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Thanks,

David

It has something to do with math. You have 16 (and only 16) steps of
measurement. What you define as full input scale will be presented to
you in 1/16 increments and that IS your precission.
So make your measuring range (with external circuitry) the full scale input.

Good luck

Stanislaw
Slack user from Ulladulla.
 
A

Abstract Dissonance

gretzteam said:
Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Thanks,

David

Mathematically its pretty easy. You want to map [0.6, 1.4] to [0, 3.3].

i.e., (x - 0.6) maps [0.6, 1.4] to [0, 0.8] and
3.3/0.8*(x - 0.6) maps [0.6, 1.4] to [0, 3.3]

f(x) = 4.125*(x - 0.6)

If your resolution of the ADC is 0.2 then

y - (y + 0.2) = 4.125*(x - 0.6) - 4.125*(x + t - 0.6)

0.2/4.125 = t = 0.049

i.e., a step of 0.049 in your signal results in a step of 0.2 to the ADC...
you have effectively increase your resolution by a factor of 4.

(since the function is linear one could just see that its 0.2/4.125...)

Obviously this translates into electronics by having to subtract 0.6 volts
from your signal then multiplying it by 4.125. This circuitry may or may
not help as it could cause other problems and actually make things worse.

But hey, the math is easy ;)

Jon
 
R

Robert Baer

gretzteam said:
Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Thanks,

David
Yawn...say the ADC input range is 0V to 16V, so offset the input by
0.6V to an op-amp with gain of 20 giving the full drive (0.6V-0.6V) * 20
= 0V on one extreme and (1.4V-0.6V) * 20 = 16V on the other extreme.
Use common 0.1% resistors for better than 1/512 accuracy (9+ bits).
Wake me up when you have something easy.
 
M

Mochuelo

Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Thanks,

David

What is your sampling rate, and why would you want not to use an 8- or
10-bit ADC? This would be probably cheaper than adding front-end
circuitry.

Best,
 
B

Ban

gretzteam said:
Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in
the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if
the voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.
David, it is a standard problem. And it doesn't seem to be homework either,
since you have this programmer language. You want something very small and
with little current consumption and also cheap. Here we go:

.---+------------o
| | 10n 3.3V
.-. | ||
| | +-||-------.
200k| | | || |
'-' | ===
___ | | ___ GND
+-|___|-+---)-|___|-+
| 15k | | 47k |
=== | |\| |
GND +-|-\ | ___
___ | >------+-|___|-o
o-|___|-+-|+/ KM7101 100R OUT
IN 13k | |/|
.-. |
| | ===
47k| | GND
'-'
|
===
GND
(created by AACircuit v1.28 beta 10/06/04 www.tech-chat.de)
Maybe you can look for better resistor matches or a different opamp. Also
Microchip has some R-to-R ones, this one is FCH. The 100R is needed if your
converter has capacitive input impedance. The cap should be close to the
supply pin and gnd.
 
F

Fred Bloggs

I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Look at the instrumentation amplifiers as in AD627 http://www.analog.com
.. The conversion is a simple Vout=G*(V(+)-V(-))+Vref, so that if FS is
the full scale A/D input then making G=FS/(0.8), Vref=FS/2, and V(-)=1V
gets you Vout= FS/2 +/-FS/2 as the input swings +/-0.4 about 1V. The
measurement resolution becomes 0.8/16 =0.05 Volts. There are limitations
and I'm not going to waste time speculating about what they may be
because you lack the common sense and industry to fully describe all the
parameters.
 
J

John Larkin

Hi everyone,
I'm using a 4 bit ADC to convert a voltage that can potentially be
between 0 and 3.3V. I end up with approx. 3.3/16 = 0.2V step size for
each code which is not good enough. However I am only interested in the
0.6V to 1.4V range (0.4V swing centered around 1V). Is there a way to
get the ADC converting only those values? Clipping is acceptable if the
voltage is below 0.6 or above 1.4V.

I could potentially get 0.8V/16 = 0.05V precision if the ADC was not
wasting all those codes on don't care input values.

I guess this is a standard problem but I can't really find an easy
solution.

Thanks,

David

If you add noise to the signal, and then software lowpass filter (or
average) the adc data, you can extend the effective resolution to well
under one LSB.

Here's one of many ways....


in---------r1--------+--------------adc
|
|
r2 or maybe c2
|
|
ttl port----r3-------+
|
|
c1
|
|
|
gnd

where the ttl input can be a square wave that's not synchronously
related to the adc sample rate (giving a triangle across c1) or a
software-generated pseuo-random level that may be synchronous or not.

John
 
Top