Controlling a Digital Potentiometer Using SPI

In this tutorial you will learn how to control the AD5206 digital potentiometer(数字电位计) using Serial Peripheral Interface (SPI). For an explanation of SPI see the SPI Library reference.

Digital potentiometers are useful when you need to vary the resistance in a circuit electronically rather than by hand. Example applications include LED dimming调光, audio signal conditioning and tone generation. In this example we will use a six channel digital potentiometer to control the brightness of six LEDs. The steps we will cover for implementing实施 SPI communication can be modified for use with most other SPI devices.

Hardware Required 硬件准备

  • Arduino or Genuino board
  • AD5206 Digital Potentiometer
  • 6 LEDs
  • 6 220 ohm resistors
  • hook-up wires电子安装线
  • breadboard

Introduction to the AD5206 Digital Potentiometer

Click for for the AD5206's datasheet.

                       

 

The AD5206 is a 6 channel digital potentiometer. (AD5206是8通道的数字电位器)。 This means it has six variable resistors (potentiometers) built in for individual electronic control. There are three pins on the chip for each of the six internal variable resistors, and they can be interfaced with just as you would use a mechanical potentiometer. The individual variable resistor pins are labeled Ax, Bx and Wx, ie. A1, B1 and W1. For example, in this tutorial we will be using each variable resistor as a voltage divider by pulling one side pin (pin B) high, pulling another side pin (pin A) low and taking the variable voltage output of the center pin (Wiper滑片). In this case, the AD5206 provides a maximum resistance of 10k ohm, delivered in 255 steps (255 being the max, 0 being the least).(可以得到最大电阻10K欧姆,最小0欧模,分为255步幅)

Circuit 电路图

 

image developed using Fritzing. For more circuit examples, see the Fritzing project page

Schematic 原理图

 

 

  1 Code 代码
  2 
  3 /*
  4 
  5   Digital Pot Control 数字电位器的控制
  6 
  7  
  8 
  9   This example controls an Analog Devices AD5206 digital potentiometer.
 10 
 11   The AD5206 has 6 potentiometer channels. Each channel's pins are labeled
 12 
 13   A - connect this to voltage
 14 
 15   W - this is the pot's wiper, which changes when you set it
 16 
 17   B - connect this to ground.
 18 
 19 每隔通道有三个端,A,B,W,A接工作电压,W接滑动端,C接地
 20 
 21  The AD5206 is SPI-compatible, and to command it, you send two bytes, one with the channel number (0 - 5) and one with the resistance value for the channel (0 - 255).
 22 
 23  
 24 
 25  The circuit:
 26 
 27   * All A pins of AD5206 connected to +5V
 28 
 29   * All B pins of AD5206 connected to ground
 30 
 31   * An LED and a 220-ohm resisor in series connected from each W pin to ground
 32 
 33 每个W引脚的LED串220欧电阻
 34 
 35   * CS - to digital pin 10  (SS pin)    片选引脚CS接到控制板的引脚10
 36 
 37   * SDI - to digital pin 11 (MOSI pin)   SDI引脚接到控制板的引脚11
 38 
 39   * CLK - to digital pin 13 (SCK pin)    CLK 引脚接到控制板的引脚13
 40 
 41  
 42 
 43  created 10 Aug 2010
 44 
 45  by Tom Igoe
 46 
 47  
 48  Thanks to Heather Dewey-Hagborg for the original tutorial, 2005
 49 
 50  
 51 
 52 */
 53 
 54   
 55 
 56 // inslude the SPI library:
 57 
 58 #include <SPI.h>
 59 
 60  
 61 
 62 // set pin 10 as the slave select for the digital pot:
 63 
 64 const int slaveSelectPin = 10;  // 从选择引脚
 65 
 66  
 67 
 68 void setup()
 69 
 70 {
 71 
 72   pinMode(slaveSelectPin, OUTPUT);   // set the slaveSelectPin as an output
 73 
 74   SPI.begin();    // initialize SPI
 75 
 76 }
 77 
 78  
 79 
 80 void loop()
 81 
 82 {
 83 
 84   // go through the six channels of the digital pot:   循环数字电位器的六个通道
 85 
 86   for (int channel = 0; channel < 6; channel++)
 87 
 88 {
 89 
 90     // change the resistance on this channel from min to max:   电阻从小到大
 91 
 92 for (int level = 0; level < 255; level++)
 93 
 94 {
 95 
 96       digitalPotWrite(channel, level);
 97 
 98       delay(10);
 99 
100 }
101 
102     delay(100);   // wait a second at the top
103 
104     // change the resistance on this channel from max to min:  电阻从大到小
105 
106 for (int level = 0; level < 255; level++)
107 
108 {
109 
110       digitalPotWrite(channel, 255 - level);
111 
112       delay(10);
113 
114 }
115 
116 }
117 
118 }
119 
120  
121 
122 void digitalPotWrite(int address, int value)
123 
124 {
125 
126   // take the SS pin low to select the chip:    SS引脚置低选中该芯片
127 
128   digitalWrite(slaveSelectPin, LOW);
129 
130   //  send in the address and value via SPI:
131 
132   SPI.transfer(address);  //传送地址
133 
134   SPI.transfer(value);    //传送数值
135 
136   // take the SS pin high to de-select the chip:  SS引脚置高释放该芯片
137 
138   digitalWrite(slaveSelectPin, HIGH);
139 
140 }

 

运行效果:从第1通道开始,每个通道的LED,从最暗到最亮,0.1秒后,再从最亮到最暗。