← All parts

MCP3008 8-ch 10-bit ADC

MCP3008

Microchipinterface io display

The MCP3008 is a 10-bit, 8-channel Analog-to-Digital Converter (ADC) that communicates via an SPI serial interface. It supports a wide operating voltage range and low power consumption, making it suitable for various data acquisition applications.

In stock

Specifications

9
Resolution
10 bits
Channels
8
Interface
SPI
Operating Voltage
2.7 - 5.5 V
Sampling Rate
200 ksps
Standby Current
5 nA
Active Current
500 µA
Temperature Range
-40 to +85 °C
Package
PDIP, SOIC, TSSOP

Pinout

16
PinNameFunctionsNotes
1CH0
ADC
Analog Input 0
2CH1
ADC
Analog Input 1
3CH2
ADC
Analog Input 2
4CH3
ADC
Analog Input 3
5CH4
ADC
Analog Input 4
6CH5
ADC
Analog Input 5
7CH6
ADC
Analog Input 6
8CH7
ADC
Analog Input 7
9DGND
GND
Digital Ground
10CS/SHDN
SPI
Chip Select/Shutdown Input
11DIN
SPI
Serial Data Input
12DOUT
SPI
Serial Data Output
13CLK
SPI
Serial Clock
14AGND
GND
Analog Ground
15VREF
Reference Voltage Input
16VDD
POWER
Power Supply

Interactive pinout

Highlight:
MCP3008

Click a pin to copy its name · tap a tag above to spotlight a bus.

Logic level & voltage

Operates from 2.7-5.5 V (per the datasheet specs) over SPI and provides eight 10-bit analog channels — a common way to add ADC to a board that lacks one.

Typical uses

  • Adding analog inputs to the Raspberry Pi / Pico
  • Reading multiple potentiometers or analog sensors
  • Low-speed data acquisition

Wiring notes & gotchas

  • VREF sets the full-scale; tie it cleanly (often to VDD) and decouple.
  • Keep VDD and VREF quiet for accurate conversions.
  • Match the SPI logic level to your host (3.3 V hosts: run the chip at 3.3 V).

Commonly used with

3

Starter code

Community starter examples — minimal, unofficial, and provided to get you wiring fast. Verify against the manufacturer datasheet before relying on them.

Arduino (C++)

Arduino library: Adafruit MCP3008

arduino
// MCP3008 8-channel 10-bit SPI ADC — community starter example
#include <Adafruit_MCP3008.h>

Adafruit_MCP3008 adc;

#if defined(ESP32)
  #define CS_PIN 5
#else
  #define CS_PIN 10
#endif

void setup() {
  Serial.begin(115200);
  adc.begin(CS_PIN);            // hardware SPI + this CS pin
}

void loop() {
  Serial.println(adc.readADC(0));   // channel 0, 0..1023
  delay(200);
}

MicroPython

python
# MCP3008 SPI ADC (ESP32) — community starter example
# No driver needed: one 3-byte SPI transaction per single-ended read
from machine import Pin, SPI
import time

spi = SPI(2, baudrate=1000000, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
cs = Pin(5, Pin.OUT, value=1)   # CS=GPIO5

def read_adc(ch):
    cmd = bytearray([1, (8 + ch) << 4, 0])   # start bit, single-ended, channel
    resp = bytearray(3)
    cs.value(0)
    spi.write_readinto(cmd, resp)
    cs.value(1)
    return ((resp[1] & 0x03) << 8) | resp[2]  # 10-bit result

while True:
    print(read_adc(0))      # channel 0, 0..1023
    time.sleep_ms(200)

Wiring

PinArduino Uno R3ESP32 DevKitC (WROOM-32)Notes
VDD+5V3V32.7-5.5 V; also tie VREF to VDD for full scale
AGND/DGNDGNDGND
CLKD13 (SCK)GPIO18
DIND11 (MOSI)GPIO23
DOUTD12 (MISO)GPIO19
CS/SHDND10GPIO5
CH0..CH7--Analog inputs, 0 to VREF

Related parts

6