ADS1256 program
ADS1256.cpp@0:897d3bb0accd, 2017-12-01 (annotated)
- Committer:
- laserdad
- Date:
- Fri Dec 01 21:31:48 2017 +0000
- Revision:
- 0:897d3bb0accd
last known version;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
laserdad | 0:897d3bb0accd | 1 | #include "ADS1256.h" |
laserdad | 0:897d3bb0accd | 2 | |
laserdad | 0:897d3bb0accd | 3 | extern Serial pc; |
laserdad | 0:897d3bb0accd | 4 | |
laserdad | 0:897d3bb0accd | 5 | ADS1256::ADS1256(SPI *spi_itf, DigitalIn *nrdy_pin, DigitalOut *cs_pin) |
laserdad | 0:897d3bb0accd | 6 | { |
laserdad | 0:897d3bb0accd | 7 | spi = spi_itf; |
laserdad | 0:897d3bb0accd | 8 | cs = cs_pin; |
laserdad | 0:897d3bb0accd | 9 | nrdy = nrdy_pin; |
laserdad | 0:897d3bb0accd | 10 | *cs = 1; // Assert CS high |
laserdad | 0:897d3bb0accd | 11 | setSpi(); |
laserdad | 0:897d3bb0accd | 12 | scanMode = 1; |
laserdad | 0:897d3bb0accd | 13 | gain = 0; /* GAIN */ |
laserdad | 0:897d3bb0accd | 14 | dataRate = 15; /* DATA output speed*/ |
laserdad | 0:897d3bb0accd | 15 | buffer_en = 1; |
laserdad | 0:897d3bb0accd | 16 | channel=0; |
laserdad | 0:897d3bb0accd | 17 | getMaxWaitDelay_us(); |
laserdad | 0:897d3bb0accd | 18 | }; |
laserdad | 0:897d3bb0accd | 19 | |
laserdad | 0:897d3bb0accd | 20 | uint8_t ADS1256::getGainVal(void) |
laserdad | 0:897d3bb0accd | 21 | { |
laserdad | 0:897d3bb0accd | 22 | return (1<<gain); //e.g. 1,2,4,8,16,32,64 |
laserdad | 0:897d3bb0accd | 23 | } |
laserdad | 0:897d3bb0accd | 24 | |
laserdad | 0:897d3bb0accd | 25 | |
laserdad | 0:897d3bb0accd | 26 | void ADS1256::setSpi(void) |
laserdad | 0:897d3bb0accd | 27 | { |
laserdad | 0:897d3bb0accd | 28 | spi->format(8, ADS1256_SPI_MODE); |
laserdad | 0:897d3bb0accd | 29 | spi->frequency(1800000); |
laserdad | 0:897d3bb0accd | 30 | } |
laserdad | 0:897d3bb0accd | 31 | |
laserdad | 0:897d3bb0accd | 32 | |
laserdad | 0:897d3bb0accd | 33 | |
laserdad | 0:897d3bb0accd | 34 | /* |
laserdad | 0:897d3bb0accd | 35 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 36 | * name: CfgADC |
laserdad | 0:897d3bb0accd | 37 | * function: The configuration parameters of ADC gain, data rate and internal buffer; |
laserdad | 0:897d3bb0accd | 38 | * parameter: gain: 0-5 (1-64) |
laserdad | 0:897d3bb0accd | 39 | * dataRate: 0-16 (2.5-30000 sps) |
laserdad | 0:897d3bb0accd | 40 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 41 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 42 | */ |
laserdad | 0:897d3bb0accd | 43 | void ADS1256::cfgADC(void) |
laserdad | 0:897d3bb0accd | 44 | { |
laserdad | 0:897d3bb0accd | 45 | static const uint8_t s_tabDataRate[16] = |
laserdad | 0:897d3bb0accd | 46 | { |
laserdad | 0:897d3bb0accd | 47 | 0x03, |
laserdad | 0:897d3bb0accd | 48 | 0x13, |
laserdad | 0:897d3bb0accd | 49 | 0x20, |
laserdad | 0:897d3bb0accd | 50 | 0x33, |
laserdad | 0:897d3bb0accd | 51 | 0x43, |
laserdad | 0:897d3bb0accd | 52 | 0x53, |
laserdad | 0:897d3bb0accd | 53 | 0x63, |
laserdad | 0:897d3bb0accd | 54 | 0x72, |
laserdad | 0:897d3bb0accd | 55 | 0x82, |
laserdad | 0:897d3bb0accd | 56 | 0x92, |
laserdad | 0:897d3bb0accd | 57 | 0xA1, |
laserdad | 0:897d3bb0accd | 58 | 0xB0, |
laserdad | 0:897d3bb0accd | 59 | 0xC0, |
laserdad | 0:897d3bb0accd | 60 | 0xD0, |
laserdad | 0:897d3bb0accd | 61 | 0xE0, |
laserdad | 0:897d3bb0accd | 62 | 0xF0 /*reset value */ |
laserdad | 0:897d3bb0accd | 63 | }; |
laserdad | 0:897d3bb0accd | 64 | |
laserdad | 0:897d3bb0accd | 65 | waitDRDY(); |
laserdad | 0:897d3bb0accd | 66 | |
laserdad | 0:897d3bb0accd | 67 | |
laserdad | 0:897d3bb0accd | 68 | uint8_t buf[4]; /* Storage ads1256 register configuration parameters */ |
laserdad | 0:897d3bb0accd | 69 | |
laserdad | 0:897d3bb0accd | 70 | /*Status register define |
laserdad | 0:897d3bb0accd | 71 | Bits 7-4 ID3, ID2, ID1, ID0 Factory Programmed Identification Bits (Read Only) |
laserdad | 0:897d3bb0accd | 72 | |
laserdad | 0:897d3bb0accd | 73 | Bit 3 ORDER: Data Output Bit Order |
laserdad | 0:897d3bb0accd | 74 | 0 = Most Significant Bit First (default) |
laserdad | 0:897d3bb0accd | 75 | 1 = Least Significant Bit First |
laserdad | 0:897d3bb0accd | 76 | Input data is always shifted in most significant byte and bit first. Output data is always shifted out most significant |
laserdad | 0:897d3bb0accd | 77 | byte first. The ORDER bit only controls the bit order of the output data within the byte. |
laserdad | 0:897d3bb0accd | 78 | |
laserdad | 0:897d3bb0accd | 79 | Bit 2 ACAL : Auto-Calibration |
laserdad | 0:897d3bb0accd | 80 | 0 = Auto-Calibration Disabled (default) |
laserdad | 0:897d3bb0accd | 81 | 1 = Auto-Calibration Enabled |
laserdad | 0:897d3bb0accd | 82 | When Auto-Calibration is enabled, self-calibration begins at the completion of the WREG command that changes |
laserdad | 0:897d3bb0accd | 83 | the PGA (bits 0-2 of ADCON register), DR (bits 7-0 in the DRATE register) or BUFEN (bit 1 in the STATUS register) |
laserdad | 0:897d3bb0accd | 84 | values. |
laserdad | 0:897d3bb0accd | 85 | |
laserdad | 0:897d3bb0accd | 86 | Bit 1 BUFEN: Analog Input Buffer Enable |
laserdad | 0:897d3bb0accd | 87 | 0 = Buffer Disabled (default) |
laserdad | 0:897d3bb0accd | 88 | 1 = Buffer Enabled |
laserdad | 0:897d3bb0accd | 89 | |
laserdad | 0:897d3bb0accd | 90 | Bit 0 DRDY : Data Ready (Read Only) |
laserdad | 0:897d3bb0accd | 91 | This bit duplicates the state of the DRDY pin. |
laserdad | 0:897d3bb0accd | 92 | |
laserdad | 0:897d3bb0accd | 93 | ACAL=1 enable calibration |
laserdad | 0:897d3bb0accd | 94 | */ |
laserdad | 0:897d3bb0accd | 95 | buf[0] = (0 << 3) | (1 << 2) | ( (buffer_en & 0x01) << 1);//enable the internal buffer |
laserdad | 0:897d3bb0accd | 96 | // buf[0] = (0 << 3) | (1 << 2) | (0 << 1); // The internal buffer is prohibited |
laserdad | 0:897d3bb0accd | 97 | |
laserdad | 0:897d3bb0accd | 98 | //WriteReg(REG_STATUS, (0 << 3) | (1 << 2) | (1 << 1)); |
laserdad | 0:897d3bb0accd | 99 | |
laserdad | 0:897d3bb0accd | 100 | buf[1] = 0x08; |
laserdad | 0:897d3bb0accd | 101 | |
laserdad | 0:897d3bb0accd | 102 | /* ADCON: A/D Control Register (Address 02h) |
laserdad | 0:897d3bb0accd | 103 | Bit 7 Reserved, always 0 (Read Only) |
laserdad | 0:897d3bb0accd | 104 | Bits 6-5 CLK1, CLK0 : D0/CLKOUT Clock Out Rate Setting |
laserdad | 0:897d3bb0accd | 105 | 00 = Clock Out OFF |
laserdad | 0:897d3bb0accd | 106 | 01 = Clock Out Frequency = fCLKIN (default) |
laserdad | 0:897d3bb0accd | 107 | 10 = Clock Out Frequency = fCLKIN/2 |
laserdad | 0:897d3bb0accd | 108 | 11 = Clock Out Frequency = fCLKIN/4 |
laserdad | 0:897d3bb0accd | 109 | When not using CLKOUT, it is recommended that it be turned off. These bits can only be reset using the RESET pin. |
laserdad | 0:897d3bb0accd | 110 | |
laserdad | 0:897d3bb0accd | 111 | Bits 4-3 SDCS1, SCDS0: Sensor Detect Current Sources |
laserdad | 0:897d3bb0accd | 112 | 00 = Sensor Detect OFF (default) |
laserdad | 0:897d3bb0accd | 113 | 01 = Sensor Detect Current = 0.5 ¦Ì A |
laserdad | 0:897d3bb0accd | 114 | 10 = Sensor Detect Current = 2 ¦Ì A |
laserdad | 0:897d3bb0accd | 115 | 11 = Sensor Detect Current = 10¦Ì A |
laserdad | 0:897d3bb0accd | 116 | The Sensor Detect Current Sources can be activated to verify the integrity of an external sensor supplying a signal to the |
laserdad | 0:897d3bb0accd | 117 | ADS1255/6. A shorted sensor produces a very small signal while an open-circuit sensor produces a very large signal. |
laserdad | 0:897d3bb0accd | 118 | |
laserdad | 0:897d3bb0accd | 119 | Bits 2-0 PGA2, PGA1, PGA0: Programmable Gain Amplifier Setting |
laserdad | 0:897d3bb0accd | 120 | 000 = 1 (default) |
laserdad | 0:897d3bb0accd | 121 | 001 = 2 |
laserdad | 0:897d3bb0accd | 122 | 010 = 4 |
laserdad | 0:897d3bb0accd | 123 | 011 = 8 |
laserdad | 0:897d3bb0accd | 124 | 100 = 16 |
laserdad | 0:897d3bb0accd | 125 | 101 = 32 |
laserdad | 0:897d3bb0accd | 126 | 110 = 64 |
laserdad | 0:897d3bb0accd | 127 | 111 = 64 |
laserdad | 0:897d3bb0accd | 128 | */ |
laserdad | 0:897d3bb0accd | 129 | buf[2] = (0 << 5) | (0 << 3) | ( (gain & 0x07) << 0); |
laserdad | 0:897d3bb0accd | 130 | //WriteReg(REG_ADCON, (0 << 5) | (0 << 2) | (GAIN_1 << 1)); /*choose 1: gain 1 ;input 5V/ |
laserdad | 0:897d3bb0accd | 131 | buf[3] = s_tabDataRate[dataRate]; // DRATE_10SPS; |
laserdad | 0:897d3bb0accd | 132 | |
laserdad | 0:897d3bb0accd | 133 | *cs = 0; /* SPICS¡ = 0 */ |
laserdad | 0:897d3bb0accd | 134 | spi->write(CMD_WREG | 0); /* Write command register, send the register address */ |
laserdad | 0:897d3bb0accd | 135 | spi->write(0x03); /* Register number 4,Initialize the number -1*/ |
laserdad | 0:897d3bb0accd | 136 | |
laserdad | 0:897d3bb0accd | 137 | spi->write(buf[0]); /* Set the status register */ |
laserdad | 0:897d3bb0accd | 138 | spi->write(buf[1]); /* Set the input channel parameters */ |
laserdad | 0:897d3bb0accd | 139 | spi->write(buf[2]); /* Set the ADCON control register,gain */ |
laserdad | 0:897d3bb0accd | 140 | spi->write(buf[3]); /* Set the output rate */ |
laserdad | 0:897d3bb0accd | 141 | |
laserdad | 0:897d3bb0accd | 142 | *cs =1; /* SPI cs = 1 */ |
laserdad | 0:897d3bb0accd | 143 | |
laserdad | 0:897d3bb0accd | 144 | |
laserdad | 0:897d3bb0accd | 145 | wait_us(50); |
laserdad | 0:897d3bb0accd | 146 | getMaxWaitDelay_us(); |
laserdad | 0:897d3bb0accd | 147 | } |
laserdad | 0:897d3bb0accd | 148 | |
laserdad | 0:897d3bb0accd | 149 | |
laserdad | 0:897d3bb0accd | 150 | /* |
laserdad | 0:897d3bb0accd | 151 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 152 | * name: DelayDATA |
laserdad | 0:897d3bb0accd | 153 | * function: delay |
laserdad | 0:897d3bb0accd | 154 | * parameter: NULL |
laserdad | 0:897d3bb0accd | 155 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 156 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 157 | */ |
laserdad | 0:897d3bb0accd | 158 | void ADS1256::delayDATA(void) |
laserdad | 0:897d3bb0accd | 159 | { |
laserdad | 0:897d3bb0accd | 160 | /* |
laserdad | 0:897d3bb0accd | 161 | Delay from last SCLK edge for DIN to first SCLK rising edge for DOUT: RDATA, RDATAC,RREG Commands |
laserdad | 0:897d3bb0accd | 162 | min 50 CLK = 50 * 0.13uS = 6.5uS |
laserdad | 0:897d3bb0accd | 163 | */ |
laserdad | 0:897d3bb0accd | 164 | wait_us(10); /* The minimum time delay 6.5us */ |
laserdad | 0:897d3bb0accd | 165 | } |
laserdad | 0:897d3bb0accd | 166 | |
laserdad | 0:897d3bb0accd | 167 | |
laserdad | 0:897d3bb0accd | 168 | |
laserdad | 0:897d3bb0accd | 169 | |
laserdad | 0:897d3bb0accd | 170 | /* |
laserdad | 0:897d3bb0accd | 171 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 172 | * name: WriteReg |
laserdad | 0:897d3bb0accd | 173 | * function: Write the corresponding register |
laserdad | 0:897d3bb0accd | 174 | * parameter: _RegID: register ID |
laserdad | 0:897d3bb0accd | 175 | * _RegValue: register Value |
laserdad | 0:897d3bb0accd | 176 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 177 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 178 | */ |
laserdad | 0:897d3bb0accd | 179 | void ADS1256::writeReg(uint8_t _RegID, uint8_t _RegValue) |
laserdad | 0:897d3bb0accd | 180 | { |
laserdad | 0:897d3bb0accd | 181 | *cs = 0; /* SPI cs = 0 */ |
laserdad | 0:897d3bb0accd | 182 | spi->write(CMD_WREG | _RegID); /*Write command register */ |
laserdad | 0:897d3bb0accd | 183 | spi->write(0x00); /*Write the register number */ |
laserdad | 0:897d3bb0accd | 184 | |
laserdad | 0:897d3bb0accd | 185 | spi->write(_RegValue); /*send register value */ |
laserdad | 0:897d3bb0accd | 186 | *cs =1; /* SPI cs = 1 */ |
laserdad | 0:897d3bb0accd | 187 | } |
laserdad | 0:897d3bb0accd | 188 | |
laserdad | 0:897d3bb0accd | 189 | /* |
laserdad | 0:897d3bb0accd | 190 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 191 | * name: ReadReg |
laserdad | 0:897d3bb0accd | 192 | * function: readVal the corresponding register |
laserdad | 0:897d3bb0accd | 193 | * parameter: _RegID: register ID |
laserdad | 0:897d3bb0accd | 194 | * The return value: read register value |
laserdad | 0:897d3bb0accd | 195 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 196 | */ |
laserdad | 0:897d3bb0accd | 197 | uint8_t ADS1256::readReg(uint8_t _RegID) |
laserdad | 0:897d3bb0accd | 198 | { |
laserdad | 0:897d3bb0accd | 199 | uint8_t readVal; |
laserdad | 0:897d3bb0accd | 200 | |
laserdad | 0:897d3bb0accd | 201 | *cs = 0; /* SPI cs = 0 */ |
laserdad | 0:897d3bb0accd | 202 | spi->write(CMD_RREG | _RegID); /* Write command register */ |
laserdad | 0:897d3bb0accd | 203 | spi->write(0x00); /* Write the register number */ |
laserdad | 0:897d3bb0accd | 204 | |
laserdad | 0:897d3bb0accd | 205 | |
laserdad | 0:897d3bb0accd | 206 | delayDATA(); /*delay time */ |
laserdad | 0:897d3bb0accd | 207 | |
laserdad | 0:897d3bb0accd | 208 | readVal = spi->write(0); /* Read the register values */ |
laserdad | 0:897d3bb0accd | 209 | *cs =1; /* SPI cs = 1 */ |
laserdad | 0:897d3bb0accd | 210 | |
laserdad | 0:897d3bb0accd | 211 | return readVal; |
laserdad | 0:897d3bb0accd | 212 | } |
laserdad | 0:897d3bb0accd | 213 | |
laserdad | 0:897d3bb0accd | 214 | /* |
laserdad | 0:897d3bb0accd | 215 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 216 | * name: WriteCmd |
laserdad | 0:897d3bb0accd | 217 | * function: Sending a single byte order |
laserdad | 0:897d3bb0accd | 218 | * parameter: _cmd : command |
laserdad | 0:897d3bb0accd | 219 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 220 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 221 | */ |
laserdad | 0:897d3bb0accd | 222 | void ADS1256::writeCmd(uint8_t _cmd) |
laserdad | 0:897d3bb0accd | 223 | { |
laserdad | 0:897d3bb0accd | 224 | *cs = 0; /* SPI cs = 0 */ |
laserdad | 0:897d3bb0accd | 225 | spi->write(_cmd); |
laserdad | 0:897d3bb0accd | 226 | *cs =1; /* SPI cs = 1 */ |
laserdad | 0:897d3bb0accd | 227 | } |
laserdad | 0:897d3bb0accd | 228 | |
laserdad | 0:897d3bb0accd | 229 | /* |
laserdad | 0:897d3bb0accd | 230 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 231 | * name: ReadChipID |
laserdad | 0:897d3bb0accd | 232 | * function: Read the chip ID |
laserdad | 0:897d3bb0accd | 233 | * parameter: _cmd : NULL |
laserdad | 0:897d3bb0accd | 234 | * The return value: four high status register |
laserdad | 0:897d3bb0accd | 235 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 236 | */ |
laserdad | 0:897d3bb0accd | 237 | uint8_t ADS1256::readChipID(void) |
laserdad | 0:897d3bb0accd | 238 | { |
laserdad | 0:897d3bb0accd | 239 | uint8_t id; |
laserdad | 0:897d3bb0accd | 240 | |
laserdad | 0:897d3bb0accd | 241 | //waitDRDY(); |
laserdad | 0:897d3bb0accd | 242 | id = readReg(REG_STATUS); |
laserdad | 0:897d3bb0accd | 243 | #ifdef DEBUG |
laserdad | 0:897d3bb0accd | 244 | pc.printf("id = %02x\r\n", id); |
laserdad | 0:897d3bb0accd | 245 | #endif |
laserdad | 0:897d3bb0accd | 246 | return (id >> 4); |
laserdad | 0:897d3bb0accd | 247 | } |
laserdad | 0:897d3bb0accd | 248 | |
laserdad | 0:897d3bb0accd | 249 | /* |
laserdad | 0:897d3bb0accd | 250 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 251 | * name: Setchannel |
laserdad | 0:897d3bb0accd | 252 | * function: Configuration channel number |
laserdad | 0:897d3bb0accd | 253 | * parameter: channel: channel number 0--7 |
laserdad | 0:897d3bb0accd | 254 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 255 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 256 | */ |
laserdad | 0:897d3bb0accd | 257 | void ADS1256::setChannel() |
laserdad | 0:897d3bb0accd | 258 | { |
laserdad | 0:897d3bb0accd | 259 | /* |
laserdad | 0:897d3bb0accd | 260 | Bits 7-4 PSEL3, PSEL2, PSEL1, PSEL0: Positive Input channel (AINP) Select |
laserdad | 0:897d3bb0accd | 261 | 0000 = AIN0 (default) |
laserdad | 0:897d3bb0accd | 262 | 0001 = AIN1 |
laserdad | 0:897d3bb0accd | 263 | 0010 = AIN2 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 264 | 0011 = AIN3 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 265 | 0100 = AIN4 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 266 | 0101 = AIN5 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 267 | 0110 = AIN6 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 268 | 0111 = AIN7 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 269 | 1xxx = AINCOM (when PSEL3 = 1, PSEL2, PSEL1, PSEL0 are ¡°don¡¯t care¡±) |
laserdad | 0:897d3bb0accd | 270 | |
laserdad | 0:897d3bb0accd | 271 | NOTE: When using an ADS1255 make sure to only select the available inputs. |
laserdad | 0:897d3bb0accd | 272 | |
laserdad | 0:897d3bb0accd | 273 | Bits 3-0 NSEL3, NSEL2, NSEL1, NSEL0: Negative Input channel (AINN)Select |
laserdad | 0:897d3bb0accd | 274 | 0000 = AIN0 |
laserdad | 0:897d3bb0accd | 275 | 0001 = AIN1 (default) |
laserdad | 0:897d3bb0accd | 276 | 0010 = AIN2 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 277 | 0011 = AIN3 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 278 | 0100 = AIN4 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 279 | 0101 = AIN5 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 280 | 0110 = AIN6 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 281 | 0111 = AIN7 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 282 | 1xxx = AINCOM (when NSEL3 = 1, NSEL2, NSEL1, NSEL0 are ¡°don¡¯t care¡±) |
laserdad | 0:897d3bb0accd | 283 | */ |
laserdad | 0:897d3bb0accd | 284 | if( channel > 15 ) |
laserdad | 0:897d3bb0accd | 285 | { |
laserdad | 0:897d3bb0accd | 286 | return; |
laserdad | 0:897d3bb0accd | 287 | } |
laserdad | 0:897d3bb0accd | 288 | writeReg(REG_MUX, (channel << 4) | (1<<3)); /* Bit3 = 1, AINN connection AINCOM */ |
laserdad | 0:897d3bb0accd | 289 | } |
laserdad | 0:897d3bb0accd | 290 | |
laserdad | 0:897d3bb0accd | 291 | /* |
laserdad | 0:897d3bb0accd | 292 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 293 | * name: SetDiffchannel |
laserdad | 0:897d3bb0accd | 294 | * function: The configuration difference channel |
laserdad | 0:897d3bb0accd | 295 | * parameter: channel: channel number 0--3 |
laserdad | 0:897d3bb0accd | 296 | * The return value: four high status register |
laserdad | 0:897d3bb0accd | 297 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 298 | */ |
laserdad | 0:897d3bb0accd | 299 | void ADS1256::setDiffChannel() |
laserdad | 0:897d3bb0accd | 300 | { |
laserdad | 0:897d3bb0accd | 301 | /* |
laserdad | 0:897d3bb0accd | 302 | Bits 7-4 PSEL3, PSEL2, PSEL1, PSEL0: Positive Input channel (AINP) Select |
laserdad | 0:897d3bb0accd | 303 | 0000 = AIN0 (default) |
laserdad | 0:897d3bb0accd | 304 | 0001 = AIN1 |
laserdad | 0:897d3bb0accd | 305 | 0010 = AIN2 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 306 | 0011 = AIN3 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 307 | 0100 = AIN4 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 308 | 0101 = AIN5 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 309 | 0110 = AIN6 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 310 | 0111 = AIN7 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 311 | 1xxx = AINCOM (when PSEL3 = 1, PSEL2, PSEL1, PSEL0 are ¡°don¡¯t care¡±) |
laserdad | 0:897d3bb0accd | 312 | |
laserdad | 0:897d3bb0accd | 313 | NOTE: When using an ADS1255 make sure to only select the available inputs. |
laserdad | 0:897d3bb0accd | 314 | |
laserdad | 0:897d3bb0accd | 315 | Bits 3-0 NSEL3, NSEL2, NSEL1, NSEL0: Negative Input channel (AINN)Select |
laserdad | 0:897d3bb0accd | 316 | 0000 = AIN0 |
laserdad | 0:897d3bb0accd | 317 | 0001 = AIN1 (default) |
laserdad | 0:897d3bb0accd | 318 | 0010 = AIN2 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 319 | 0011 = AIN3 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 320 | 0100 = AIN4 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 321 | 0101 = AIN5 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 322 | 0110 = AIN6 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 323 | 0111 = AIN7 (ADS1256 only) |
laserdad | 0:897d3bb0accd | 324 | 1xxx = AINCOM (when NSEL3 = 1, NSEL2, NSEL1, NSEL0 are ¡°don¡¯t care¡±) |
laserdad | 0:897d3bb0accd | 325 | */ |
laserdad | 0:897d3bb0accd | 326 | |
laserdad | 0:897d3bb0accd | 327 | //use channel = 3 for strain gauge bridge |
laserdad | 0:897d3bb0accd | 328 | //use channel = 0 for Vout2 |
laserdad | 0:897d3bb0accd | 329 | //use channel = 1 for Vout1 |
laserdad | 0:897d3bb0accd | 330 | |
laserdad | 0:897d3bb0accd | 331 | if (channel == 0) |
laserdad | 0:897d3bb0accd | 332 | { |
laserdad | 0:897d3bb0accd | 333 | writeReg(REG_MUX, (0 << 4) | 1); /* Diffchannel AIN0£¬ AIN1 */ |
laserdad | 0:897d3bb0accd | 334 | } |
laserdad | 0:897d3bb0accd | 335 | else if (channel == 1) |
laserdad | 0:897d3bb0accd | 336 | { |
laserdad | 0:897d3bb0accd | 337 | writeReg(REG_MUX, (2 << 4) | 3); /*Diffchannel AIN2£¬ AIN3 */ |
laserdad | 0:897d3bb0accd | 338 | } |
laserdad | 0:897d3bb0accd | 339 | else if (channel == 2) |
laserdad | 0:897d3bb0accd | 340 | { |
laserdad | 0:897d3bb0accd | 341 | writeReg(REG_MUX, (4 << 4) | 5); /*Diffchannel AIN4£¬ AIN5 */ |
laserdad | 0:897d3bb0accd | 342 | } |
laserdad | 0:897d3bb0accd | 343 | else if (channel == 3) |
laserdad | 0:897d3bb0accd | 344 | { |
laserdad | 0:897d3bb0accd | 345 | writeReg(REG_MUX, (6 << 4) | 7); /*Diffchannel AIN6£¬ AIN7 */ |
laserdad | 0:897d3bb0accd | 346 | } |
laserdad | 0:897d3bb0accd | 347 | } |
laserdad | 0:897d3bb0accd | 348 | |
laserdad | 0:897d3bb0accd | 349 | /* |
laserdad | 0:897d3bb0accd | 350 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 351 | * name: WaitDRDY |
laserdad | 0:897d3bb0accd | 352 | * function: delay time wait for automatic calibration |
laserdad | 0:897d3bb0accd | 353 | * parameter: NULL |
laserdad | 0:897d3bb0accd | 354 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 355 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 356 | */ |
laserdad | 0:897d3bb0accd | 357 | void ADS1256::waitDRDY(void) |
laserdad | 0:897d3bb0accd | 358 | { |
laserdad | 0:897d3bb0accd | 359 | while ( nrdy->read() ); |
laserdad | 0:897d3bb0accd | 360 | } |
laserdad | 0:897d3bb0accd | 361 | |
laserdad | 0:897d3bb0accd | 362 | |
laserdad | 0:897d3bb0accd | 363 | void ADS1256::getMaxWaitDelay_us(void) |
laserdad | 0:897d3bb0accd | 364 | { |
laserdad | 0:897d3bb0accd | 365 | if(dataRate == 0x00) |
laserdad | 0:897d3bb0accd | 366 | { |
laserdad | 0:897d3bb0accd | 367 | maxWaitDelay_us = getDataRateVal_us(dataRate) + 8000; |
laserdad | 0:897d3bb0accd | 368 | } |
laserdad | 0:897d3bb0accd | 369 | else |
laserdad | 0:897d3bb0accd | 370 | { |
laserdad | 0:897d3bb0accd | 371 | maxWaitDelay_us = getDataRateVal_us(dataRate-1); |
laserdad | 0:897d3bb0accd | 372 | } |
laserdad | 0:897d3bb0accd | 373 | } |
laserdad | 0:897d3bb0accd | 374 | |
laserdad | 0:897d3bb0accd | 375 | /* |
laserdad | 0:897d3bb0accd | 376 | ***********************`********************************************************************************** |
laserdad | 0:897d3bb0accd | 377 | * name: ReadData |
laserdad | 0:897d3bb0accd | 378 | * function: read ADC value |
laserdad | 0:897d3bb0accd | 379 | * parameter: NULL |
laserdad | 0:897d3bb0accd | 380 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 381 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 382 | */ |
laserdad | 0:897d3bb0accd | 383 | int32_t ADS1256::readData(void) |
laserdad | 0:897d3bb0accd | 384 | { |
laserdad | 0:897d3bb0accd | 385 | uint32_t readVal = 0; |
laserdad | 0:897d3bb0accd | 386 | static uint8_t buf[3]; |
laserdad | 0:897d3bb0accd | 387 | |
laserdad | 0:897d3bb0accd | 388 | *cs = 0; /* SPI cs = 0 */ |
laserdad | 0:897d3bb0accd | 389 | |
laserdad | 0:897d3bb0accd | 390 | spi->write(CMD_RDATA); /* read ADC command */ |
laserdad | 0:897d3bb0accd | 391 | |
laserdad | 0:897d3bb0accd | 392 | delayDATA(); /*delay time */ |
laserdad | 0:897d3bb0accd | 393 | |
laserdad | 0:897d3bb0accd | 394 | /*Read the sample results 24bit*/ |
laserdad | 0:897d3bb0accd | 395 | buf[0] = spi->write(0); |
laserdad | 0:897d3bb0accd | 396 | buf[1] = spi->write(0); |
laserdad | 0:897d3bb0accd | 397 | buf[2] = spi->write(0); |
laserdad | 0:897d3bb0accd | 398 | |
laserdad | 0:897d3bb0accd | 399 | readVal = ((uint32_t)buf[0] << 16) & 0x00FF0000; |
laserdad | 0:897d3bb0accd | 400 | readVal |= ((uint32_t)buf[1] << 8); |
laserdad | 0:897d3bb0accd | 401 | readVal |= buf[2]; |
laserdad | 0:897d3bb0accd | 402 | |
laserdad | 0:897d3bb0accd | 403 | *cs =1; //* CS = 1 |
laserdad | 0:897d3bb0accd | 404 | /* Extend a signed number*/ |
laserdad | 0:897d3bb0accd | 405 | if (readVal & 0x800000) |
laserdad | 0:897d3bb0accd | 406 | { |
laserdad | 0:897d3bb0accd | 407 | readVal |= 0xFF000000; |
laserdad | 0:897d3bb0accd | 408 | } |
laserdad | 0:897d3bb0accd | 409 | |
laserdad | 0:897d3bb0accd | 410 | return (int32_t)readVal; |
laserdad | 0:897d3bb0accd | 411 | } |
laserdad | 0:897d3bb0accd | 412 | |
laserdad | 0:897d3bb0accd | 413 | |
laserdad | 0:897d3bb0accd | 414 | /* |
laserdad | 0:897d3bb0accd | 415 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 416 | * name: ADS1256::GetAdc |
laserdad | 0:897d3bb0accd | 417 | * function: read ADC value |
laserdad | 0:897d3bb0accd | 418 | * parameter: channel number 0--7 |
laserdad | 0:897d3bb0accd | 419 | * The return value: ADC vaule (signed number) |
laserdad | 0:897d3bb0accd | 420 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 421 | */ |
laserdad | 0:897d3bb0accd | 422 | |
laserdad | 0:897d3bb0accd | 423 | |
laserdad | 0:897d3bb0accd | 424 | /* |
laserdad | 0:897d3bb0accd | 425 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 426 | * name: ADS1256::ISR |
laserdad | 0:897d3bb0accd | 427 | * function: Collection procedures |
laserdad | 0:897d3bb0accd | 428 | * parameter: NULL |
laserdad | 0:897d3bb0accd | 429 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 430 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 431 | */ |
laserdad | 0:897d3bb0accd | 432 | void ADS1256::isr(void) |
laserdad | 0:897d3bb0accd | 433 | { |
laserdad | 0:897d3bb0accd | 434 | if (scanMode == 0) /* 0 Single-ended input 8 channel, 1 Differential input 4 channels */ |
laserdad | 0:897d3bb0accd | 435 | { |
laserdad | 0:897d3bb0accd | 436 | setChannel(); /*Switch channel mode */ |
laserdad | 0:897d3bb0accd | 437 | wait_us(5); |
laserdad | 0:897d3bb0accd | 438 | |
laserdad | 0:897d3bb0accd | 439 | writeCmd(CMD_SYNC); |
laserdad | 0:897d3bb0accd | 440 | wait_us(5); |
laserdad | 0:897d3bb0accd | 441 | |
laserdad | 0:897d3bb0accd | 442 | writeCmd(CMD_WAKEUP); |
laserdad | 0:897d3bb0accd | 443 | wait_us(25); |
laserdad | 0:897d3bb0accd | 444 | |
laserdad | 0:897d3bb0accd | 445 | if (channel == 0) |
laserdad | 0:897d3bb0accd | 446 | { |
laserdad | 0:897d3bb0accd | 447 | adcNow[7] = readData(); |
laserdad | 0:897d3bb0accd | 448 | } |
laserdad | 0:897d3bb0accd | 449 | else |
laserdad | 0:897d3bb0accd | 450 | { |
laserdad | 0:897d3bb0accd | 451 | adcNow[channel-1] = readData(); |
laserdad | 0:897d3bb0accd | 452 | } |
laserdad | 0:897d3bb0accd | 453 | |
laserdad | 0:897d3bb0accd | 454 | if (++channel >= 8) |
laserdad | 0:897d3bb0accd | 455 | { |
laserdad | 0:897d3bb0accd | 456 | channel = 0; |
laserdad | 0:897d3bb0accd | 457 | } |
laserdad | 0:897d3bb0accd | 458 | } |
laserdad | 0:897d3bb0accd | 459 | else /*Diffchannel*/ |
laserdad | 0:897d3bb0accd | 460 | { |
laserdad | 0:897d3bb0accd | 461 | |
laserdad | 0:897d3bb0accd | 462 | setDiffChannel(); /* change Diffchannel */ |
laserdad | 0:897d3bb0accd | 463 | wait_us(5); |
laserdad | 0:897d3bb0accd | 464 | |
laserdad | 0:897d3bb0accd | 465 | writeCmd(CMD_SYNC); |
laserdad | 0:897d3bb0accd | 466 | wait_us(5); |
laserdad | 0:897d3bb0accd | 467 | |
laserdad | 0:897d3bb0accd | 468 | writeCmd(CMD_WAKEUP); |
laserdad | 0:897d3bb0accd | 469 | wait_us(25); |
laserdad | 0:897d3bb0accd | 470 | |
laserdad | 0:897d3bb0accd | 471 | if (channel == 0) |
laserdad | 0:897d3bb0accd | 472 | { |
laserdad | 0:897d3bb0accd | 473 | adcNow[3] = readData(); |
laserdad | 0:897d3bb0accd | 474 | } |
laserdad | 0:897d3bb0accd | 475 | else |
laserdad | 0:897d3bb0accd | 476 | { |
laserdad | 0:897d3bb0accd | 477 | adcNow[channel-1] = readData(); |
laserdad | 0:897d3bb0accd | 478 | } |
laserdad | 0:897d3bb0accd | 479 | |
laserdad | 0:897d3bb0accd | 480 | if (++channel >= 4) |
laserdad | 0:897d3bb0accd | 481 | { |
laserdad | 0:897d3bb0accd | 482 | channel = 0; |
laserdad | 0:897d3bb0accd | 483 | } |
laserdad | 0:897d3bb0accd | 484 | } |
laserdad | 0:897d3bb0accd | 485 | } |
laserdad | 0:897d3bb0accd | 486 | |
laserdad | 0:897d3bb0accd | 487 | /* |
laserdad | 0:897d3bb0accd | 488 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 489 | * name: ADS1256::Scan |
laserdad | 0:897d3bb0accd | 490 | * function: |
laserdad | 0:897d3bb0accd | 491 | * parameter:NULL |
laserdad | 0:897d3bb0accd | 492 | * The return value: 1 |
laserdad | 0:897d3bb0accd | 493 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 494 | */ |
laserdad | 0:897d3bb0accd | 495 | uint8_t ADS1256::scan(void) |
laserdad | 0:897d3bb0accd | 496 | { |
laserdad | 0:897d3bb0accd | 497 | if (!(cs->read())) |
laserdad | 0:897d3bb0accd | 498 | { |
laserdad | 0:897d3bb0accd | 499 | isr(); |
laserdad | 0:897d3bb0accd | 500 | return 1; |
laserdad | 0:897d3bb0accd | 501 | } |
laserdad | 0:897d3bb0accd | 502 | |
laserdad | 0:897d3bb0accd | 503 | return 0; |
laserdad | 0:897d3bb0accd | 504 | } |
laserdad | 0:897d3bb0accd | 505 | |
laserdad | 0:897d3bb0accd | 506 | /* |
laserdad | 0:897d3bb0accd | 507 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 508 | * name: Voltage_Convert |
laserdad | 0:897d3bb0accd | 509 | * function: Voltage value conversion function |
laserdad | 0:897d3bb0accd | 510 | * parameter: Vref : The reference voltage 3.3V or 5V |
laserdad | 0:897d3bb0accd | 511 | * voltage : output DAC value |
laserdad | 0:897d3bb0accd | 512 | * The return value: NULL |
laserdad | 0:897d3bb0accd | 513 | ********************************************************************************************************* |
laserdad | 0:897d3bb0accd | 514 | */ |
laserdad | 0:897d3bb0accd | 515 | uint16_t ADS1256::voltageConvert(float Vref, float voltage) |
laserdad | 0:897d3bb0accd | 516 | { |
laserdad | 0:897d3bb0accd | 517 | uint16_t _D_; |
laserdad | 0:897d3bb0accd | 518 | _D_ = (uint16_t)(65536 * voltage / Vref); |
laserdad | 0:897d3bb0accd | 519 | |
laserdad | 0:897d3bb0accd | 520 | return _D_; |
laserdad | 0:897d3bb0accd | 521 | } |
laserdad | 0:897d3bb0accd | 522 | |
laserdad | 0:897d3bb0accd | 523 | void ADS1256::readDiffChannel(uint8_t nextChannel) |
laserdad | 0:897d3bb0accd | 524 | { |
laserdad | 0:897d3bb0accd | 525 | waitDRDY(); |
laserdad | 0:897d3bb0accd | 526 | prevChannel = channel; |
laserdad | 0:897d3bb0accd | 527 | channel = nextChannel; |
laserdad | 0:897d3bb0accd | 528 | if(channel != prevChannel) |
laserdad | 0:897d3bb0accd | 529 | { |
laserdad | 0:897d3bb0accd | 530 | setDiffChannel(); /*Switch channel mode to next channel to get it started*/ |
laserdad | 0:897d3bb0accd | 531 | wait_us(5); |
laserdad | 0:897d3bb0accd | 532 | |
laserdad | 0:897d3bb0accd | 533 | writeCmd(CMD_SYNC); |
laserdad | 0:897d3bb0accd | 534 | wait_us(5); |
laserdad | 0:897d3bb0accd | 535 | |
laserdad | 0:897d3bb0accd | 536 | writeCmd(CMD_WAKEUP); |
laserdad | 0:897d3bb0accd | 537 | wait_us(25); |
laserdad | 0:897d3bb0accd | 538 | } |
laserdad | 0:897d3bb0accd | 539 | adcNow[prevChannel] = readData(); //get data from prev channel while new channel is integrating |
laserdad | 0:897d3bb0accd | 540 | // pc.printf(" adcNow = %d\r\n", adcNow[prevChannel]); |
laserdad | 0:897d3bb0accd | 541 | } |
laserdad | 0:897d3bb0accd | 542 | |
laserdad | 0:897d3bb0accd | 543 | uint32_t ADS1256::getDataRateVal_us(uint8_t dataRateIndex) |
laserdad | 0:897d3bb0accd | 544 | { |
laserdad | 0:897d3bb0accd | 545 | static const uint32_t tabDataRateVal_us[16] = |
laserdad | 0:897d3bb0accd | 546 | { |
laserdad | 0:897d3bb0accd | 547 | 400000, |
laserdad | 0:897d3bb0accd | 548 | 200000, |
laserdad | 0:897d3bb0accd | 549 | 100000, |
laserdad | 0:897d3bb0accd | 550 | 66667, |
laserdad | 0:897d3bb0accd | 551 | 40000, |
laserdad | 0:897d3bb0accd | 552 | 33334, |
laserdad | 0:897d3bb0accd | 553 | 16667, |
laserdad | 0:897d3bb0accd | 554 | 16667, |
laserdad | 0:897d3bb0accd | 555 | 10000, |
laserdad | 0:897d3bb0accd | 556 | 2000, |
laserdad | 0:897d3bb0accd | 557 | 1000, |
laserdad | 0:897d3bb0accd | 558 | 500, |
laserdad | 0:897d3bb0accd | 559 | 267, |
laserdad | 0:897d3bb0accd | 560 | 134, |
laserdad | 0:897d3bb0accd | 561 | 34, |
laserdad | 0:897d3bb0accd | 562 | 7 |
laserdad | 0:897d3bb0accd | 563 | /*reset the default values */ |
laserdad | 0:897d3bb0accd | 564 | }; |
laserdad | 0:897d3bb0accd | 565 | return tabDataRateVal_us[dataRateIndex]; |
laserdad | 0:897d3bb0accd | 566 | } |
laserdad | 0:897d3bb0accd | 567 | |
laserdad | 0:897d3bb0accd | 568 | void ADS1256::waitNDRDY(void) |
laserdad | 0:897d3bb0accd | 569 | { |
laserdad | 0:897d3bb0accd | 570 | while(!nrdy->read()); |
laserdad | 0:897d3bb0accd | 571 | } |
laserdad | 0:897d3bb0accd | 572 | |
laserdad | 0:897d3bb0accd | 573 | void ADS1256::resync(void) |
laserdad | 0:897d3bb0accd | 574 | { |
laserdad | 0:897d3bb0accd | 575 | waitDRDY(); |
laserdad | 0:897d3bb0accd | 576 | wait_us(2); |
laserdad | 0:897d3bb0accd | 577 | |
laserdad | 0:897d3bb0accd | 578 | writeCmd(CMD_SYNC); |
laserdad | 0:897d3bb0accd | 579 | wait_us(5); |
laserdad | 0:897d3bb0accd | 580 | |
laserdad | 0:897d3bb0accd | 581 | writeCmd(CMD_WAKEUP); |
laserdad | 0:897d3bb0accd | 582 | } |