Marijn Billiet / AD5933
Committer:
dipi
Date:
Mon May 11 13:48:59 2015 +0000
Revision:
3:b844dd14179c
Parent:
2:93dd1ebfedea
Child:
4:1ecb56465953
added read temperature

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 0:6a71184e6f66 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
dipi 0:6a71184e6f66 104 bool AD5933::setFrequencySweepParam(unsigned int startFreq, unsigned int stepFreq, unsigned int nrOfSteps)
dipi 0:6a71184e6f66 105 {
dipi 0:6a71184e6f66 106 unsigned int startFreqCode = startFreq/CLOCK_FREQ*0x00000004*0x08000000;
dipi 0:6a71184e6f66 107 unsigned int stepFreqCode = stepFreq/CLOCK_FREQ*0x00000004*0x08000000;
dipi 0:6a71184e6f66 108 uint8_t CodeArray[8];
dipi 0:6a71184e6f66 109 CodeArray[0] = (uint8_t) (startFreqCode >> 16);
dipi 0:6a71184e6f66 110 CodeArray[1] = (uint8_t) (startFreqCode >> 8);
dipi 0:6a71184e6f66 111 CodeArray[2] = (uint8_t) (startFreqCode);
dipi 0:6a71184e6f66 112 CodeArray[3] = (uint8_t) (stepFreqCode >> 16);
dipi 0:6a71184e6f66 113 CodeArray[4] = (uint8_t) (stepFreqCode >> 8);
dipi 0:6a71184e6f66 114 CodeArray[5] = (uint8_t) (stepFreqCode);
dipi 0:6a71184e6f66 115 CodeArray[6] = (uint8_t) (nrOfSteps >> 8);
dipi 0:6a71184e6f66 116 CodeArray[7] = (uint8_t) (nrOfSteps);
dipi 0:6a71184e6f66 117
dipi 0:6a71184e6f66 118 bool output = gotoAdressPointer(0x82);
dipi 0:6a71184e6f66 119 firstMeasurement = true;
dipi 0:6a71184e6f66 120 return writeBlock(CodeArray, 8) && output;
dipi 0:6a71184e6f66 121 }
dipi 0:6a71184e6f66 122
dipi 0:6a71184e6f66 123 bool AD5933::setSettlingTime(unsigned int nrOfCycles)
dipi 0:6a71184e6f66 124 {
dipi 0:6a71184e6f66 125 uint8_t CodeArray[2];
dipi 0:6a71184e6f66 126 if (nrOfCycles > 1022) {
dipi 0:6a71184e6f66 127 CodeArray[0] = ((nrOfCycles/4) >> 8) | 0x06;
dipi 0:6a71184e6f66 128 CodeArray[1] = (uint8_t) (nrOfCycles/4);
dipi 0:6a71184e6f66 129 } else if(nrOfCycles > 511) {
dipi 0:6a71184e6f66 130 CodeArray[0] = ((nrOfCycles/4) >> 8) | 0x02;
dipi 0:6a71184e6f66 131 CodeArray[1] = (uint8_t) (nrOfCycles/2);
dipi 0:6a71184e6f66 132 } else {
dipi 0:6a71184e6f66 133 CodeArray[0] = 0x00;
dipi 0:6a71184e6f66 134 CodeArray[1] = (uint8_t) (nrOfCycles);
dipi 0:6a71184e6f66 135 }
dipi 0:6a71184e6f66 136 bool output = gotoAdressPointer(0x8A);
dipi 0:6a71184e6f66 137 return writeBlock(CodeArray, 2) && output;
dipi 0:6a71184e6f66 138 }
dipi 0:6a71184e6f66 139
dipi 0:6a71184e6f66 140 bool AD5933::setAnalogCircuit(bool PGA, int RangeNr)
dipi 0:6a71184e6f66 141 {
dipi 0:6a71184e6f66 142 if(PGA)
dipi 0:6a71184e6f66 143 PGAandVoltout = 0x01;
dipi 0:6a71184e6f66 144 else
dipi 0:6a71184e6f66 145 PGAandVoltout = 0x00;
dipi 0:6a71184e6f66 146
dipi 0:6a71184e6f66 147 switch(RangeNr) {
dipi 0:6a71184e6f66 148 case 2:
dipi 0:6a71184e6f66 149 PGAandVoltout |= 0x06;
dipi 0:6a71184e6f66 150 break;
dipi 0:6a71184e6f66 151 case 3:
dipi 0:6a71184e6f66 152 PGAandVoltout |= 0x04;
dipi 0:6a71184e6f66 153 break;
dipi 0:6a71184e6f66 154 case 4:
dipi 0:6a71184e6f66 155 PGAandVoltout |= 0x02;
dipi 0:6a71184e6f66 156 break;
dipi 0:6a71184e6f66 157 }
dipi 0:6a71184e6f66 158 firstMeasurement = true;
dipi 0:6a71184e6f66 159 return true;
dipi 0:6a71184e6f66 160 }
dipi 0:6a71184e6f66 161
dipi 0:6a71184e6f66 162 bool AD5933::reset()
dipi 0:6a71184e6f66 163 {
dipi 0:6a71184e6f66 164 uint8_t data = 0x10;
dipi 0:6a71184e6f66 165 if(_extClk)
dipi 0:6a71184e6f66 166 data |= 0x08;
dipi 0:6a71184e6f66 167
dipi 0:6a71184e6f66 168 return setRegister(0x81, data);
dipi 0:6a71184e6f66 169 }
dipi 0:6a71184e6f66 170
dipi 0:6a71184e6f66 171 bool AD5933::Measure(bool increment)
dipi 0:6a71184e6f66 172 {
dipi 0:6a71184e6f66 173 if(firstMeasurement) {
dipi 0:6a71184e6f66 174 reset();
dipi 0:6a71184e6f66 175
dipi 0:6a71184e6f66 176 setControlReg(INIT_FREQ);
dipi 3:b844dd14179c 177 wait_ms(250);
dipi 0:6a71184e6f66 178
dipi 0:6a71184e6f66 179 setControlReg(INIT_SWEEP);
dipi 0:6a71184e6f66 180 wait_ms(5);
dipi 0:6a71184e6f66 181 return getData();
dipi 0:6a71184e6f66 182 } else if(increment) {
dipi 0:6a71184e6f66 183 setControlReg(INCR_FREQ);
dipi 0:6a71184e6f66 184 wait_ms(5);
dipi 0:6a71184e6f66 185 return getData();
dipi 0:6a71184e6f66 186 } else {
dipi 0:6a71184e6f66 187 setControlReg(REPE_FREQ);
dipi 0:6a71184e6f66 188 wait_ms(5);
dipi 0:6a71184e6f66 189 return getData();
dipi 0:6a71184e6f66 190 }
dipi 0:6a71184e6f66 191 }
dipi 0:6a71184e6f66 192
dipi 0:6a71184e6f66 193 bool AD5933::getData()
dipi 0:6a71184e6f66 194 {
dipi 0:6a71184e6f66 195 int i = 0;
dipi 0:6a71184e6f66 196 uint8_t data[4];
dipi 0:6a71184e6f66 197 bool output;
dipi 2:93dd1ebfedea 198
dipi 0:6a71184e6f66 199 while((getRegister(0x8F) != 0x02) && i < 10) {
dipi 0:6a71184e6f66 200 wait_ms(5);
dipi 0:6a71184e6f66 201 i++;
dipi 0:6a71184e6f66 202 }
dipi 0:6a71184e6f66 203 if(i == 10)
dipi 0:6a71184e6f66 204 return false;
dipi 2:93dd1ebfedea 205
dipi 0:6a71184e6f66 206 output = gotoAdressPointer(0x82);
dipi 0:6a71184e6f66 207 output &= readBlock(data, 4);
dipi 3:b844dd14179c 208 real = data[0] << 8 | data[1];
dipi 3:b844dd14179c 209 imaginary = data[2] << 8 | data[3];
dipi 0:6a71184e6f66 210 return output;
dipi 0:6a71184e6f66 211 }
dipi 3:b844dd14179c 212
dipi 3:b844dd14179c 213 float AD5933::getTemperature()
dipi 3:b844dd14179c 214 {
dipi 3:b844dd14179c 215 int i = 0;
dipi 3:b844dd14179c 216 uint8_t data[2];
dipi 3:b844dd14179c 217
dipi 3:b844dd14179c 218 while((getRegister(0x8F) != 0x01) && i < 10) {
dipi 3:b844dd14179c 219 wait_ms(5);
dipi 3:b844dd14179c 220 i++;
dipi 3:b844dd14179c 221 }
dipi 3:b844dd14179c 222 if(i == 10)
dipi 3:b844dd14179c 223 return false;
dipi 3:b844dd14179c 224
dipi 3:b844dd14179c 225 gotoAdressPointer(0x92);
dipi 3:b844dd14179c 226 readBlock(data, 2);
dipi 3:b844dd14179c 227
dipi 3:b844dd14179c 228 if((data[0] >> 6) & 1) {
dipi 3:b844dd14179c 229 //negative temperature
dipi 3:b844dd14179c 230 return (((data[0] << 8 | data[1]) - 16384)/32.0) ;
dipi 3:b844dd14179c 231 } else {
dipi 3:b844dd14179c 232 return ((data[0] << 8 | data[1])/32.0) ;
dipi 3:b844dd14179c 233 }
dipi 3:b844dd14179c 234 }