Marijn Billiet / AD5933
Committer:
dipi
Date:
Wed May 13 14:07:40 2015 +0000
Revision:
5:2dc8c3f02788
Parent:
4:1ecb56465953
Child:
6:6b9fc31d51b0
new 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 0:6a71184e6f66 26 #define MEAS_TEMP 0x90 // temperature
dipi 0:6a71184e6f66 27
dipi 0:6a71184e6f66 28 #define WRITE_CMD 0x1A // adress + write command
dipi 0:6a71184e6f66 29 #define READ_CMD 0x1B // adress + read command
dipi 0:6a71184e6f66 30
dipi 0:6a71184e6f66 31 #define CLOCK_FREQ 0x00F42400
dipi 0:6a71184e6f66 32
dipi 0:6a71184e6f66 33 AD5933::AD5933(PinName sda, PinName scl, bool extClk) : sCom(sda, scl)
dipi 0:6a71184e6f66 34 {
dipi 0:6a71184e6f66 35 sCom.frequency(400000);
dipi 0:6a71184e6f66 36 firstMeasurement = true;
dipi 5:2dc8c3f02788 37 PGAandVoltout = 0x00;
dipi 0:6a71184e6f66 38 _extClk = extClk;
dipi 5:2dc8c3f02788 39 //if(_extClk)
dipi 5:2dc8c3f02788 40 // setRegister(0x81, 0x08);
dipi 5:2dc8c3f02788 41 //else
dipi 5:2dc8c3f02788 42 // setRegister(0x81, 0x00);
dipi 0:6a71184e6f66 43 }
dipi 0:6a71184e6f66 44
dipi 0:6a71184e6f66 45 bool AD5933::gotoAdressPointer(uint8_t Adress)
dipi 0:6a71184e6f66 46 {
dipi 0:6a71184e6f66 47 sCom.start();
dipi 0:6a71184e6f66 48 bool output = (sCom.write(WRITE_CMD) + sCom.write(0xB0) + sCom.write(Adress)) == 3;
dipi 0:6a71184e6f66 49 sCom.stop();
dipi 0:6a71184e6f66 50 return output;
dipi 0:6a71184e6f66 51 }
dipi 0:6a71184e6f66 52
dipi 0:6a71184e6f66 53 bool AD5933::setRegister(uint8_t RegisterAdress, uint8_t RegisterValue)
dipi 0:6a71184e6f66 54 {
dipi 0:6a71184e6f66 55 sCom.start();
dipi 5:2dc8c3f02788 56 bool output = (sCom.write(WRITE_CMD) + sCom.write(RegisterAdress) + sCom.write(RegisterValue)) == 3;
dipi 0:6a71184e6f66 57 sCom.stop();
dipi 0:6a71184e6f66 58 return output;
dipi 0:6a71184e6f66 59 }
dipi 0:6a71184e6f66 60
dipi 0:6a71184e6f66 61 bool AD5933::writeBlock(uint8_t ByteArray[], uint8_t sizeArray)
dipi 0:6a71184e6f66 62 {
dipi 0:6a71184e6f66 63 sCom.start();
dipi 0:6a71184e6f66 64 bool output = (sCom.write(WRITE_CMD) + sCom.write(0xA0) + sCom.write(sizeArray)) == 3;
dipi 0:6a71184e6f66 65 for(uint8_t i = 0; i<sizeArray; i++) {
dipi 0:6a71184e6f66 66 output = sCom.write(ByteArray[i]) == 1 && output;
dipi 0:6a71184e6f66 67 }
dipi 0:6a71184e6f66 68 sCom.stop();
dipi 0:6a71184e6f66 69 return output;
dipi 0:6a71184e6f66 70 }
dipi 0:6a71184e6f66 71
dipi 0:6a71184e6f66 72 uint8_t AD5933::getRegister(uint8_t RegisterAdress)
dipi 0:6a71184e6f66 73 {
dipi 0:6a71184e6f66 74 gotoAdressPointer(RegisterAdress);
dipi 0:6a71184e6f66 75
dipi 0:6a71184e6f66 76 uint8_t output = 0xFF;
dipi 0:6a71184e6f66 77 sCom.start();
dipi 0:6a71184e6f66 78 if(sCom.write(READ_CMD) == 1)
dipi 0:6a71184e6f66 79 output = sCom.read(0);
dipi 0:6a71184e6f66 80 sCom.stop();
dipi 0:6a71184e6f66 81 return output;
dipi 0:6a71184e6f66 82 }
dipi 0:6a71184e6f66 83
dipi 0:6a71184e6f66 84 bool AD5933::readBlock(uint8_t* ByteArray, uint8_t sizeArray)
dipi 0:6a71184e6f66 85 {
dipi 0:6a71184e6f66 86 sCom.start();
dipi 0:6a71184e6f66 87 bool output = (sCom.write(WRITE_CMD) + sCom.write(0xA1) + sCom.write(sizeArray)) == 3;
dipi 0:6a71184e6f66 88 sCom.start();
dipi 0:6a71184e6f66 89 output = output && (sCom.write(READ_CMD) == 1);
dipi 0:6a71184e6f66 90 for(uint8_t i = 0; i<sizeArray-1; i++) {
dipi 0:6a71184e6f66 91 ByteArray[i] = sCom.read(1);
dipi 0:6a71184e6f66 92 }
dipi 0:6a71184e6f66 93 ByteArray[sizeArray-1] = sCom.read(0);
dipi 0:6a71184e6f66 94 sCom.stop();
dipi 0:6a71184e6f66 95 return output;
dipi 0:6a71184e6f66 96 }
dipi 0:6a71184e6f66 97
dipi 0:6a71184e6f66 98 bool AD5933::setControlReg(uint8_t Command)
dipi 0:6a71184e6f66 99 {
dipi 0:6a71184e6f66 100 return setRegister(0x80, PGAandVoltout | Command);
dipi 0:6a71184e6f66 101 }
dipi 0:6a71184e6f66 102
dipi 0:6a71184e6f66 103 bool AD5933::setFrequencySweepParam(unsigned int startFreq, unsigned int stepFreq, unsigned int nrOfSteps)
dipi 0:6a71184e6f66 104 {
dipi 0:6a71184e6f66 105 unsigned int startFreqCode = startFreq/CLOCK_FREQ*0x00000004*0x08000000;
dipi 0:6a71184e6f66 106 unsigned int stepFreqCode = stepFreq/CLOCK_FREQ*0x00000004*0x08000000;
dipi 0:6a71184e6f66 107
dipi 5:2dc8c3f02788 108 bool output = setRegister(0x82,(startFreqCode >> 16));
dipi 5:2dc8c3f02788 109 output &= setRegister(0x83,(startFreqCode >> 8));
dipi 5:2dc8c3f02788 110 output &= setRegister(0x84,(startFreqCode));
dipi 5:2dc8c3f02788 111 output &= setRegister(0x85,(stepFreqCode >> 16));
dipi 5:2dc8c3f02788 112 output &= setRegister(0x86,(stepFreqCode >> 8));
dipi 5:2dc8c3f02788 113 output &= setRegister(0x87,(stepFreqCode));
dipi 5:2dc8c3f02788 114 output &= setRegister(0x88,(nrOfSteps >> 8));
dipi 5:2dc8c3f02788 115 output &= setRegister(0x89,nrOfSteps);
dipi 5:2dc8c3f02788 116
dipi 0:6a71184e6f66 117 firstMeasurement = true;
dipi 5:2dc8c3f02788 118 return output;
dipi 0:6a71184e6f66 119 }
dipi 0:6a71184e6f66 120
dipi 0:6a71184e6f66 121 bool AD5933::setSettlingTime(unsigned int nrOfCycles)
dipi 0:6a71184e6f66 122 {
dipi 5:2dc8c3f02788 123 bool output = true;
dipi 0:6a71184e6f66 124 if (nrOfCycles > 1022) {
dipi 5:2dc8c3f02788 125 output &= setRegister(0x8A,((nrOfCycles/4) >> 8) | 0x06);
dipi 5:2dc8c3f02788 126 output &= setRegister(0x8B,(nrOfCycles/4));
dipi 0:6a71184e6f66 127 } else if(nrOfCycles > 511) {
dipi 5:2dc8c3f02788 128 output &= setRegister(0x8A,((nrOfCycles/4) >> 8) | 0x02);
dipi 5:2dc8c3f02788 129 output &= setRegister(0x8B,(nrOfCycles/2));
dipi 0:6a71184e6f66 130 } else {
dipi 5:2dc8c3f02788 131 output &= setRegister(0x8A,0x00);
dipi 5:2dc8c3f02788 132 output &= setRegister(0x8B,nrOfCycles);
dipi 0:6a71184e6f66 133 }
dipi 5:2dc8c3f02788 134 return output;
dipi 0:6a71184e6f66 135 }
dipi 0:6a71184e6f66 136
dipi 0:6a71184e6f66 137 bool AD5933::setAnalogCircuit(bool PGA, int RangeNr)
dipi 0:6a71184e6f66 138 {
dipi 0:6a71184e6f66 139 if(PGA)
dipi 0:6a71184e6f66 140 PGAandVoltout = 0x01;
dipi 0:6a71184e6f66 141 else
dipi 0:6a71184e6f66 142 PGAandVoltout = 0x00;
dipi 0:6a71184e6f66 143
dipi 0:6a71184e6f66 144 switch(RangeNr) {
dipi 5:2dc8c3f02788 145 case 1:
dipi 5:2dc8c3f02788 146 PGAandVoltout |= 0x00;
dipi 0:6a71184e6f66 147 case 2:
dipi 0:6a71184e6f66 148 PGAandVoltout |= 0x06;
dipi 0:6a71184e6f66 149 break;
dipi 0:6a71184e6f66 150 case 3:
dipi 0:6a71184e6f66 151 PGAandVoltout |= 0x04;
dipi 0:6a71184e6f66 152 break;
dipi 0:6a71184e6f66 153 case 4:
dipi 0:6a71184e6f66 154 PGAandVoltout |= 0x02;
dipi 0:6a71184e6f66 155 break;
dipi 0:6a71184e6f66 156 }
dipi 0:6a71184e6f66 157 firstMeasurement = true;
dipi 0:6a71184e6f66 158 return true;
dipi 0:6a71184e6f66 159 }
dipi 0:6a71184e6f66 160
dipi 0:6a71184e6f66 161 bool AD5933::reset()
dipi 0:6a71184e6f66 162 {
dipi 0:6a71184e6f66 163 uint8_t data = 0x10;
dipi 0:6a71184e6f66 164 if(_extClk)
dipi 0:6a71184e6f66 165 data |= 0x08;
dipi 0:6a71184e6f66 166
dipi 0:6a71184e6f66 167 return setRegister(0x81, data);
dipi 0:6a71184e6f66 168 }
dipi 0:6a71184e6f66 169
dipi 4:1ecb56465953 170 bool AD5933::standby()
dipi 4:1ecb56465953 171 {
dipi 4:1ecb56465953 172 return setControlReg(STANDBY);
dipi 4:1ecb56465953 173
dipi 4:1ecb56465953 174 }
dipi 4:1ecb56465953 175
dipi 0:6a71184e6f66 176 bool AD5933::Measure(bool increment)
dipi 0:6a71184e6f66 177 {
dipi 0:6a71184e6f66 178 if(firstMeasurement) {
dipi 0:6a71184e6f66 179 setControlReg(INIT_FREQ);
dipi 5:2dc8c3f02788 180 wait_ms(1000);
dipi 0:6a71184e6f66 181
dipi 0:6a71184e6f66 182 setControlReg(INIT_SWEEP);
dipi 0:6a71184e6f66 183 wait_ms(5);
dipi 4:1ecb56465953 184 firstMeasurement = false;
dipi 0:6a71184e6f66 185 return getData();
dipi 0:6a71184e6f66 186 } else if(increment) {
dipi 0:6a71184e6f66 187 setControlReg(INCR_FREQ);
dipi 0:6a71184e6f66 188 wait_ms(5);
dipi 0:6a71184e6f66 189 return getData();
dipi 0:6a71184e6f66 190 } else {
dipi 0:6a71184e6f66 191 setControlReg(REPE_FREQ);
dipi 5:2dc8c3f02788 192 wait_ms(5);
dipi 0:6a71184e6f66 193 return getData();
dipi 0:6a71184e6f66 194 }
dipi 0:6a71184e6f66 195 }
dipi 0:6a71184e6f66 196
dipi 0:6a71184e6f66 197 bool AD5933::getData()
dipi 0:6a71184e6f66 198 {
dipi 0:6a71184e6f66 199 int i = 0;
dipi 0:6a71184e6f66 200 uint8_t data[4];
dipi 0:6a71184e6f66 201 bool output;
dipi 2:93dd1ebfedea 202
dipi 5:2dc8c3f02788 203 while(((getRegister(0x8F) & 0x02) != 0x02) && i < 10) {
dipi 5:2dc8c3f02788 204 wait_ms(50);
dipi 0:6a71184e6f66 205 i++;
dipi 0:6a71184e6f66 206 }
dipi 0:6a71184e6f66 207 if(i == 10)
dipi 4:1ecb56465953 208 output = false;
dipi 2:93dd1ebfedea 209
dipi 4:1ecb56465953 210 output &= gotoAdressPointer(0x82);
dipi 0:6a71184e6f66 211 output &= readBlock(data, 4);
dipi 3:b844dd14179c 212 real = data[0] << 8 | data[1];
dipi 3:b844dd14179c 213 imaginary = data[2] << 8 | data[3];
dipi 0:6a71184e6f66 214 return output;
dipi 0:6a71184e6f66 215 }
dipi 3:b844dd14179c 216
dipi 3:b844dd14179c 217 float AD5933::getTemperature()
dipi 3:b844dd14179c 218 {
dipi 3:b844dd14179c 219 int i = 0;
dipi 3:b844dd14179c 220 uint8_t data[2];
dipi 4:1ecb56465953 221
dipi 4:1ecb56465953 222 setControlReg(MEAS_TEMP);
dipi 4:1ecb56465953 223 wait_ms(5);
dipi 3:b844dd14179c 224
dipi 5:2dc8c3f02788 225 while(((getRegister(0x8F) & 0x01) != 0x01) && i < 10) {
dipi 5:2dc8c3f02788 226 wait_ms(5);
dipi 3:b844dd14179c 227 i++;
dipi 3:b844dd14179c 228 }
dipi 5:2dc8c3f02788 229 if(i == 10)
dipi 5:2dc8c3f02788 230 return -1;
dipi 3:b844dd14179c 231
dipi 3:b844dd14179c 232 gotoAdressPointer(0x92);
dipi 3:b844dd14179c 233 readBlock(data, 2);
dipi 3:b844dd14179c 234
dipi 3:b844dd14179c 235 if((data[0] >> 6) & 1) {
dipi 3:b844dd14179c 236 //negative temperature
dipi 3:b844dd14179c 237 return (((data[0] << 8 | data[1]) - 16384)/32.0) ;
dipi 3:b844dd14179c 238 } else {
dipi 3:b844dd14179c 239 return ((data[0] << 8 | data[1])/32.0) ;
dipi 3:b844dd14179c 240 }
dipi 3:b844dd14179c 241 }