1024-Position Digital Potentiometer
AD5235.cpp@0:6fed6c6c82b4, 2016-07-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |