raw electronics

The MCP4251 is a dual digital potentiometer that allows resistance to be adjusted programmatically via a microcontroller, providing an alternative to traditional mechanical potentiometers. The chip typically exists in 5kΩ, 10kΩ, 50kΩ and 100kΩ versions. The MCP4251-103 for example has 10kΩ and with 8 bit this results in 10.000 / 256 = 39Ω increments.

Materials Needed

MCP4251 Pinout

MCP4251 Pinout

Wiring the MCP4251 to the Arduino

MCP4251 Arduino Sketch

Connect the MCP4251 to the Arduino as follows:

Basic Example Program

To utilize the MCP4251, first install the library in your Arduino libraries folder:

Download MCP4251 Library

Then, create a new Arduino sketch and use the following code to control the MCP4251:

#include <MCP4251.h>

MCP4251 digipot;

void setup() {

    pinMode(MCP4251_CS_PIN, OUTPUT);
    digitalWrite(MCP4251_CS_PIN, HIGH);

    SPI.begin();

    delay(100);

    digipot.setValue(0, 144); // Set pot 0 to 144/511
    digipot.setValue(1, 0);   // Set pot 1 to 0/511
}

void loop() {

    delay(1000);
}

Utilizing Resistance Values in the Program

The MCP4251 library enables the use of actual resistance values. To achieve accurate readings, follow these calibration steps using an ohmmeter:

  1. Take a random number between 0 and 511.
  2. Set the potentiometer value using digipot.setValue(0, <random number>).
  3. Measure the resulting resistance with an ohmmeter.
  4. Repeat steps 1-3 approximately 20-25 times, recording the values in a tabular format.
  5. Enter these recorded values into calibrate/calibrate.py and execute the script.
  6. Update the MCP4251_CALIBRATE_A and MCP4251_CALIBRATE_B parameters in the MCP4251.h file from the previous output.

Once calibration is complete, you can utilize the library to work with precise resistance values as needed.

#include <MCP4251.h>

MCP4251 digipot;

void setup() {

  pinMode(MCP4251_CS_PIN, OUTPUT);
  digitalWrite(MCP4251_CS_PIN, HIGH);

  SPI.begin();

  delay(100);

  digipot.setResistance(0, 3.2); // Set Pot0 to 3.2 kOhm
}

void loop() {

  delay(1000);
}