Marijn Billiet / AD5933
Committer:
dipi
Date:
Wed May 20 09:17:24 2015 +0000
Revision:
6:6b9fc31d51b0
Parent:
5:2dc8c3f02788
Beta version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dipi 2:93dd1ebfedea 1 /* ---------------------------------------------------------------------------------
dipi 2:93dd1ebfedea 2 Copyright 2015 Marijn Billiet
dipi 2:93dd1ebfedea 3
dipi 2:93dd1ebfedea 4 Licensed under the Apache License, Version 2.0 (the "License");
dipi 2:93dd1ebfedea 5 you may not use this file except in compliance with the License.
dipi 2:93dd1ebfedea 6 You may obtain a copy of the License at
dipi 2:93dd1ebfedea 7
dipi 2:93dd1ebfedea 8 http://www.apache.org/licenses/LICENSE-2.0
dipi 2:93dd1ebfedea 9
dipi 2:93dd1ebfedea 10 Unless required by applicable law or agreed to in writing, software
dipi 2:93dd1ebfedea 11 distributed under the License is distributed on an "AS IS" BASIS,
dipi 2:93dd1ebfedea 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dipi 2:93dd1ebfedea 13 See the License for the specific language governing permissions and
dipi 2:93dd1ebfedea 14 limitations under the License.
dipi 2:93dd1ebfedea 15 --------------------------------------------------------------------------------- */
dipi 2:93dd1ebfedea 16
dipi 0:6a71184e6f66 17 #include "ad5933.h"
dipi 0:6a71184e6f66 18 #include "mbed.h"
dipi 0:6a71184e6f66 19
dipi 0:6a71184e6f66 20 // Define Command bytes
dipi 0:6a71184e6f66 21 #define INIT_FREQ 0x10 // initialise startfreq
dipi 0:6a71184e6f66 22 #define INIT_SWEEP 0x20 // initialise sweep
dipi 0:6a71184e6f66 23 #define INCR_FREQ 0x30 // increment frequency
dipi 0:6a71184e6f66 24 #define REPE_FREQ 0x40 // repeat frequency
dipi 0:6a71184e6f66 25 #define STANDBY 0xB0 // standby
dipi 6:6b9fc31d51b0 26 #define POWERDOWN 0xA0 // PowerDown modus
dipi 0:6a71184e6f66 27 #define MEAS_TEMP 0x90 // temperature
dipi 0:6a71184e6f66 28
dipi 0:6a71184e6f66 29 #define WRITE_CMD 0x1A // adress + write command
dipi 0:6a71184e6f66 30 #define READ_CMD 0x1B // adress + read command
dipi 0:6a71184e6f66 31
dipi 0:6a71184e6f66 32 #define CLOCK_FREQ 0x00F42400
dipi 6:6b9fc31d51b0 33 #define I2C_FREQ 400000
dipi 6:6b9fc31d51b0 34
dipi 6:6b9fc31d51b0 35 #define WAITTIME 1800 // time to wait before polling for response
dipi 0:6a71184e6f66 36
dipi 0:6a71184e6f66 37 AD5933::AD5933(PinName sda, PinName scl, bool extClk) : sCom(sda, scl)
dipi 0:6a71184e6f66 38 {
dipi 6:6b9fc31d51b0 39 sCom.frequency(I2C_FREQ);
dipi 5:2dc8c3f02788 40 PGAandVoltout = 0x00;
dipi 0:6a71184e6f66 41 _extClk = extClk;
dipi 0:6a71184e6f66 42 }
dipi 0:6a71184e6f66 43
dipi 0:6a71184e6f66 44 bool AD5933::gotoAdressPointer(uint8_t Adress)
dipi 0:6a71184e6f66 45 {
dipi 0:6a71184e6f66 46 sCom.start();
dipi 0:6a71184e6f66 47 bool output = (sCom.write(WRITE_CMD) + sCom.write(0xB0) + sCom.write(Adress)) == 3;
dipi 0:6a71184e6f66 48 sCom.stop();
dipi 0:6a71184e6f66 49 return output;
dipi 0:6a71184e6f66 50 }
dipi 0:6a71184e6f66 51
dipi 0:6a71184e6f66 52 bool AD5933::setRegister(uint8_t RegisterAdress, uint8_t RegisterValue)
dipi 0:6a71184e6f66 53 {
dipi 0:6a71184e6f66 54 sCom.start();
dipi 5:2dc8c3f02788 55 bool output = (sCom.write(WRITE_CMD) + sCom.write(RegisterAdress) + sCom.write(RegisterValue)) == 3;
dipi 0:6a71184e6f66 56 sCom.stop();
dipi 0:6a71184e6f66 57 return output;
dipi 0:6a71184e6f66 58 }
dipi 0:6a71184e6f66 59
dipi 0:6a71184e6f66 60 bool AD5933::writeBlock(uint8_t ByteArray[], uint8_t sizeArray)
dipi 0:6a71184e6f66 61 {
dipi 0:6a71184e6f66 62 sCom.start();
dipi 0:6a71184e6f66 63 bool output = (sCom.write(WRITE_CMD) + sCom.write(0xA0) + sCom.write(sizeArray)) == 3;
dipi 0:6a71184e6f66 64 for(uint8_t i = 0; i<sizeArray; i++) {
dipi 0:6a71184e6f66 65 output = sCom.write(ByteArray[i]) == 1 && output;
dipi 0:6a71184e6f66 66 }
dipi 0:6a71184e6f66 67 sCom.stop();
dipi 0:6a71184e6f66 68 return output;
dipi 0:6a71184e6f66 69 }
dipi 0:6a71184e6f66 70
dipi 0:6a71184e6f66 71 uint8_t AD5933::getRegister(uint8_t RegisterAdress)
dipi 0:6a71184e6f66 72 {
dipi 0:6a71184e6f66 73 gotoAdressPointer(RegisterAdress);
dipi 0:6a71184e6f66 74
dipi 0:6a71184e6f66 75 uint8_t output = 0xFF;
dipi 0:6a71184e6f66 76 sCom.start();
dipi 0:6a71184e6f66 77 if(sCom.write(READ_CMD) == 1)
dipi 0:6a71184e6f66 78 output = sCom.read(0);
dipi 0:6a71184e6f66 79 sCom.stop();
dipi 0:6a71184e6f66 80 return output;
dipi 0:6a71184e6f66 81 }
dipi 0:6a71184e6f66 82
dipi 0:6a71184e6f66 83 bool AD5933::readBlock(uint8_t* ByteArray, uint8_t sizeArray)
dipi 0:6a71184e6f66 84 {
dipi 0:6a71184e6f66 85 sCom.start();
dipi 0:6a71184e6f66 86 bool output = (sCom.write(WRITE_CMD) + sCom.write(0xA1) + sCom.write(sizeArray)) == 3;
dipi 0:6a71184e6f66 87 sCom.start();
dipi 0:6a71184e6f66 88 output = output && (sCom.write(READ_CMD) == 1);
dipi 0:6a71184e6f66 89 for(uint8_t i = 0; i<sizeArray-1; i++) {
dipi 0:6a71184e6f66 90 ByteArray[i] = sCom.read(1);
dipi 0:6a71184e6f66 91 }
dipi 0:6a71184e6f66 92 ByteArray[sizeArray-1] = sCom.read(0);
dipi 0:6a71184e6f66 93 sCom.stop();
dipi 0:6a71184e6f66 94 return output;
dipi 0:6a71184e6f66 95 }
dipi 0:6a71184e6f66 96
dipi 0:6a71184e6f66 97 bool AD5933::setControlReg(uint8_t Command)
dipi 0:6a71184e6f66 98 {
dipi 0:6a71184e6f66 99 return setRegister(0x80, PGAandVoltout | Command);
dipi 0:6a71184e6f66 100 }
dipi 0:6a71184e6f66 101
dipi 0:6a71184e6f66 102 bool AD5933::setFrequencySweepParam(unsigned int startFreq, unsigned int stepFreq, unsigned int nrOfSteps)
dipi 0:6a71184e6f66 103 {
dipi 0:6a71184e6f66 104 unsigned int startFreqCode = startFreq/CLOCK_FREQ*0x00000004*0x08000000;
dipi 0:6a71184e6f66 105 unsigned int stepFreqCode = stepFreq/CLOCK_FREQ*0x00000004*0x08000000;
dipi 0:6a71184e6f66 106
dipi 5:2dc8c3f02788 107 bool output = setRegister(0x82,(startFreqCode >> 16));
dipi 5:2dc8c3f02788 108 output &= setRegister(0x83,(startFreqCode >> 8));
dipi 5:2dc8c3f02788 109 output &= setRegister(0x84,(startFreqCode));
dipi 5:2dc8c3f02788 110 output &= setRegister(0x85,(stepFreqCode >> 16));
dipi 5:2dc8c3f02788 111 output &= setRegister(0x86,(stepFreqCode >> 8));
dipi 5:2dc8c3f02788 112 output &= setRegister(0x87,(stepFreqCode));
dipi 5:2dc8c3f02788 113 output &= setRegister(0x88,(nrOfSteps >> 8));
dipi 5:2dc8c3f02788 114 output &= setRegister(0x89,nrOfSteps);
dipi 5:2dc8c3f02788 115
dipi 6:6b9fc31d51b0 116 return output;
dipi 6:6b9fc31d51b0 117 }
dipi 6:6b9fc31d51b0 118
dipi 6:6b9fc31d51b0 119 bool AD5933::initFrequencySweepParam(unsigned int startFreq, unsigned int stepFreq, unsigned int nrOfSteps, unsigned int nrOfCycles, bool PGA, int RangeNr)
dipi 6:6b9fc31d51b0 120 {
dipi 6:6b9fc31d51b0 121 bool output = setFrequencySweepParam(startFreq, stepFreq, nrOfSteps);
dipi 6:6b9fc31d51b0 122 output &= setSettlingTime(nrOfCycles);
dipi 6:6b9fc31d51b0 123 output &= standby();
dipi 6:6b9fc31d51b0 124 output &= setAnalogCircuit(PGA, RangeNr);
dipi 6:6b9fc31d51b0 125 output &= setControlReg(INIT_FREQ);
dipi 6:6b9fc31d51b0 126 wait_ms(5);
dipi 6:6b9fc31d51b0 127 output &= setControlReg(INIT_SWEEP);
dipi 6:6b9fc31d51b0 128 wait_us(WAITTIME);
dipi 6:6b9fc31d51b0 129 output &= getData();
dipi 6:6b9fc31d51b0 130
dipi 5:2dc8c3f02788 131 return output;
dipi 0:6a71184e6f66 132 }
dipi 0:6a71184e6f66 133
dipi 0:6a71184e6f66 134 bool AD5933::setSettlingTime(unsigned int nrOfCycles)
dipi 0:6a71184e6f66 135 {
dipi 5:2dc8c3f02788 136 bool output = true;
dipi 6:6b9fc31d51b0 137
dipi 0:6a71184e6f66 138 if (nrOfCycles > 1022) {
dipi 5:2dc8c3f02788 139 output &= setRegister(0x8A,((nrOfCycles/4) >> 8) | 0x06);
dipi 5:2dc8c3f02788 140 output &= setRegister(0x8B,(nrOfCycles/4));
dipi 0:6a71184e6f66 141 } else if(nrOfCycles > 511) {
dipi 5:2dc8c3f02788 142 output &= setRegister(0x8A,((nrOfCycles/4) >> 8) | 0x02);
dipi 5:2dc8c3f02788 143 output &= setRegister(0x8B,(nrOfCycles/2));
dipi 0:6a71184e6f66 144 } else {
dipi 5:2dc8c3f02788 145 output &= setRegister(0x8A,0x00);
dipi 5:2dc8c3f02788 146 output &= setRegister(0x8B,nrOfCycles);
dipi 0:6a71184e6f66 147 }
dipi 5:2dc8c3f02788 148 return output;
dipi 0:6a71184e6f66 149 }
dipi 0:6a71184e6f66 150
dipi 0:6a71184e6f66 151 bool AD5933::setAnalogCircuit(bool PGA, int RangeNr)
dipi 0:6a71184e6f66 152 {
dipi 0:6a71184e6f66 153 if(PGA)
dipi 0:6a71184e6f66 154 PGAandVoltout = 0x01;
dipi 0:6a71184e6f66 155 else
dipi 0:6a71184e6f66 156 PGAandVoltout = 0x00;
dipi 0:6a71184e6f66 157
dipi 0:6a71184e6f66 158 switch(RangeNr) {
dipi 5:2dc8c3f02788 159 case 1:
dipi 5:2dc8c3f02788 160 PGAandVoltout |= 0x00;
dipi 0:6a71184e6f66 161 case 2:
dipi 0:6a71184e6f66 162 PGAandVoltout |= 0x06;
dipi 0:6a71184e6f66 163 break;
dipi 0:6a71184e6f66 164 case 3:
dipi 0:6a71184e6f66 165 PGAandVoltout |= 0x04;
dipi 0:6a71184e6f66 166 break;
dipi 0:6a71184e6f66 167 case 4:
dipi 0:6a71184e6f66 168 PGAandVoltout |= 0x02;
dipi 0:6a71184e6f66 169 break;
dipi 0:6a71184e6f66 170 }
dipi 6:6b9fc31d51b0 171
dipi 6:6b9fc31d51b0 172 uint8_t data = 0x00;
dipi 6:6b9fc31d51b0 173 if(_extClk)
dipi 6:6b9fc31d51b0 174 data |= 0x08;
dipi 6:6b9fc31d51b0 175
dipi 6:6b9fc31d51b0 176 bool output = setRegister(0x81, data);
dipi 6:6b9fc31d51b0 177 output &= setRegister(0x80,PGAandVoltout);
dipi 6:6b9fc31d51b0 178
dipi 6:6b9fc31d51b0 179 return output;
dipi 0:6a71184e6f66 180 }
dipi 0:6a71184e6f66 181
dipi 0:6a71184e6f66 182 bool AD5933::reset()
dipi 0:6a71184e6f66 183 {
dipi 0:6a71184e6f66 184 uint8_t data = 0x10;
dipi 0:6a71184e6f66 185 if(_extClk)
dipi 0:6a71184e6f66 186 data |= 0x08;
dipi 0:6a71184e6f66 187
dipi 0:6a71184e6f66 188 return setRegister(0x81, data);
dipi 0:6a71184e6f66 189 }
dipi 0:6a71184e6f66 190
dipi 4:1ecb56465953 191 bool AD5933::standby()
dipi 4:1ecb56465953 192 {
dipi 4:1ecb56465953 193 return setControlReg(STANDBY);
dipi 6:6b9fc31d51b0 194 }
dipi 4:1ecb56465953 195
dipi 6:6b9fc31d51b0 196 bool AD5933::powerdown()
dipi 6:6b9fc31d51b0 197 {
dipi 6:6b9fc31d51b0 198 return setControlReg(POWERDOWN);
dipi 4:1ecb56465953 199 }
dipi 4:1ecb56465953 200
dipi 0:6a71184e6f66 201 bool AD5933::Measure(bool increment)
dipi 0:6a71184e6f66 202 {
dipi 6:6b9fc31d51b0 203 if(increment) {
dipi 0:6a71184e6f66 204 setControlReg(INCR_FREQ);
dipi 6:6b9fc31d51b0 205 wait_us(WAITTIME);
dipi 0:6a71184e6f66 206 return getData();
dipi 0:6a71184e6f66 207 } else {
dipi 6:6b9fc31d51b0 208 setControlReg(0x00);
dipi 0:6a71184e6f66 209 setControlReg(REPE_FREQ);
dipi 6:6b9fc31d51b0 210 wait_us(WAITTIME);
dipi 0:6a71184e6f66 211 return getData();
dipi 0:6a71184e6f66 212 }
dipi 0:6a71184e6f66 213 }
dipi 0:6a71184e6f66 214
dipi 0:6a71184e6f66 215 bool AD5933::getData()
dipi 0:6a71184e6f66 216 {
dipi 0:6a71184e6f66 217 int i = 0;
dipi 0:6a71184e6f66 218 uint8_t data[4];
dipi 0:6a71184e6f66 219 bool output;
dipi 2:93dd1ebfedea 220
dipi 5:2dc8c3f02788 221 while(((getRegister(0x8F) & 0x02) != 0x02) && i < 10) {
dipi 6:6b9fc31d51b0 222 wait_us(500);
dipi 0:6a71184e6f66 223 i++;
dipi 0:6a71184e6f66 224 }
dipi 0:6a71184e6f66 225 if(i == 10)
dipi 4:1ecb56465953 226 output = false;
dipi 2:93dd1ebfedea 227
dipi 4:1ecb56465953 228 output &= gotoAdressPointer(0x82);
dipi 0:6a71184e6f66 229 output &= readBlock(data, 4);
dipi 3:b844dd14179c 230 real = data[0] << 8 | data[1];
dipi 3:b844dd14179c 231 imaginary = data[2] << 8 | data[3];
dipi 0:6a71184e6f66 232 return output;
dipi 0:6a71184e6f66 233 }
dipi 3:b844dd14179c 234
dipi 3:b844dd14179c 235 float AD5933::getTemperature()
dipi 3:b844dd14179c 236 {
dipi 3:b844dd14179c 237 int i = 0;
dipi 3:b844dd14179c 238 uint8_t data[2];
dipi 6:6b9fc31d51b0 239
dipi 4:1ecb56465953 240 setControlReg(MEAS_TEMP);
dipi 6:6b9fc31d51b0 241 wait_us(WAITTIME);
dipi 3:b844dd14179c 242
dipi 5:2dc8c3f02788 243 while(((getRegister(0x8F) & 0x01) != 0x01) && i < 10) {
dipi 6:6b9fc31d51b0 244 wait_us(500);
dipi 3:b844dd14179c 245 i++;
dipi 3:b844dd14179c 246 }
dipi 5:2dc8c3f02788 247 if(i == 10)
dipi 5:2dc8c3f02788 248 return -1;
dipi 3:b844dd14179c 249
dipi 3:b844dd14179c 250 gotoAdressPointer(0x92);
dipi 3:b844dd14179c 251 readBlock(data, 2);
dipi 3:b844dd14179c 252
dipi 3:b844dd14179c 253 if((data[0] >> 6) & 1) {
dipi 3:b844dd14179c 254 //negative temperature
dipi 3:b844dd14179c 255 return (((data[0] << 8 | data[1]) - 16384)/32.0) ;
dipi 3:b844dd14179c 256 } else {
dipi 3:b844dd14179c 257 return ((data[0] << 8 | data[1])/32.0) ;
dipi 3:b844dd14179c 258 }
dipi 3:b844dd14179c 259 }