Friday, September 4, 2009

MCP42XXX digital potentiometer

It took me a while to figure out how to use the MCP42100 digital pot ic chips to work. Here is the code I use.


/* Control the MCP42XXX series of digital potentiometers. */
class MCP42XXX
{ protected:
byte ss;
byte clk;
byte mosi;

void spi_transfer( byte val )
{ int i;

digitalWrite( this->clk, LOW );

for( i=1; i<=8; ++i )
{ if( val > 127 )
digitalWrite( this->mosi, HIGH );
else
digitalWrite( this->mosi, LOW );

digitalWrite( this->clk, HIGH );
val = val << 1;
digitalWrite( this->clk, LOW );
}
}

public:
/* Set the ss (Slave Select), clk (clock) and
mosi (Master Output Slave Input) pins. */
MCP42XXX( byte ss, byte clk, byte mosi )
{ this->ss = ss;
this->clk = clk;
this->mosi = mosi;

pinMode( this->ss, OUTPUT );
pinMode( this->clk, OUTPUT );
pinMode( this->mosi, OUTPUT );
digitalWrite( this->ss, HIGH );
digitalWrite( this->clk, HIGH );

this->set( 2, 127 );
}

/* Select the potentiometer to control and set the value.
If pot = 0 set value for potentiometer 0, if pot = 1 set
value for potentiometer 1, if pot = 2 set value for both
potentiometers.
val can go from 0 to 255. */
void set( byte pot, byte val )
{ byte pot_code;

switch( pot )
{ case 0: pot_code = B00010001;
break;
case 1: pot_code = B00010010;
break;
case 2: pot_code = B00010011;
break;
default:
return;
};

digitalWrite( this->ss, LOW );

this->spi_transfer( pot_code );
this->spi_transfer( val );

digitalWrite( this->ss, HIGH );
}
};

1 comment:

  1. This application note will discuss communications between these devices and a PIC16F876 microcontroller.

    digital potentiometer

    ReplyDelete