Digitales Potentiometer
Verwendete Pin-Nummern findet man unter hardware/arduino/variants
z.B: für das Board Duemilanove: SS = 10 (Chip-Select), MOSI = 11 (Master Out/Slave In),MISO=12, SCK = 13
MCP 4151-104E/P
http://pdf1.alldatasheet.com/datasheet-pdf/view/305851/MICROCHIP/MCP4151T.html
Wahl des R1: 1kOhm (10kOhm war zu hochhohmig, konnte den internen Pullup im MCP41X1 nicht überschreiben; je niederohmiger desto schneller wird der Bus
Fritzing-Verdrahtungsplan; Achtung: Pin A vom MCP4151 sollte auf VCC und Pin B auf GND verdrahtet werden, hier sinkt bei steigendem Digital-Wert die Spannung am Wiper Ausgang. Der Widerstandswert mit 10k ist zu hoch: es gelingt damit nicht, gegen den inneren Pullup den Pegel auf Null zu ziehen.
/* kner 2013 MCP4151 Digital Poti Pin 5(A) - Full Scale End - connect this to VDD Pin 6(W) - wiper - connet to Analog In A0 Pin 7(B) - GND Pin 1(CS) - arduino pin 10 (SS pin) Pin 3(SDI/SDO) - arduino pin 11 (MOSI pin) via resistor for writing to poti Pin 3(SDI/SDO) - arduino pin 12 (MISO pin) direct for reading from poti Pin 2(SCK) - arduino pin 13 (SCK pin) data frame increment: 1 byte 0000 0100 decrement: 1 byte 0000 1000 write value: 2byte 0000 00dd dddd dddd values from 0x00 to 0x100 read status register (address 5): 2 byte 0101 1100 xxxx xxdx - bit 1 = hardware shutdown bit; a shutdown disconnects pin A and sets the wiper to B tcon register (address 4): can connect/disconnect terminals(A,B,W) and hardware-shutdown(HW) the device 9 bits: 1 1111 R0HW-R0A-R0W-R0B bit 8 - bit 4 not used/ to shutdown: 0000 0001 1111 0111 (bit 9 is not used) to disconnect A: 111111011 */ // inslude the SPI library: #include <SPI.h> #include <avr/io.h> // set pin 10 as the slave select for the digital pot: const int slaveSelectPin = 10; void setup() { Serial.begin(9600); pinMode (slaveSelectPin, OUTPUT); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV128); //depends on resistors } void loop() { Serial.print("Max: "); //after POR: wiper is in the middle digitalPotWrite(0x100); //Maximum Serial.println(analogRead(A0)); delay(3000); //Shutdown output should be 0 Serial.print("Shutdown:"); digitalPotWrite16Bit(0x40F7); Serial.println(analogRead(A0)); Serial.print("Status:"); Serial.println(digitalPotReadControlregister(),HEX); // did it work? // i am not successful in reading register 5 (Status Register) //reactivate after Shutdown Serial.print("Finish shutdown:"); digitalPotWrite16Bit(0x40FF); Serial.println(digitalPotReadControlregister(),HEX); Serial.print("Min: "); digitalPotWrite(0x0); //Minimum Serial.println(analogRead(A0)); delay(3000); Serial.println("inc: "); for (int level = 0; level < 257; level++) { digitalPotInc(); Serial.println(analogRead(A0)); delay(10); } Serial.println("dec: "); //decrement for (int level = 0; level < 257; level++) { digitalPotDec(); Serial.println(analogRead(A0)); delay(10); } Serial.println("inc level: "); for (int level = 0; level < 257; level++) { digitalPotWrite(level); Serial.println(analogRead(A0)); delay(10); } Serial.println("dec level: "); for (int level = 257; level >0; level--) { digitalPotWrite(level); Serial.println(analogRead(A0)); delay(1); } while(1); } void digitalPotInc() { digitalWrite(slaveSelectPin,LOW); SPI.transfer(4); digitalWrite(slaveSelectPin,HIGH); } void digitalPotDec() { digitalWrite(slaveSelectPin,LOW); SPI.transfer(8); digitalWrite(slaveSelectPin,HIGH); } void digitalPotWrite(int value) { digitalWrite(slaveSelectPin,LOW); SPI.transfer((value>>8)&0b00000001); //high byte least significant bit SPI.transfer(value & 0xff); digitalWrite(slaveSelectPin,HIGH); } void digitalPotWrite16Bit(int value) { digitalWrite(slaveSelectPin,LOW); SPI.transfer(value>>8); //the short way also works SPI.transfer(value); digitalWrite(slaveSelectPin,HIGH); } uint16_t digitalPotReadControlregister() { digitalWrite(slaveSelectPin,LOW); int highbyte = SPI.transfer(0x4F); int lowbyte = SPI.transfer(0xFF); digitalWrite(slaveSelectPin,HIGH); return highbyte*256+lowbyte; }