Pico ADC readings noisy or wrong: the three ADC pins, 3.3 V range and reference

Use GP26, GP27 or GP28 and keep the input between 0 and 3.3 V.

What the message means

Only those pins reach the converter. The reference is the 3.3 V rail, so supply noise shows in the readings.

Fix it in this order

  1. Connect the sensor output to GP26, GP27 or GP28.
  2. Keep the voltage at or below 3.3 V, using a divider for higher signals.
  3. Average several samples.
  4. Add a small capacitor close to the input.
  5. Convert with the 16-bit scaled reading and the reference voltage.
  6. Use an external converter if you need better accuracy.

Why it happens

The Pico ADC works on GP26, GP27 and GP28 and accepts up to 3.3 V. The readings are noisy, especially when the board draws switching current or the signal source is high-impedance.

Keep the input within 0 to 3.3 V, average several readings, and add a small capacitor near the pin. Use a clean reference for accurate work.

If you see this, do this

You seeDo this
Reading jumps aroundNoise. Average and filter.
Stuck at maximumInput above 3.3 V or wrong pin.

Pico W Wi-Fi, ADC noise.

Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.

Why this happens

The RP2040 on the Pico has a 12-bit successive-approximation converter with four external inputs. GP26, GP27 and GP28 are ADC0 to ADC2; GP29 is wired to ADC3 and measures a third of the board supply on the Pico. Any other GPIO is a digital pin only, so ADC(Pin(5)) will not give you an analogue reading. The converter measures against the ADC reference, which on the Pico is normally the 3.3 V rail through a filter, so anything above 3.3 V saturates the reading and can damage the pin.

Noise comes from two places. The 3.3 V reference moves when the on-board switching regulator is busy, and a high-impedance source cannot charge the converter’s sampling capacitor cleanly. The Pico datasheet notes that driving the SMPS mode pin (GPIO23) high forces the regulator into PWM mode, which usually lowers ripple. The ADC also has known small differential non-linearity, so do not expect the last few bits to be clean.

How to confirm the cause

  • Connect the pin directly to GND, read it a hundred times and print the minimum and maximum. This is your noise floor with a perfect source.
  • Connect it to 3V3 and repeat. A result near full scale, and not stuck at exactly 65535 for a lower voltage, means the range is fine.
  • Compare the spread with the sensor connected. If the spread jumps only with the sensor, the source impedance or the sensor’s own noise is the problem.
  • Set GP23 high as an output and repeat. A smaller spread points to supply ripple.
  • Check the pin number in code. Stuck at the top of the range usually means the wrong pin or an input above 3.3 V.

Worked example

This MicroPython snippet averages 16 readings and converts to volts.

from machine import ADC, Pin

adc = ADC(Pin(26))          # GP26 = ADC0

def read_volts(n=16):
    total = 0
    for _ in range(n):
        total += adc.read_u16()
    return total / n * 3.3 / 65535

print(read_volts())

Common mistakes

  • Dividing by 4095 after read_u16(). In MicroPython the 12-bit result is scaled to 16 bits, so use 65535.
  • Feeding a 5 V sensor output directly. Two equal resistors give half the voltage (2.5 V from 5 V), but use modest values because a large divider adds source impedance and more noise.
  • Leaving the input floating. An unconnected ADC pin reads random values.
  • Reading only once and trusting it. Average several samples before you decide the board is faulty.

If this did not fix it

  • Check the sensor supply. If a sensor runs from VBUS or a noisy rail, its output carries that noise.
  • Check the ground path. Sensor and Pico must share ground, with the sensor ground close to the Pico’s analogue ground pin.
  • Check for Wi-Fi or motor activity at the time of the reading; time your reads away from bursts, or add the capacitor close to the input.
  • Consider an external converter such as an ADS1115 if you need more than roughly 10 stable bits.