ADC Resolution vs Accuracy: What Matters

Your 12-bit ADC gives jumpy readings while a 10-bit one looks steadier? Learn the difference between ADC resolution and accuracy: LSB size, offset/gain/INL/DNL errors, ENOB, why the reference voltage matters more than bit count, and practical noise fixes including oversampling.

Written by Projectech8 min readPublished
For B.E./B.Tech Electronics and E&TC students reading sensors with microcontroller ADCs (Arduino, ESP32, STM32) in academic and final-year projects Topics: Microcontrollers, ADC, Sensors
Illustration comparing ADC resolution steps versus accuracy errors, showing offset, gain, and noise on a transfer curve diagram.
Illustration generated for this guide.
In this guide

You chose a microcontroller with a 12-bit ADC because "12 bits is better than 10 bits." Then your temperature readings jump around by 5 degrees, your battery voltage measurement is off by 200mV, and a friend's 10-bit Arduino somehow gives steadier readings than your 12-bit board. What went wrong? You bought resolution, but what you needed was accuracy — and they're very different things.

This guide explains what ADC resolution actually buys you, what accuracy really means (offset, gain, INL, DNL, ENOB), why the reference voltage usually matters more than the bit count, and the practical steps that turn a noisy ADC into trustworthy measurements.

Resolution: the size of the smallest step

Resolution is the number of bits the ADC uses to represent its input range. An N-bit ADC divides its reference voltage into 2^N steps. The voltage of one step — the LSB (least significant bit) — is:

LSB = Vref / 2^N
ADC bits Steps LSB with 3.3V reference LSB with 5V reference
8 256 12.9mV 19.5mV
10 1,024 3.22mV 4.88mV
12 4,096 0.81mV 1.22mV
16 65,536 50µV 76µV

Resolution tells you the smallest change the ADC can report. A 12-bit ADC with a 3.3V reference can report changes as small as 0.81mV. That's all it tells you. It says nothing about whether the reading is correct — a 12-bit ADC can be precisely wrong, reporting 2.048V when the input is actually 2.100V, in beautifully fine 0.81mV steps.

Resolution also sets a fundamental noise floor: quantization error. Rounding the true voltage to the nearest step introduces an error of up to ±½ LSB. That's the hard limit for any ADC of that resolution, even a perfect one.

Accuracy: how close to the truth

Accuracy is how close the ADC's output is to the actual input voltage. It's degraded by several distinct error sources, each with its own name:

Offset error

The entire transfer curve is shifted. An input of 0V reads as, say, +8 LSB. Offset error is a constant added to every reading — easy to calibrate out in software by measuring a known 0V (short the input to ground) and subtracting.

Gain error

The slope of the transfer curve is wrong — the ADC reads correctly at zero but the error grows toward full scale. A gain error of 0.5% means a 3.3V input reads 16.5mV high. Calibrate by measuring a known precise voltage near full scale and applying a scale factor.

DNL (differential nonlinearity)

Individual steps aren't all exactly 1 LSB wide — some are 0.8 LSB, some 1.2 LSB. DNL of ±1 LSB is typical for integrated MCU ADCs. DNL worse than −1 LSB means missing codes: the ADC can never output certain values, and no amount of averaging recovers them.

INL (integral nonlinearity)

The accumulated bow of the transfer curve away from the ideal straight line — the big-picture nonlinearity after offset and gain are removed. A 12-bit ADC with ±3 LSB INL deviates from ideal by up to ~2.4mV on a 3.3V reference.

ENOB: the number that combines everything

ENOB (effective number of bits) folds noise and distortion into a single figure: it's the resolution a perfect ADC would need to match your real ADC's signal-to-noise performance. The ESP32's 12-bit ADC, for example, is widely measured at roughly 9–10 ENOB in real conditions — those extra 2–3 bits are mostly noise. When a datasheet brags "12-bit," look for the ENOB or SNR spec to learn what you actually get.

Error What it is Fix
Offset Constant shift of all readings Measure 0V, subtract in software
Gain Slope error, grows with input Measure known reference, scale
DNL Uneven step widths Nothing (choose a better ADC if it matters)
INL Curve bows away from ideal Multipoint calibration table
Noise Random variation reading-to-reading Averaging, filtering, better layout

Note: Offset and gain errors are systematic — they repeat identically every time, so a two-point calibration (measure 0V and a known voltage, compute offset and scale) removes them almost entirely. INL and noise are the errors you can't calibrate away cheaply.

The reference voltage matters more than the bits

Look at the LSB formula again: LSB = Vref / 2^N. The reference voltage appears directly. If Vref is noisy or drifts, every reading is wrong regardless of bit count.

Most student boards power the ADC reference from the same 3.3V rail that feeds the MCU, WiFi radio, and LEDs. That rail bounces with load current — tens of millivolts of bounce is normal — which directly becomes measurement error. A 12-bit ADC (0.81mV LSB) on a rail bouncing ±20mV is delivering about 7–8 bits of accurate information.

Practical fixes, in order of impact:

  1. Use the MCU's internal reference if it has one (many STM32 and AVR chips offer a ~1.2V or 2.5V internal reference far more stable than the supply rail). Scale your sensor output to fit.
  2. Add an external voltage reference IC (e.g. a 2.5V or 4.096V shunt/series reference) for the ADC's Vref pin where the MCU supports it. A dedicated reference IC drifts a few ppm/°C versus hundreds for a regulator rail.
  3. Ratiometric sensing. If your sensor is a resistive divider or bridge excited by the same supply as the ADC reference, supply variations cancel out — the ADC measures a ratio, not an absolute voltage. This is why load-cell and potentiometer circuits are naturally robust.
  4. Filter the reference. At minimum, put the datasheet's recommended capacitor directly on the Vref pin.

Noise: where your bits actually go

In practice, noise — not the datasheet's INL — is what eats student ADC performance:

  • Digital switching noise coupling into the analog input through the PCB. Keep analog traces short, away from digital/clock traces, over a solid ground plane.
  • Source impedance too high. The ADC's sample-and-hold capacitor must charge through your sensor's output impedance during the sampling window. If the source impedance is high (a 100k voltage divider, say), the capacitor doesn't finish charging and readings are wrong — and wrong in a signal-dependent way that looks like nonlinearity. Fix: buffer with an op-amp voltage follower, lower the divider resistances, or lengthen the ADC sampling time (most MCUs let you configure this).
  • Reference bounce, covered above.
  • Ground bounce from shared return paths — give the analog section its own ground return to the star point.
  • Aliasing. Any noise above half the sampling rate folds down into your measurement band. A simple RC low-pass filter at the ADC input (cutoff below half your sample rate) handles this. The op-amp filters guide covers active filtering when you need a sharper cutoff.

Oversampling and averaging: free extra bits

Averaging N readings reduces random noise by √N. Oversampling goes further: sample at 4^M times your needed rate and average, and you gain M effective bits — provided the noise is white (random) and spans at least 1 LSB. So 16× oversampling + averaging gains 2 bits; 256× gains 4 bits. This is a genuine technique, not a hack — many precision measurements rely on it. But it only reduces random noise; it does nothing for offset, gain, or INL errors, and it requires the input to have at least ~1 LSB of noise (add a touch of intentional noise — dithering — if the signal is unnaturally clean).

Worked example: you need 0.1°C resolution from an LM35 (10mV/°C → 1mV needed) using a 10-bit, 5V ADC (4.88mV LSB). Oversample 64× and average: gain = log4(64) = 3 bits → effective LSB 0.61mV. Combined with a quiet reference and short sampling of a low-impedance source, the measurement becomes usable — no hardware change required.

A practical ADC checklist

Before trusting any ADC reading in your project:

  • Reference: Is Vref stable and quiet? Internal/external reference preferred over the supply rail.
  • Source impedance: Can the sensor drive the ADC's sampling capacitor? Buffer or slow the sampling if not.
  • Input range: Does the sensor's full output swing fit inside 0–Vref without clipping? Scale with a divider or amplifier.
  • Anti-alias filter: RC low-pass at the input with cutoff below half the sample rate.
  • Layout: Short analog traces, solid ground, away from switching noise.
  • Calibration: Two-point calibration (offset + gain) against known voltages — a multimeter and a stable supply are enough. The multimeter guide covers trustworthy measurement technique.
  • Averaging: Oversample and average in firmware; verify the noise actually drops with √N.

Common mistakes

  • Buying bits instead of accuracy. A noisy 12-bit ADC with a bouncing reference loses to a clean 10-bit ADC with a stable reference every time.
  • Measuring a 100k divider directly. High source impedance + short sampling time = wrong readings that look like a bad sensor.
  • Forgetting the ADC input can't exceed Vref (or go below ground). Overvoltage on an ADC pin can latch up or damage the MCU — clamp or divide first.
  • Sampling a PWM output and calling it a measurement. The ADC captures an instantaneous point on the waveform, not the average — filter first, then sample.
  • Trusting "typical" specs. Design against the datasheet's min/max columns, not the tempting "typical" column. The datasheet reading guide shows how.
  • No calibration. Two-point calibration takes ten minutes and removes the two largest systematic errors. Skipping it is leaving accuracy on the table.

Where to go from here

More project guides

More in Electronics / E&TC