Instrumentation Amplifiers, Error Budgets & Calibration

Proving a measurement system meets its accuracy specification. Learn instrumentation-amplifier error sources (gain error and drift, offset and drift, CMRR, nonlinearity, bias current, noise, input range), accuracy vs precision vs resolution, systematic vs random errors, building an error budget in ppm of full scale, worst-case vs RSS summation, what calibration can and cannot remove, one-point, two-point and multi-point calibration, temperature compensation, traceability and recalibration intervals — with Python summing a pressure-chain budget and deriving two-point calibration coefficients.

A 24-bit ADC does not make a 24-bit-accurate instrument. Every block in the chain adds errors; the error budget lists them, converts them to common units and adds them up to show whether the specification can be met — before hardware is built.

Calibration removes the fixed (systematic) parts. What remains — drift, noise, nonlinearity, hysteresis — sets the real accuracy.

An analogy

An error budget is like a household budget: every expense (error source) is listed in the same currency (ppm of full scale), and if the total exceeds the income (specification), you must cut the biggest expense first — trimming small ones barely helps.

Accuracy, precision, resolution

Resolution is the smallest change you can see (LSB, noise-free bits). Precision (repeatability) is how closely repeated readings agree — set by noise and short-term stability. Accuracy is closeness to the true value — requires calibration traceable to standards. A system can be precise but inaccurate (consistent offset) or high-resolution but imprecise (noisy).

Instrumentation amplifier errors

For an in-amp stage, include:

Summing errors

Worst-case summation assumes every error is at its limit with the same sign — guaranteed but pessimistic. RSS assumes independent random errors — realistic for many units but can be optimistic for correlated errors (e.g. drifts all driven by the same temperature). Common practice: sum correlated groups linearly, then RSS the groups; report both, and verify with Monte Carlo simulation and measurements on real units.

Calibration strategy

One-point calibration removes offset; two-point removes offset and gain; multi-point with polynomial or piecewise-linear correction removes much of the nonlinearity; calibration at several temperatures builds temperature-compensation tables. Calibrate the whole chain with traceable standards (reference weights, calibrators), store coefficients in non-volatile memory with checksums, schedule recalibration based on drift specs (e.g. annually), and document uncertainty per ISO/IEC 17025 practice.

Formulas

Worked example: RSS

Given: Errors 3 mV and 4 mV (independent)

Find: RSS and worst case.

Answer: 5 mV RSS, 7 mV worst case

Worked example: Offset in %FS

Given: V_OS 50 µV, G 100, FS 2.5 V

Find: Error.

Answer: 0.2% FS

Worked example: CMRR error

Given: CMRR 100 dB, ΔV_CM 2.5 V

Find: Input-referred error.

Answer: 25 µV

Error budget structure

  Error source (FS = 10 mV bridge output)  → ppm FS   Calibratable?
  Sensor offset          ±0.5 mV (of 10 mV)     50 000     yes (offset cal)
  Sensor span            ±1%                    10 000     yes (span cal)
  Sensor nonlinearity    0.1% FS                 1 000     partly (multi-point)
  In-amp offset drift    0.06 µV/°C × 25 °C        150     no (unless re-zeroed)
  Reference TC           10 ppm/°C × 25 °C         250     no
  ADC INL                ±5 LSB (16-bit)            76     no
  Noise                  0.1 µV rms × 6.6           66     averaging

List every error with its raw datasheet value, convert to a common unit (ppm or %FS at the ADC input), and mark whether calibration removes it. Initial offsets and gain errors are often huge but calibratable; drifts and nonlinearity remain.

Budget summation and two-point calibration

import math
# Error budget for a pressure measurement chain (full scale 100 kPa -> 2.5 V ADC), worst case vs RSS
errors_ppm = {                               # all as ppm of full scale
    "sensor nonlinearity": 1000,
    "sensor temp drift (after cal)": 800,
    "in-amp gain error (after cal drift)": 200,
    "in-amp offset drift": 150,
    "reference drift": 250,
    "ADC INL": 120,
    "noise (3 sigma, averaged)": 60,
}
wc = sum(errors_ppm.values())
rss = math.sqrt(sum(v**2 for v in errors_ppm.values()))
print(f"worst case {wc} ppm = {wc/1e4:.3f}% FS ({wc*1e-6*100:.3f} kPa); RSS {rss:.0f} ppm = {rss/1e4:.3f}% FS")
biggest = max(errors_ppm, key=errors_ppm.get)
print(f"largest contributor: {biggest} ({errors_ppm[biggest]/wc*100:.0f}% of worst case)")
# Two-point calibration: measured codes at 0 and 100 kPa
c0, c100 = 412, 3890
gain = 100 / (c100 - c0)
offset = -c0 * gain
print(f"calibration: P = {gain:.5f}*code + ({offset:.3f}) kPa; code 2151 -> {gain*2151+offset:.2f} kPa")
# In-amp: gain 200 from G = 1 + 49.4k/RG
print(f"RG for G = 200: {49.4e3/199:.1f} ohm; 0.1% RG -> gain error ~ {0.1*199/200:.3f}%")
# worst case 2580 ppm = 0.258% FS (0.258 kPa); RSS 1335 ppm = 0.134% FS
# largest contributor: sensor nonlinearity (39% of worst case)
# calibration: P = 0.02875*code + (-11.846) kPa; code 2151 -> 50.00 kPa
# RG for G = 200: 248.2 ohm; 0.1% RG -> gain error ~ 0.100%

After calibration, the pressure chain's residual errors total 0.26% FS worst case or 0.13% FS RSS — dominated by the sensor's own nonlinearity (39%), so a better ADC would be wasted money; multi-point calibration or a better sensor would help. Two calibration points (0 and 100 kPa) give the slope and offset that convert raw codes to kPa.

Common mistakes

Applications

Key takeaways

Going further