Pages: [1]   Go Down
Author Topic: Can't get a digital potentiometer to work  (Read 748 times)
0 Members and 1 Guest are viewing this topic.
Northern California (by San Francisco)
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm trying out a different digital potentiometer. A month ago some people on this forum helped me out with another digital potentiometer that worked fine, but had some linearity issues. Now this one does not work at all.

The potentiometer is an Analog Devices AD 8402A10, which is 0 to 10k Ohms in 255 steps. The data sheet is: www.analog.com/static/imported-files/data_sheets/AD8400_8402_8403.pdf

I use the following code to step the potentiometer through steps of 10 up to 250, then down from 255. The output measured by running a wire from the wiper to an Arduino analog input pin. That same wiper pin has a 2.5 k Ohms resistor connected to ground.

Code:
// include the SPI library:
#include <SPI.h>
#define potInputPin 0

// set pin 10 as the slave select for the digital pot:
const int slaveSelectPin = 10;
int potValue;

void setup() {
    // start serial port at 9600 bits per second
  Serial.begin(9600);

  // clear the serial port buffer
  Serial.flush();
// set the slaveSelectPin as an output:
  pinMode (slaveSelectPin, OUTPUT);
  // initialize SPI:
  SPI.begin();
}

void loop() {
    // change the resistance from min to max:
    for (int level = 0; level < 255; level = level + 10) {
      digitalPotWrite(0, level);
      Serial.print("Pot Level:  ");
      Serial.print(level);
      Serial.print("\t");     
      delay(1000);
      potValue = analogRead(potInputPin);
      Serial.print("Pot Value:  ");
      Serial.print(potValue);
      Serial.print("\n");     
    }
    // wait a second at the top:
    Serial.print("\n");     
    delay(1000);
    // change the resistance from max to min:
    for (int level = 0; level < 255; level = level + 10) {
      digitalPotWrite(0, 255 - level);
      Serial.print("Pot Level:  ");
      Serial.print(255 - level);
      Serial.print("\t");     
      delay(1000);
      potValue = analogRead(potInputPin);
      Serial.print("Pot Value:  ");
      Serial.print(potValue);
      Serial.print("\n");     
    }
     delay(1000);
 }

int digitalPotWrite(int command, int value) {
  // take the SS pin low to select the chip:
  digitalWrite(slaveSelectPin,LOW);
  //  send in the value via SPI:
  SPI.transfer(command);
  SPI.transfer(value);
  // take the SS pin high to de-select the chip:
  digitalWrite(slaveSelectPin,HIGH);
}


The Arduino analog input pin shows no sign of a step change. It bounces around between a few values, but there seems no rhyme or reason to them.

Any thoughts?

Logged

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 634
Posts: 34567
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
You mentioned that you have the wiper connected to an Arduino analog input, plus a 2.5K ohm resistor to GND.
Also in addition to what Richard said this will affect the linearity of the results you obtain.
Logged

Northern California (by San Francisco)
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1) You did not mention where you have the "low" side of the potentiometer connected. Should be GND. Else you will read noise. (which you are doing)
2) You did not mention where you have the "high" side of the potentiometer connected. Should be +5V.  Else you will read noise. (which you are doing)
3) You mentioned that you have the wiper connected to an Arduino analog input, plus a 2.5K ohm resistor to GND.   
a) You have no reason for this resistor, and I see none, at least from what you have revealed. Remove it.
b) That resistor will dramatically overload the output impedance of the pot and you will NEVER read the kind of voltages you are expecting.

Thanks for the reply.
1) I had the low side of the potentiometer floating. I have now connected it to GND.
2) I had the high side of the potentiometer already connected to +5 Volts.
3) I removed the 2.5k Ohm resistor.

The data still looks rather like noise.

Code:
Pot Level:  0 Pot Value:  4
Pot Level:  10 Pot Value:  1023
Pot Level:  20 Pot Value:  1023
Pot Level:  30 Pot Value:  455
Pot Level:  40 Pot Value:  4
Pot Level:  50 Pot Value:  5
Pot Level:  60 Pot Value:  1023
Pot Level:  70 Pot Value:  1023
Pot Level:  80 Pot Value:  1023
Pot Level:  90 Pot Value:  1023
Pot Level:  100 Pot Value:  1023
Pot Level:  110 Pot Value:  1023
Pot Level:  120 Pot Value:  1023
Pot Level:  130 Pot Value:  1023
Pot Level:  140 Pot Value:  1023
Pot Level:  150 Pot Value:  1023
Pot Level:  160 Pot Value:  1023
Pot Level:  170 Pot Value:  1023
Pot Level:  180 Pot Value:  1023
Pot Level:  190 Pot Value:  1023
Pot Level:  200 Pot Value:  337
Pot Level:  210 Pot Value:  4
Pot Level:  220 Pot Value:  217
Pot Level:  230 Pot Value:  1023
Pot Level:  240 Pot Value:  1023
Pot Level:  250 Pot Value:  1023

Pot Level:  255 Pot Value:  1023
Pot Level:  245 Pot Value:  1023
Pot Level:  235 Pot Value:  1023
Pot Level:  225 Pot Value:  1023
Pot Level:  215 Pot Value:  1023
Pot Level:  205 Pot Value:  1023
Pot Level:  195 Pot Value:  1023
Pot Level:  185 Pot Value:  1023
Pot Level:  175 Pot Value:  1023
Pot Level:  165 Pot Value:  1023
Pot Level:  155 Pot Value:  1023
Pot Level:  145 Pot Value:  1023
Pot Level:  135 Pot Value:  1022
Pot Level:  125 Pot Value:  1023
Pot Level:  115 Pot Value:  378
Pot Level:  105 Pot Value:  4
Pot Level:  95 Pot Value:  5
Pot Level:  85 Pot Value:  1023
Pot Level:  75 Pot Value:  1023
Pot Level:  65 Pot Value:  1023
Pot Level:  55 Pot Value:  312
Pot Level:  45 Pot Value:  4
Pot Level:  35 Pot Value:  4
Pot Level:  25 Pot Value:  1023
Pot Level:  15 Pot Value:  1023
Pot Level:  5 Pot Value:  299
Pot Level:  0 Pot Value:  4
Pot Level:  10 Pot Value:  1023
Pot Level:  20 Pot Value:  1023
Pot Level:  30 Pot Value:  1023
Pot Level:  40 Pot Value:  1022
Pot Level:  50 Pot Value:  314
Pot Level:  60 Pot Value:  4
Pot Level:  70 Pot Value:  4
Pot Level:  80 Pot Value:  1023
Pot Level:  90 Pot Value:  1023
Pot Level:  100 Pot Value:  1023
Pot Level:  110 Pot Value:  1023
Pot Level:  120 Pot Value:  1023
Pot Level:  130 Pot Value:  1023
Pot Level:  140 Pot Value:  1023
Pot Level:  150 Pot Value:  1023
Pot Level:  160 Pot Value:  1022
Pot Level:  170 Pot Value:  373
Pot Level:  180 Pot Value:  4
Pot Level:  190 Pot Value:  3
Pot Level:  200 Pot Value:  1023
Pot Level:  210 Pot Value:  1023
Pot Level:  220 Pot Value:  1023
Pot Level:  230 Pot Value:  1023
Pot Level:  240 Pot Value:  1022
Pot Level:  250 Pot Value:  1023

Perhaps I have ruined the potentiometer with my tinkering.
« Last Edit: January 31, 2011, 04:41:54 pm by Daanii » Logged

Northern California (by San Francisco)
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I do seem to be getting repeatable responses. The potentiometer does not seem to have been ruined.

I'm thinking that my SPI codes may be incorrect. I'm supposed to send 10-bit commands. Perhaps by sending them as two 8-bit words I am screwing up the order of the bits.

I'm not able to experiment further right now, but will later. Maybe better luck then.
Logged

Northern California (by San Francisco)
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Found the problem. The chip has a not-SHTDWN pin that needs to be connected high. Works fine now. Next time I'll read the datasheet a little more thoroughly.
Logged

Pages: [1]   Go Up
Jump to: