Showing posts with label MCP41010. Show all posts
Showing posts with label MCP41010. Show all posts

Wednesday, April 1, 2015

MCP41010 Digital Potentiometer

I've been meaning to test out SPI on the LaunchPad for a while, and specifically this digital potentiometer.

Bill of materials:
Breadboard
MSP-EXP430F-5529LP or other LaunchPad
MCP41010 Digital Potentiometer
Jumpers
330 ohm resistor
LED

This is for the single channel version of the chip, there is also a dual channel version labelled the 42xxx series.  There should be enough information here to get that to work - I didn't have any problems with the single channel.  Here is the code and a description of the circuit:

/*
  Digital Pot Control
 
  This example controls Microchip MCP41010 I/P digital potentiometer with a
  MSP-EXP430F5529LP.  The MCP41010 has 1 potentiometer channel with 256 taps.
  
  The MCP41010 is SPI-compatible,and to command it, you send two bytes,
  one with the command selection bits (xxC1xxC2) and one with the data value
  (0-255).  Note there is only one channel on the MCP41010.
 
  C1  C0  Command  Command Summary
  --  --  -------  --------------------------------------------------------
   0   0  None     No command executed
   0   1  Write    Write the date contained in Data Byte to the pot
   1   0  Shutdown Enter shutdown mode.  Data Byte does not matter
   1   1  None     No command executed
  
  P1  P0  Potentiometer Selections
  --  --  ------------------------------------------------------------------
   0   0  Dummy Code - pot not affected
   0   1  Command executed on Pot 0
   1   0  Command executed on Pot 1
   1   1  Command executed on both Pots
 
  Note: Since the MCP41010 only has one channel, P1 above is ignored
 
  MCP41010  Connection
  --------  ----------------------------------------------------------
  1 (CS)    Pin 8 of MSP-EXP430F5529LP  (CS)
  2 (SCK)   Pin 7 of MSP-EXP430F5529LP  (SCK)
  3 (SI)    Pin 15 of MSP-EXP430F5529LP (MOSI)
  4 (GND)   GND
  5 (PAO)   3.3V
  6 (PWO)   330 ohm resistor to LED and GND
  7 (PBO)   GND
  8 (Vdd)   3.3V

  created 10 Aug 2010
  by Tom Igoe
  modified 2 May 2012 - changed SS pin
  by Rick Kimball
  Thanks to Heather Dewey-Hagborg for the original tutorial, 2005
  
  modified 1 April 2014 for EXP430F5529LP and MCP41010 I/P
  by Frank Milburn
*/

#include <SPI.h>
// set pin 8 as the slave select for the digital pot:
const int slaveSelectPin = 8;

void setup()
{
  // set the slaveSelectPin as an output:
  pinMode (slaveSelectPin, OUTPUT);
  SPI.begin();
}

void loop() {
  for (int level = 0; level < 255; level++)
  {
    digitalPotWrite(level);
    delay(20);
  }
  delay(100);             // wait a bit at the top
  digitalPotWrite(0);     // change the resistance from max to min:
  delay(10);  
}

int digitalPotWrite(int value)
{
  // take the SS pin low to select the chip:
  digitalWrite(slaveSelectPin, LOW); 
  // give the command to write to pot 1
  byte byte1 = B10001;
  SPI.transfer(byte1);
  // send the pot value
  SPI.transfer(value);
  // take the SS pin high to de-select the chip:
  digitalWrite(slaveSelectPin, HIGH);
}