← Back to Electronics

Calculator

Platform / ADC reference:
V
Max voltage on the divider input
V
ADC full-scale input voltage
Leave blank to auto-calculate
Leave blank to auto-calculate

ADC reference — common platforms

PlatformADC refResolutionMax countsNotes
Arduino Uno / Nano5.0 V10-bit1023analogRead() returns 0–1023
Arduino Mega5.0 V10-bit1023Same as Uno
Arduino Due3.3 V12-bit4095analogReadResolution(12) needed
ESP323.3 V12-bit4095Effective ~11-bit due to non-linearity. Max safe input: 3.3 V
ESP82661.0 V10-bit1023NodeMCU has on-board 220k/100k divider → max 3.3 V
Raspberry Pi Pico3.3 V12-bit4095ADC pins: GP26, GP27, GP28
STM32 (typical)3.3 V12-bit4095Configurable 8/10/12-bit

Design guide

Formula

Vout = Vin Ɨ R2/(R1+R2)
R1/R2 = Vin/Vout āˆ’ 1

ADC = Vout / Vref Ɨ (2āæāˆ’1)
Vin = ADC Ɨ Vref / (2āæāˆ’1)
Ɨ (R1+R2)/R2

Choosing R values

  • Too low (≪1 kĪ©) — high current, heats up, loads source
  • Too high (≫100 kĪ©) — ADC input impedance causes error
  • Sweet spot: 10–100 kĪ© for most MCU ADCs
  • ESP32 ADC input impedance ~80 kĪ© — keep R2 ≤ 10 kĪ©
  • Add small cap (100 nF) across R2 to reduce noise

Protection

  • Always ensure Vout ≤ Vref under all conditions
  • Add a Zener diode across R2 for overvoltage protection
  • Add series resistor (1 kĪ©) between divider and ADC pin to limit fault current
  • For automotive (up to 40V): use 100 kĪ© / 10 kĪ© divider

Reading in code

// Arduino (10-bit, 5V)
int raw = analogRead(A0);
float v = raw * (5.0/1023.0);
float vin = v * (R1+R2)/R2;

// ESP32 (12-bit, 3.3V)
int raw = analogRead(34);
float v = raw * (3.3/4095.0);
float vin = v * (R1+R2)/R2;