How Do You Configure the nRF52 SAADC?
Last updated 5 July 2026 · 7 min read
Direct Answer
The SAADC (Successive Approximation ADC) on nRF52 and nRF53 devices is configured per channel with a gain, a reference voltage, and an acquisition time, then read either as a single blocking conversion or streamed continuously via EasyDMA into a RAM buffer. Gain and reference together set the input voltage range the channel can measure — for example, a 0.6 V internal reference with 1/6 gain covers 0 to 3.6 V. Acquisition time is the SAADC's equivalent of a conventional ADC's sampling time: the period the internal sample-and-hold capacitor is given to charge from the source before conversion, and it must be long enough for the actual source impedance in use, not just the shortest available setting. For continuous, CPU-independent sampling, a TIMER event is chained to the SAADC SAMPLE task via PPI or DPPI, and results are written directly to a buffer by EasyDMA without CPU involvement per sample. A one-time offset calibration (nrfx_saadc calibration routine) compensates for a small, temperature-dependent internal offset and should be re-run if the operating temperature range is wide.
Detailed Explanation
The SAADC (Successive Approximation ADC) is the analog-to-digital converter peripheral on nRF52 and nRF53 devices, used for reading battery voltage, sensor outputs, and analog signals in general-purpose embedded designs. Like any peripheral, its documentation tends to describe individual settings — gain, reference, acquisition time — without necessarily connecting them into a complete configuration story, and it's referenced elsewhere on this site only as a downstream consumer of other Nordic peripherals (PPI/DPPI channel triggering, power-management current budgeting) rather than explained on its own. This page covers configuring the SAADC end to end. For what an ADC is fundamentally and how resolution, sampling, and quantisation work in general, see what is an ADC? For the equivalent peripheral on STMicroelectronics parts, see how do you configure the STM32 ADC?
Channel Configuration: Gain and Reference
Each SAADC channel is configured with a gain and a reference voltage, which together determine the input voltage range the channel measures. The SAADC supports an internal 0.6 V reference (temperature-compensated, or an external reference pin), combined with a selectable gain (commonly 1/6, 1/5, 1/4, 1/3, 1/2, 1, 2, or 4, family-dependent) that scales the effective input range.
For example, with the internal 0.6 V reference and 1/6 gain, the effective full-scale input range is 0.6 V ÷ (1/6) = 3.6 V — a common configuration for reading a signal referenced to a nominal 3.3 V rail with margin. Choosing a gain that matches the actual signal range maximises the number of ADC codes used across that range, directly improving effective resolution — a signal that only spans 0–1 V measured with a range configured for 0–3.6 V wastes roughly two-thirds of the available codes.
Acquisition Time
Acquisition time is the SAADC's version of sampling time on any successive-approximation ADC: the period the internal sample-and-hold capacitor is given to charge from the input before the actual conversion begins. It's configured per channel (commonly selectable from options like 3 µs, 5 µs, 10 µs, 15 µs, 20 µs, or 40 µs, family-dependent) and must be long enough for the combined source impedance and the SAADC's internal input resistance to fully charge the sampling capacitor within that window.
As with any SAR ADC, too-short an acquisition time for the actual source impedance produces the classic symptom: inconsistent, noisy readings on an input that should be electrically stable, because the sample-and-hold capacitor hasn't fully settled before conversion. A higher-impedance source (a resistive divider, an unbuffered sensor output) needs a longer acquisition time; a source buffered through a low-impedance op-amp output can safely use the shortest setting.
Single, Burst, and Continuous Sampling
The SAADC supports several acquisition patterns:
- Single sample — one conversion per SAMPLE task trigger, the simplest mode for infrequent or on-demand readings.
- Burst mode — a single SAMPLE task trigger initiates multiple back-to-back conversions (useful for hardware-averaged oversampling of one channel without a full timer-driven sampling loop).
- Continuous, timer/PPI-triggered sampling — for a sustained sample rate, a TIMER compare event is chained via PPI or DPPI directly to the SAADC's SAMPLE task, producing evenly spaced samples at a hardware-guaranteed interval without CPU involvement in the timing loop itself — the CPU only needs to respond to the SAADC's END or buffer-full event, and in some designs not even that, if EasyDMA writes results into a large buffer that's only inspected periodically.
EasyDMA and Buffer Management
The SAADC writes conversion results directly into a RAM buffer via EasyDMA rather than requiring the CPU to read each result out of a data register. A buffer is provided to the driver (nrfx_saadc_buffer_set() or the equivalent Zephyr/nRF Connect SDK API), and the SAADC fills it automatically as samples complete — for multi-channel scans, results for each channel in the configured sequence are written in order, repeating for each pass. Double-buffering (providing a second buffer before the first fills) allows continuous, gapless acquisition: the SAADC switches to the second buffer the instant the first completes, giving firmware the full duration of one buffer's worth of samples to process the previous one.
Calibration
The SAADC has a small internal offset error that a one-time calibration routine (exposed by the nrfx SAADC driver) measures and compensates for. Run calibration once at startup, after the reference has stabilised and before the first real conversion. Because the offset has some temperature dependence, Nordic's guidance for applications spanning a wide temperature range is to re-calibrate periodically rather than relying on a single startup calibration — for most room-temperature-range consumer applications, a single startup calibration is sufficient.
Design Considerations
- Match gain and reference to the actual signal range, not a default that happens to work. Using more of the available ADC codes across the signal's actual range improves effective resolution for free — no additional hardware or firmware complexity required.
- Size acquisition time for the real source impedance, using the same reasoning as any SAR ADC: a higher-impedance, unbuffered source needs meaningfully more acquisition time than a low-impedance, op-amp-buffered one. Don't assume the shortest available setting is adequate without checking against the specific source impedance in the design.
- Use PPI/DPPI-triggered continuous sampling instead of a software timing loop wherever a sustained sample rate is needed, particularly in battery-powered designs — chaining a TIMER event directly to the SAADC SAMPLE task via PPI/DPPI keeps sampling running correctly through CPU sleep, which is central to the low-power design approach covered in nRF52 power optimisation.
- Explicitly disable the SAADC when not in active use. The SAADC draws meaningful current while enabled, even between conversions in some configurations — call the driver's disable function after a sampling batch completes rather than leaving the peripheral enabled indefinitely, particularly in a coin-cell or energy-harvesting design where every microamp matters.
- Re-calibrate periodically if the product operates across a wide temperature range, since the internal offset the calibration routine compensates for has some temperature dependence — a single startup calibration may not be sufficient for an outdoor or industrial temperature range application.
- Building reliable, low-power analog signal acquisition into an nRF52/nRF53 product — correct SAADC configuration paired with the platform's PPI/DPPI autonomous sampling and power-management features — is exactly the kind of firmware detail that separates a battery life spec from a battery life reality. Zeus Design's embedded firmware team builds nRF firmware with this level of attention from the start.
Common Mistakes
- Accepting a default acquisition time without checking it against the actual source impedance — the same class of mistake that causes noisy readings on any SAR ADC, and the most common root cause of unexplained SAADC noise.
- Choosing gain and reference settings that don't match the actual signal range, wasting a large fraction of the available ADC codes and effectively reducing resolution for no reason.
- Building a software timer + interrupt loop for continuous sampling instead of a PPI/DPPI-triggered chain, adding unnecessary CPU wake events and jitter that a hardware event-to-task chain avoids entirely — see how does PPI/DPPI work on the nRF52 and nRF53? for the specific pattern.
- Leaving the SAADC enabled continuously when only periodic sampling is needed, unnecessarily increasing average current draw in a battery-powered design — see the peripheral-disable guidance in nRF52 power optimisation.
- Skipping calibration, or calibrating only once for a product with a wide operating temperature range, leaving an avoidable and potentially temperature-varying offset error in every reading.
Frequently Asked Questions
- What is EasyDMA and why does the SAADC need it for continuous sampling?
- EasyDMA is Nordic's term for the direct-memory-access mechanism built into many nRF52/nRF53 peripherals, including the SAADC, that lets the peripheral write conversion results directly to a RAM buffer without CPU involvement per transfer. For the SAADC specifically, EasyDMA is how a PPI/DPPI-triggered continuous sampling chain actually gets samples into memory — the CPU only needs to wake (or not at all, depending on buffer size and interrupt configuration) when a buffer fills, rather than servicing every individual conversion.
- How is SAADC acquisition time different from sampling time on other MCU ADCs?
- They're the same underlying concept with different naming. Both describe the time given for the ADC's internal sample-and-hold capacitor to charge from the input signal, through the combined source and internal input impedance, before the conversion itself begins. Too short an acquisition/sampling time for the actual source impedance in use produces the same symptom on any successive-approximation ADC — inconsistent, noisy readings on a signal that should be stable — regardless of whether the specific silicon calls the setting 'acquisition time' (Nordic) or 'sampling time' (ST and most other vendors).
- Do I need to calibrate the SAADC, and how often?
- Yes — the SAADC has a small internal offset error that the nrfx SAADC driver's calibration routine measures and compensates for. Calibrate once at startup after the reference has stabilised. If the product operates across a wide temperature range, Nordic's guidance is to re-calibrate periodically (for example, on a timer or on a significant temperature change reported by another sensor) since the offset can drift with temperature — a single startup calibration is not necessarily sufficient for applications spanning a large operating temperature window.
References
Related Questions
How Does PPI/DPPI Work on the nRF52 and nRF53?
How PPI and DPPI let nRF52/nRF53 peripherals trigger each other directly in hardware, with no CPU involvement — channels, fork vs publish/subscribe, and code.
How Do You Minimise Current Draw on an nRF52 in BLE Applications?
Minimise nRF52 BLE current draw: DCDC converter, advertising interval, connection interval, System OFF mode, Zephyr PM, and PPK2 measurement techniques.
nRF52 Variants Compared: Which Should You Choose for Your BLE Product?
Compare nRF52 variants: nRF52840 (USB, 802.15.4), nRF52833 (Thread, no USB), nRF52832 (most widely deployed), and entry-level nRF52811/nRF52810. How to choose.
How Do You Set Up the nRF Connect SDK and Zephyr RTOS for nRF52 Development?
Set up nRF Connect SDK (NCS) for nRF52 development: install tools, create a west workspace, configure Kconfig, build a Zephyr project, and flash with J-Link.
What Is an ADC (Analog-to-Digital Converter) and How Does It Work?
An ADC converts analog voltages to digital numbers. Covers resolution, LSB, sampling rate, Nyquist, SAR vs sigma-delta architectures, and anti-aliasing filters.
How Do You Configure the STM32 ADC?
Configure the STM32 ADC: regular vs injected channels, single/continuous/scan modes, sampling time, calibration, oversampling, and internal channels.
Related Forum Discussions
nRF5340 network core not starting — BLE stack hangs on bt_enable after migrating from nRF52840
Trying to bring up an nRF5340 DK for the first time. I've done a few nRF52840 projects before so I figured the NCS migration would be fairly
nRF52840 BLE advertising not starting — device not showing up in scanner after bt_enable completes
Trying my first Zephyr/NCS project on an nRF52840 DK after mostly doing ESP32 stuff. Following the [BLE GATT peripheral guide](/questions/nr