The full form of ADC is Analog-to-Digital Converter, a circuit that translates continuous real-world voltage signals into discrete binary numbers a microcontroller can process. In any embedded system, the ADC is the critical bridge between the physical world (temperature, light, current, battery voltage) and the digital domain. What it changes in your circuit is absolute: it dictates the maximum precision, the noise floor, and the sampling speed of your sensor data. If your ADC is poorly matched to your sensor, no amount of software filtering will recover the lost data.

The Core Math: Resolution, Reference Voltage, and Step Size

To select the right converter, you must understand step size (also called the Least Significant Bit, or LSB voltage). The step size is the smallest voltage change the converter can detect, calculated by dividing the reference voltage ($V_{ref}$) by the total number of discrete steps ($2^n$, where $n$ is the bit resolution).

Worked Numeric Example: 10-bit vs. 16-bit Step Size
Imagine you are measuring a 5V solar charge controller output.
Arduino Uno (ATmega328P internal 10-bit ADC, 5V $V_{ref}$):
$5.0V / 2^{10} = 5.0V / 1024 = 4.88 mV per step.
If the voltage drops from 5.00V to 4.99V, the Arduino cannot reliably see it; it requires nearly a 5mV swing to register a single bit change.

External ADS1115 (16-bit ADC, 4.096V internal $V_{ref}$):
$4.096V / 2^{16} = 4.096V / 65536 = 0.0625 mV (62.5 µV) per step.
This external chip resolves voltage changes 78 times smaller than the Arduino's internal hardware, making it ideal for precision shunt-resistor current monitoring.

However, a 16-bit resolution on paper does not guarantee 16 bits of usable data. This brings us to Effective Number of Bits (ENOB). Due to thermal noise, clock jitter, and internal non-linearity, a 16-bit ADC might only yield 14 bits of noise-free data. According to Analog Devices' MT-001 Tutorial, always derate your expected resolution by 1 to 2 bits when designing your system's noise tolerance.

Where You Meet ADCs in Practice (And Common Confusions)

You will encounter ADCs whenever a microcontroller needs to read a passive sensor or a scaled-down voltage. Common bench applications include reading NTC thermistors via a voltage divider, measuring the voltage drop across a 0.1Ω shunt resistor to calculate DC current, or tracking a LiPo battery's discharge curve.

What people commonly confuse ADCs with:

  • DACs (Digital-to-Analog Converters): DACs do the exact reverse. They take a digital number from your code and output a physical voltage (e.g., generating a sine wave for an audio amplifier).
  • Digital Potentiometers: Chips like the MCP41310 change resistance via SPI/I2C commands, but they do not measure or convert incoming analog signals.
  • Resolution vs. Accuracy: Makers often assume a '12-bit ADC' means 12 bits of accurate data. Resolution is how finely you slice the pie; accuracy is whether your knife is actually cutting where you think it is. A 12-bit ADC with a noisy 3.3V reference rail might only be accurate to 9 bits.

The Microcontroller Reality: Internal vs. External ADCs

Not all internal microcontroller ADCs are created equal. Understanding the silicon you are working with prevents hours of debugging ghost noise in your serial monitor.

The ESP32 ADC Non-Linearity Trap
The ESP32-WROOM-32 features a 12-bit SAR (Successive Approximation Register) ADC. Theoretically, with a 3.3V reference, it should resolve 0.8 mV per step. In practice, the Espressif ESP-IDF documentation explicitly warns that the internal ADC is highly non-linear near the 0V and 3.3V rails and suffers from severe RF interference when WiFi or Bluetooth is active. If you are building a precision battery monitor or load cell amplifier on an ESP32, never use the internal GPIO ADC pins; use an external I2C ADC instead.

Conversely, the Raspberry Pi Pico (RP2040) has a dedicated 12-bit ADC pin (GPIO26-29) with a much cleaner analog power domain, though its ENOB is closer to 8.5 bits without hardware averaging. The standard Raspberry Pi 4 and 5 single-board computers have zero internal ADCs; you must use an external USB or I2C/SPI module to read any analog voltage.

Decision Path: Pick Your ADC Module

Use this decision tree to select the exact architecture and part number for your next embedded build. Do not default to the microcontroller's internal pins if your sensor demands precision.

Application Scenario Required Trait Architecture Concrete Part Pick
Slow DC measurements (Battery voltage, NTC thermistors, LDRs) High resolution, low speed, noise rejection 16-bit Sigma-Delta (I2C) TI ADS1115 (Use 4.096V internal FSR)
Audio sampling, AC waveform capture, fast transient detection High sample rate (MSPS), low latency 10/12-bit SAR (SPI) Microchip MCP3008 (200 kSPS) or TI ADS8688
Basic UI inputs (Potentiometer knobs, simple joystick axes) Low cost, minimal wiring, 'good enough' precision Internal MCU SAR Internal ATmega328P or RP2040 GPIO26
High-side current sensing on 24V/48V motor drivers Galvanic isolation, high common-mode rejection Isolated Sigma-Delta TI AMC1301 (Requires isolated DC-DC supply)
Bench Trick: Software Oversampling
If you are stuck using an internal 10-bit Arduino ADC but need 12-bit resolution for a slow-moving temperature sensor, use software oversampling. Read the analog pin 16 times, sum the results, and divide by 4. This mathematically yields 2 extra bits of resolution (effectively 12-bit) at the cost of sampling speed, trading time for precision without buying new hardware.

Frequently Asked Questions

Q: Do I need a voltage divider to read a 12V LiFePO4 battery on an ESP32?
A: Yes, the ESP32's absolute maximum GPIO voltage is 3.6V, and its linear ADC region tops out around 3.1V. A fully charged 4S LiFePO4 battery hits 14.6V. Use a voltage divider with a 100kΩ high-side and a 27kΩ low-side resistor. This scales 14.6V down to exactly 3.11V ($14.6 imes rac{27}{127}$), placing it safely inside the ESP32's most linear measurement zone while keeping the parasitic current draw under 120 µA.

Q: Why is my ADC reading jumping around by 10 to 20 bits even when the voltage is stable?
A: High-impedance voltage dividers (e.g., using 1MΩ resistors) cannot charge the internal sample-and-hold capacitor of a SAR ADC fast enough before the conversion triggers, resulting in wild bit-flipping. Keep your Thevenin equivalent source impedance under 10kΩ. If you must use high-value resistors to save battery life, add a 100nF ceramic capacitor in parallel with the lower resistor to act as a local charge reservoir and a hardware low-pass filter.

Q: How do I wire an I2C ADC like the ADS1115 to a 5V Arduino when the breakout board is 3.3V?
A: Do not connect 5V directly to the ADS1115 SDA/SCL pins; you will fry the I2C pull-up resistors and potentially the silicon. Use a bidirectional logic level converter (like the BSS138 MOSFET-based modules) between the 5V Arduino and the 3.3V ADC, or simply power the Arduino's I2C bus at 3.3V if your specific board variant supports it.