Vadim Kimlaychuk / AD5933
Committer:
dipi
Date:
Wed May 13 07:52:49 2015 +0000
Revision:
4:1ecb56465953
Parent:
3:b844dd14179c
Child:
5:2dc8c3f02788
jjk

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