Skip to main content

Full-scale-range-VS-offset-correction

Great question. They are two independent per-channel adjustments that work at different points in the signal chain, solving different problems.


Where Each One Acts​

Analog Input Offset Correction Full-Scale Scaling ADC Core Digital Output

INA± ──────────────► [ − OFS_A ] ──────────► [ × FS_RANGE_A ] ──────► [ Convert ] ──────► Code
▲ ▲
shifts the zero point stretches/compresses
up or down the ±window

They act sequentially on the signal — offset correction first shifts the center point, then full-scale range sets how wide the conversion window is around that center.


Full-Scale Range — FS_RANGE_A/B/C/D​

What it does​

Sets the width of the input voltage window that maps to the full digital code range (−2048 to +2047). It is a gain adjustment — it changes the size of 1 LSB.

The equation​

VIN = VFS * (Code / 2N)

Changing FS_RANGE changes V_FS, which directly changes what voltage one LSB represents.

Practical effect​

FS_RANGE settingV_FS1 LSB sizeUse case
Minimum (0x2000)~0.5 V_PP~122 µVSmall signals — maximum sensitivity
Default (0xA000)~0.8 V_PP~195 µVGeneral purpose
Maximum (0xFFFF)~1.04 V_PP~254 µVLarge signals — avoid clipping

Analogy​

Think of it like zoom on a ruler. A narrow FS_RANGE zooms in (more resolution per volt), a wide FS_RANGE zooms out (fits larger signals without clipping).

Narrow FS_RANGE (0.5V window): Wide FS_RANGE (1.04V window):

+2047 ◄──── +0.25V +2047 ◄──── +0.52V
│ │
0 ◄──── 0V 0 ◄──── 0V
│ │
-2048 ◄──── -0.25V -2048 ◄──── -0.52V

Offset Correction — OFS_A/B/C/D​

What it does​

Corrects a DC shift in the signal or in the ADC core itself. Every real ADC has a small internal offset error — when the input is exactly 0V differential, the output is not exactly code 0, it is slightly above or below. OFS cancels this error.

It can also be used deliberately to shift the center of the conversion window to capture a signal that is not centered around 0V.

Practical effect​

SituationWithout OFS correctionWith OFS correction
ADC has +2mV internal offsetCode 0 output when input = +2mVCode 0 output when input = 0mV
Signal has a DC bias of +50mVWastes codes on one side, clips on otherRe-centers the window on the signal

Analogy​

Think of it like shifting the ruler up or down without changing its scale. The window width stays the same, but its center moves.

Without offset correction: After applying OFS:

+2047 ◄──── +0.402V +2047 ◄──── +0.400V
│ │
0 ◄──── +0.002V ← error 0 ◄──── 0.000V ✓
│ │
-2048 ◄──── -0.398V -2048 ◄──── -0.400V

Key Differences Side by Side​

PropertyFS_RANGEOFS
What it adjustsWidth of the input window (gain)Center point of the input window
Effect on LSB sizeChanges itNo effect
Effect on zero-code pointNo effectShifts it
CorrectsSignal amplitude mismatch, clipping riskDC offset errors, signal bias
Register range0x2000 → 0xFFFFApproximately ±33 mV correction range
Applied per-channelYesYes

How They Work Together​

Consider a real-world scenario: your signal source has a +50 mV DC bias and a ±300 mV swing.

Without any adjustment, the ADC (default 0.8 V_PP window, centered at 0V) sees:

Signal range: −250mV to +350mV

+2047 ◄── +400mV ]
+350mV ] positive side has only 50mV headroom → clips!

0 ◄── 0mV

-2048 ◄── −400mV ] negative side has 150mV unused

Step 1 — Apply OFS to shift center up by 50 mV:

Window now covers −350mV to +450mV...
but that is not symmetric; FS_RANGE is a better tool here.

Step 2 — Widen FS_RANGE to 0.8 V_PP and apply OFS = +50 mV:

+2047 ◄── +450mV ] 50mV headroom above signal peak ✓
+350mV ] signal peak

0 ◄── +50mV ← window center shifted to match signal DC bias

-2048 ◄── −350mV ] 100mV below signal trough ✓

Now the full code range is efficiently used and neither end clips.


Summary in One Sentence Each​

FS_RANGE answers: "How large a swing can the ADC accept without clipping?"

OFS answers: "Where is the center (zero point) of that swing?"

They are complementary — one sets the size of the conversion window, the other sets its position.