Introduction: Digital Potentiometer MCP41100 and Arduino
We know the analog potentiometer , is a three-terminal resistor with a sliding contact that forms an adjustable voltage divider .
Potentiometers Many application such like :
1)volume controls on audio equipment.
2) Control the amplifier Gain and offset .
3) Transducer " displacement transducers ".
and many Other application , But did you you want to control the resistance value by Microcontroller instead of using analog one ?
Analog potentiometers have some problem with MCU , Microcontroller doesn't have an easy way to interface with them .
The Digital Potentiometer , give you an ability to adjust the resistance ,allowing you to control a voltage splitter with digital signals
In this simple instructable I will show you how to control Digital Potentiometer MCP41100 Using Arduino IDE .
Potentiometers Many application such like :
1)volume controls on audio equipment.
2) Control the amplifier Gain and offset .
3) Transducer " displacement transducers ".
and many Other application , But did you you want to control the resistance value by Microcontroller instead of using analog one ?
Analog potentiometers have some problem with MCU , Microcontroller doesn't have an easy way to interface with them .
The Digital Potentiometer , give you an ability to adjust the resistance ,allowing you to control a voltage splitter with digital signals
In this simple instructable I will show you how to control Digital Potentiometer MCP41100 Using Arduino IDE .
Step 1: Material
we will need :
1) Arduino Board .
2)Digital Potentiometer MCP41100 .
3)Resistor 100 Ohm
4)LED
5)BreadBoard.
6JumperS
The pin Configuration for MCP41100 above , very easy .
Data sheet for MCP41100 here
This IC using SPI Protocol to communicate with Arduino Board .
Step 2: Calculate the Resistance .
Ok , now we will look at this table , which is show who we can Calculate the Output resistance .
MCP41100 Have a sensitivity of 8bit , 256 taps for each potentiometer will taken from .
The MCP41100 Nominal resistane equal 100K ohm "Rab" and from the Datasheet , The wiper resistance is 125 ohm"Typical" ,
For example , if we write 222 to MCP41100 ,The resistance will equal :
Rwa= (100*10^3)*(256-222)/256 + 125 = 13.41K ohm . (corrected by Spacebrain,big thanks )
Step 3: Arduino Code
The arduino Code below :
/*
this program taken from arduino Example .
modified by By Mohannad Rawashdeh
http://www.genotronex.com
https://www.instructables.com/
This code used to control the digital potentiometer
MCP41100 connected to arduino Board
CS >>> D10
SCLK >> D13
DI >>> D11
PA0 TO VCC
PBO TO GND
PW0 TO led with resistor 100ohm .
*/
#include <SPI.h>
byte address = 0x11;
int CS= 10;
int i=0;
void setup()
{
pinMode (CS, OUTPUT);
SPI.begin();
// adjust high and low resistance of potentiometer
// adjust Highest Resistance .
digitalPotWrite(0x00);
delay(1000);
// adjust wiper in the Mid point .
digitalPotWrite(0x80);
delay(1000);
// adjust Lowest Resistance .
digitalPotWrite(0xFF);
delay(1000);
}
void loop()
{
for (i = 0; i <= 255; i++)
{
digitalPotWrite(i);
delay(10);
}
delay(500);
for (i = 255; i >= 0; i--)
{
digitalPotWrite(i);
delay(10);
}
}
int digitalPotWrite(int value)
{
digitalWrite(CS, LOW);
SPI.transfer(address);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
/*
this program taken from arduino Example .
modified by By Mohannad Rawashdeh
http://www.genotronex.com
https://www.instructables.com/
This code used to control the digital potentiometer
MCP41100 connected to arduino Board
CS >>> D10
SCLK >> D13
DI >>> D11
PA0 TO VCC
PBO TO GND
PW0 TO led with resistor 100ohm .
*/
#include <SPI.h>
byte address = 0x11;
int CS= 10;
int i=0;
void setup()
{
pinMode (CS, OUTPUT);
SPI.begin();
// adjust high and low resistance of potentiometer
// adjust Highest Resistance .
digitalPotWrite(0x00);
delay(1000);
// adjust wiper in the Mid point .
digitalPotWrite(0x80);
delay(1000);
// adjust Lowest Resistance .
digitalPotWrite(0xFF);
delay(1000);
}
void loop()
{
for (i = 0; i <= 255; i++)
{
digitalPotWrite(i);
delay(10);
}
delay(500);
for (i = 255; i >= 0; i--)
{
digitalPotWrite(i);
delay(10);
}
}
int digitalPotWrite(int value)
{
digitalWrite(CS, LOW);
SPI.transfer(address);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
Step 4: Simple Applications :Motor Drive Controller and LED Controller
This Is a simple example to control the speed of DC Motor using555 timer , PWM Technique
the arduino Code :
/*
this program taken from arduino Example .
modified by By Mohannad Rawashdeh
http://www.genotronex.com
This code used to control the digital potentiometer
MCP41100 connected to arduino Board
CS >>> D10
SCLK >> D13
DI >>> D11
PA0 TO VCC
PBO TO GND
PW0 TO led with resistor 100ohm .
*/
#include <SPI.h>
byte address=0x11;
int CS= 10;
void setup()
{
pinMode (CS, OUTPUT);
SPI.begin();
// adjust high and low resistance of potentiometer
// adjust Highest Resistance .
digitalPotWrite(0x00);
delay(1000);
// adjust wiper in the Mid point .
digitalPotWrite(0x80);
delay(1000);
// adjust Lowest Resistance .
digitalPotWrite(0xFF);
delay(1000);
}
void loop()
{
for (int i = 0; i <= 255; i++)
{
digitalPotWrite(i);
delay(10);
}
delay(1000);
for (int i = 255; i >= 0; i--)
{
digitalPotWrite(i);
delay(5);
}
}
int digitalPotWrite(int value)
{
digitalWrite(CS, LOW);
SPI.transfer(address);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
Video :
the arduino Code :
/*
this program taken from arduino Example .
modified by By Mohannad Rawashdeh
http://www.genotronex.com
This code used to control the digital potentiometer
MCP41100 connected to arduino Board
CS >>> D10
SCLK >> D13
DI >>> D11
PA0 TO VCC
PBO TO GND
PW0 TO led with resistor 100ohm .
*/
#include <SPI.h>
byte address=0x11;
int CS= 10;
void setup()
{
pinMode (CS, OUTPUT);
SPI.begin();
// adjust high and low resistance of potentiometer
// adjust Highest Resistance .
digitalPotWrite(0x00);
delay(1000);
// adjust wiper in the Mid point .
digitalPotWrite(0x80);
delay(1000);
// adjust Lowest Resistance .
digitalPotWrite(0xFF);
delay(1000);
}
void loop()
{
for (int i = 0; i <= 255; i++)
{
digitalPotWrite(i);
delay(10);
}
delay(1000);
for (int i = 255; i >= 0; i--)
{
digitalPotWrite(i);
delay(5);
}
}
int digitalPotWrite(int value)
{
digitalWrite(CS, LOW);
SPI.transfer(address);
SPI.transfer(value);
digitalWrite(CS, HIGH);
}
Video :