1024-Position Digital Potentiometer

Committer:
gvi70000
Date:
Tue Jul 26 10:49:57 2016 +0000
Revision:
0:6fed6c6c82b4
AD5235 - 1024-Position Digital Potentiometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gvi70000 0:6fed6c6c82b4 1 #include <mbed.h>
gvi70000 0:6fed6c6c82b4 2 #include "AD5235.h"
gvi70000 0:6fed6c6c82b4 3
gvi70000 0:6fed6c6c82b4 4 AD5235::AD5235(SPI& _spi, PinName _cs) : spi(_spi), cs(_cs)
gvi70000 0:6fed6c6c82b4 5 {
gvi70000 0:6fed6c6c82b4 6 spi.format(8,0);
gvi70000 0:6fed6c6c82b4 7 spi.frequency(1000000);
gvi70000 0:6fed6c6c82b4 8 }
gvi70000 0:6fed6c6c82b4 9
gvi70000 0:6fed6c6c82b4 10
gvi70000 0:6fed6c6c82b4 11 //1 - Restore EEMEM (A0) contents to RDAC (A0) register. See Table 16.
gvi70000 0:6fed6c6c82b4 12 void AD5235::storeEEMEM2RDAC(uint8_t w)
gvi70000 0:6fed6c6c82b4 13 {
gvi70000 0:6fed6c6c82b4 14 transferData(0x10 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 15 }
gvi70000 0:6fed6c6c82b4 16 //2 - Store wiper setting. Store RDAC (A0) setting to EEMEM (A0). See Table 15. - Use a delay of 50ms!!!
gvi70000 0:6fed6c6c82b4 17 void AD5235::storeRDAC2EEMEM(uint8_t w)
gvi70000 0:6fed6c6c82b4 18 {
gvi70000 0:6fed6c6c82b4 19 transferData(0x20 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 20 }
gvi70000 0:6fed6c6c82b4 21 //3 - Store contents of Serial Register Data Byte 0 and Serial Register Data Bytes 1 (total 16 bits) to EEMEM (ADDR). See Table 18.
gvi70000 0:6fed6c6c82b4 22 //Use a delay of 50ms!!!/RDAC1 is 0, RDAC2 is 1, User1 is 2....User13 is 14
gvi70000 0:6fed6c6c82b4 23 void AD5235::setEEMEM(uint8_t w, uint16_t v)
gvi70000 0:6fed6c6c82b4 24 {
gvi70000 0:6fed6c6c82b4 25 transferData(0x30 + w, v);
gvi70000 0:6fed6c6c82b4 26 }
gvi70000 0:6fed6c6c82b4 27 //4 - Decrement by 6 dB. Right-shift contents of RDAC (A0) register, stop at all 0s.
gvi70000 0:6fed6c6c82b4 28 void AD5235::stepDown6Db(uint8_t w)
gvi70000 0:6fed6c6c82b4 29 {
gvi70000 0:6fed6c6c82b4 30 transferData(0x40 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 31 }
gvi70000 0:6fed6c6c82b4 32 //5 - Decrement all by 6 dB. Right-shift contents of all RDAC registers, stop at all 0s.
gvi70000 0:6fed6c6c82b4 33 void AD5235::stepDownAll6Db(void)
gvi70000 0:6fed6c6c82b4 34 {
gvi70000 0:6fed6c6c82b4 35 transferData(0x50 , CMD_NOP);
gvi70000 0:6fed6c6c82b4 36 }
gvi70000 0:6fed6c6c82b4 37 //6 - Decrement contents of RDAC (A0) by 1, stop at all 0s.
gvi70000 0:6fed6c6c82b4 38 void AD5235::stepDown1(uint8_t w)
gvi70000 0:6fed6c6c82b4 39 {
gvi70000 0:6fed6c6c82b4 40 transferData(0x60 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 41 }
gvi70000 0:6fed6c6c82b4 42 //7 - Decrement contents of all RDAC registers by 1, stop at all 0s.
gvi70000 0:6fed6c6c82b4 43 void AD5235::stepDown1All(void)
gvi70000 0:6fed6c6c82b4 44 {
gvi70000 0:6fed6c6c82b4 45 transferData(0x70, CMD_NOP);
gvi70000 0:6fed6c6c82b4 46 }
gvi70000 0:6fed6c6c82b4 47 //8 - Reset. Refresh all RDACs with their corresponding EEMEM previously stored values. - Use a delay of 30us!!!
gvi70000 0:6fed6c6c82b4 48 void AD5235::refreshAllRDAC(void)
gvi70000 0:6fed6c6c82b4 49 {
gvi70000 0:6fed6c6c82b4 50 transferData(0x80, CMD_NOP);
gvi70000 0:6fed6c6c82b4 51 }
gvi70000 0:6fed6c6c82b4 52 //9 - Read contents of EEMEM (ADDR) from SDO output in the next frame. See Table 19. - Use a delay of 30us!!!
gvi70000 0:6fed6c6c82b4 53 uint16_t AD5235::getEEMEM(uint8_t w)
gvi70000 0:6fed6c6c82b4 54 {
gvi70000 0:6fed6c6c82b4 55 transferData(0x90 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 56 wait_us(30);
gvi70000 0:6fed6c6c82b4 57 return transferData(CMD_NOP, CMD_NOP);
gvi70000 0:6fed6c6c82b4 58 }
gvi70000 0:6fed6c6c82b4 59 //10 - Read RDAC wiper setting from SDO output in the next frame. See Table 20. - Use a delay of 30us!!!
gvi70000 0:6fed6c6c82b4 60 uint16_t AD5235::getWiper(uint8_t w)
gvi70000 0:6fed6c6c82b4 61 {
gvi70000 0:6fed6c6c82b4 62 transferData(0xA0 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 63 wait_us(30);
gvi70000 0:6fed6c6c82b4 64 return transferData(CMD_NOP, CMD_NOP);
gvi70000 0:6fed6c6c82b4 65 }
gvi70000 0:6fed6c6c82b4 66 //11 - Write contents of Serial Register Data Byte 0 and Serial Register Data Byte 1 (total 10 bits) to RDAC (A0). See Table 14.
gvi70000 0:6fed6c6c82b4 67 void AD5235::setWiper(uint8_t w, uint16_t v)
gvi70000 0:6fed6c6c82b4 68 {
gvi70000 0:6fed6c6c82b4 69 transferData(0xB0 + w, v);
gvi70000 0:6fed6c6c82b4 70 }
gvi70000 0:6fed6c6c82b4 71 //12 - Increment by 6 dB: Left-shift contents of RDAC (A0),stop at all 1s. See Table 17.
gvi70000 0:6fed6c6c82b4 72 void stepUp6Db(uint8_t w)
gvi70000 0:6fed6c6c82b4 73 {
gvi70000 0:6fed6c6c82b4 74 //transferData(0xC0, CMD_NOP);
gvi70000 0:6fed6c6c82b4 75 }
gvi70000 0:6fed6c6c82b4 76 //13 - Increment all by 6 dB. Left-shift contents of all RDAC registers, stop at all 1s.
gvi70000 0:6fed6c6c82b4 77 void AD5235::stepUpAll6Db(void)
gvi70000 0:6fed6c6c82b4 78 {
gvi70000 0:6fed6c6c82b4 79 transferData(0xD0, CMD_NOP);
gvi70000 0:6fed6c6c82b4 80 }
gvi70000 0:6fed6c6c82b4 81 //14 - Increment contents of RDAC (A0) by 1, stop at all 1s. See Table 15.
gvi70000 0:6fed6c6c82b4 82 void AD5235::stepUp1(uint8_t w)
gvi70000 0:6fed6c6c82b4 83 {
gvi70000 0:6fed6c6c82b4 84 transferData(0xE0 + w, CMD_NOP);
gvi70000 0:6fed6c6c82b4 85 }
gvi70000 0:6fed6c6c82b4 86 //15 - Increment contents of all RDAC registers by 1, stop at all 1s.
gvi70000 0:6fed6c6c82b4 87 void AD5235::stepUp1All(void)
gvi70000 0:6fed6c6c82b4 88 {
gvi70000 0:6fed6c6c82b4 89 transferData(0xF0, CMD_NOP);
gvi70000 0:6fed6c6c82b4 90 }
gvi70000 0:6fed6c6c82b4 91 //16 - See page 21 in manual Another subtle feature of the AD5235 is that a subsequent CS strobe, without clock and data, repeats a previous command
gvi70000 0:6fed6c6c82b4 92 void AD5235::repeatCMD(void)
gvi70000 0:6fed6c6c82b4 93 {
gvi70000 0:6fed6c6c82b4 94 cs = 0;
gvi70000 0:6fed6c6c82b4 95 cs = 1;
gvi70000 0:6fed6c6c82b4 96 }
gvi70000 0:6fed6c6c82b4 97
gvi70000 0:6fed6c6c82b4 98 float AD5235::getTolerance()
gvi70000 0:6fed6c6c82b4 99 {
gvi70000 0:6fed6c6c82b4 100 float tol = getEEMEM(15);
gvi70000 0:6fed6c6c82b4 101 int8_t b_1 = ((uint16_t)tol >> 8);
gvi70000 0:6fed6c6c82b4 102 int8_t b_0 = ((uint16_t)tol & 0xFF);
gvi70000 0:6fed6c6c82b4 103 if(b_1 > 127) //check if first bit in b_1 is 1
gvi70000 0:6fed6c6c82b4 104 b_1 -= 128;
gvi70000 0:6fed6c6c82b4 105 else
gvi70000 0:6fed6c6c82b4 106 b_1 = -b_1;
gvi70000 0:6fed6c6c82b4 107 for(uint8_t p = 0; p < 8; p++)
gvi70000 0:6fed6c6c82b4 108 {
gvi70000 0:6fed6c6c82b4 109 if((b_0 >> p) & 1)//check if but in position p is 1
gvi70000 0:6fed6c6c82b4 110 {
gvi70000 0:6fed6c6c82b4 111 tol =(float)b_1 + (float)b_0/ (float)(2 << p);//add the decimal part of the tolerance
gvi70000 0:6fed6c6c82b4 112 break;
gvi70000 0:6fed6c6c82b4 113 }
gvi70000 0:6fed6c6c82b4 114 }
gvi70000 0:6fed6c6c82b4 115 return tol;
gvi70000 0:6fed6c6c82b4 116 }
gvi70000 0:6fed6c6c82b4 117
gvi70000 0:6fed6c6c82b4 118 uint16_t AD5235::transferData(uint8_t cmd, uint16_t val)
gvi70000 0:6fed6c6c82b4 119 {
gvi70000 0:6fed6c6c82b4 120 uint8_t bytes[1];
gvi70000 0:6fed6c6c82b4 121 cs = 0;
gvi70000 0:6fed6c6c82b4 122 bytes[0] = spi.write(cmd);
gvi70000 0:6fed6c6c82b4 123 bytes[0] = spi.write(val >> 8);
gvi70000 0:6fed6c6c82b4 124 bytes[1] = spi.write(val & 0xFF);
gvi70000 0:6fed6c6c82b4 125 cs = 1;
gvi70000 0:6fed6c6c82b4 126 return (uint16_t)(bytes[0] << 8) + bytes[1];
gvi70000 0:6fed6c6c82b4 127 }