ADS1256 program

Committer:
laserdad
Date:
Fri Dec 01 21:31:48 2017 +0000
Revision:
0:897d3bb0accd
last known version;

Who changed what in which revision?

UserRevisionLine numberNew 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 }