-

Dependents:   AD7730_demo

Fork of AD7730 by Controls2 Developer

Committer:
frada
Date:
Tue Mar 17 12:13:39 2015 +0000
Revision:
1:82872c4221fc
Parent:
0:c584a588c24f
-

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cfscontrols2 0:c584a588c24f 1 #include "AD7730.h"
cfscontrols2 0:c584a588c24f 2
cfscontrols2 0:c584a588c24f 3 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 4 //default constructor requires pin names for spi and ready pin
cfscontrols2 0:c584a588c24f 5 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 6 AD7730::AD7730(PinName mosi, PinName miso, PinName sclk, PinName ready, PinName cs) : _spi(mosi, miso, sclk), _cs(cs), _readyDig(ready), _LED3(LED3){
cfscontrols2 0:c584a588c24f 7
cfscontrols2 0:c584a588c24f 8 _readyPin = ready;
cfscontrols2 0:c584a588c24f 9
cfscontrols2 0:c584a588c24f 10 //setup default parameters for spi
cfscontrols2 0:c584a588c24f 11 _spi.format(8, 1); //8bits with polarity 0 (clock idle low), phase 1 (write on falling edge, read on rising edge)
cfscontrols2 0:c584a588c24f 12 _spi.frequency(1000000); //2Mhz
cfscontrols2 0:c584a588c24f 13
cfscontrols2 0:c584a588c24f 14 //set default setup
cfscontrols2 0:c584a588c24f 15 _minWeight = 1;
cfscontrols2 0:c584a588c24f 16 _maxWeight = 5;
cfscontrols2 0:c584a588c24f 17 _fullScaleWeight = 11.023; //5kgs
cfscontrols2 0:c584a588c24f 18
cfscontrols2 0:c584a588c24f 19 //reset the device
cfscontrols2 0:c584a588c24f 20 reset(true);
cfscontrols2 0:c584a588c24f 21
cfscontrols2 0:c584a588c24f 22 //get default registry values
cfscontrols2 0:c584a588c24f 23 _mode = readRegistry(MODE_REG);
cfscontrols2 0:c584a588c24f 24 _filter = readRegistry(FILTER_REG);
cfscontrols2 0:c584a588c24f 25 _dac = readRegistry(DAC_REG);
cfscontrols2 0:c584a588c24f 26 _offset = readRegistry(OFFSET_REG);
cfscontrols2 0:c584a588c24f 27 _gain = readRegistry(GAIN_REG);
cfscontrols2 0:c584a588c24f 28 //set chip select high
cfscontrols2 0:c584a588c24f 29 _cs = 1;
cfscontrols2 0:c584a588c24f 30
cfscontrols2 0:c584a588c24f 31 //run internal calibration
cfscontrols2 0:c584a588c24f 32 internalFullCal();
cfscontrols2 0:c584a588c24f 33 internalZeroCal();
cfscontrols2 0:c584a588c24f 34
cfscontrols2 0:c584a588c24f 35
cfscontrols2 0:c584a588c24f 36 _continous = false;
cfscontrols2 0:c584a588c24f 37 _bufferCount = 0;
cfscontrols2 0:c584a588c24f 38 memset(_readBuffer, 0, 100);
cfscontrols2 0:c584a588c24f 39
cfscontrols2 0:c584a588c24f 40 }
cfscontrols2 0:c584a588c24f 41
cfscontrols2 0:c584a588c24f 42 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 43 // default destructor
cfscontrols2 0:c584a588c24f 44 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 45 AD7730::~AD7730(void){}
cfscontrols2 0:c584a588c24f 46
cfscontrols2 0:c584a588c24f 47
cfscontrols2 0:c584a588c24f 48
cfscontrols2 0:c584a588c24f 49
cfscontrols2 0:c584a588c24f 50 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 51 //function to read the specified registry value
cfscontrols2 0:c584a588c24f 52 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 53 int AD7730::readRegistry(int registry){
cfscontrols2 0:c584a588c24f 54
cfscontrols2 0:c584a588c24f 55 int readReg = 0;
cfscontrols2 0:c584a588c24f 56 int bytes = 0;
cfscontrols2 0:c584a588c24f 57
cfscontrols2 0:c584a588c24f 58 switch(registry){
cfscontrols2 0:c584a588c24f 59
cfscontrols2 0:c584a588c24f 60 case STATUS_REG: //status registry
cfscontrols2 0:c584a588c24f 61 {
cfscontrols2 0:c584a588c24f 62 readReg = 0x10;
cfscontrols2 0:c584a588c24f 63 bytes = 1;
cfscontrols2 0:c584a588c24f 64 break;
cfscontrols2 0:c584a588c24f 65 }
cfscontrols2 0:c584a588c24f 66 case DATA_REG: //data registry
cfscontrols2 0:c584a588c24f 67 {
cfscontrols2 0:c584a588c24f 68 _LED3 = _readyDig ? true : false;
cfscontrols2 0:c584a588c24f 69 readReg = 0x11;
cfscontrols2 0:c584a588c24f 70 bytes = 3;
cfscontrols2 0:c584a588c24f 71 break;
cfscontrols2 0:c584a588c24f 72 }
cfscontrols2 0:c584a588c24f 73 case MODE_REG: //mode registry
cfscontrols2 0:c584a588c24f 74 {
cfscontrols2 0:c584a588c24f 75 readReg = 0x12;
cfscontrols2 0:c584a588c24f 76 bytes = 2;
cfscontrols2 0:c584a588c24f 77 break;
cfscontrols2 0:c584a588c24f 78 }
cfscontrols2 0:c584a588c24f 79 case FILTER_REG: //filter registry
cfscontrols2 0:c584a588c24f 80 {
cfscontrols2 0:c584a588c24f 81 readReg = 0x13;
cfscontrols2 0:c584a588c24f 82 bytes = 3;
cfscontrols2 0:c584a588c24f 83 break;
cfscontrols2 0:c584a588c24f 84 }
cfscontrols2 0:c584a588c24f 85 case DAC_REG: //dac registry
cfscontrols2 0:c584a588c24f 86 {
cfscontrols2 0:c584a588c24f 87 readReg = 0x14;
cfscontrols2 0:c584a588c24f 88 bytes = 1;
cfscontrols2 0:c584a588c24f 89 break;
cfscontrols2 0:c584a588c24f 90 }
cfscontrols2 0:c584a588c24f 91 case OFFSET_REG: //offset registry
cfscontrols2 0:c584a588c24f 92 {
cfscontrols2 0:c584a588c24f 93 readReg = 0x15;
cfscontrols2 0:c584a588c24f 94 bytes = 3;
cfscontrols2 0:c584a588c24f 95 break;
cfscontrols2 0:c584a588c24f 96 }
cfscontrols2 0:c584a588c24f 97 case GAIN_REG: //gain registry
cfscontrols2 0:c584a588c24f 98 {
cfscontrols2 0:c584a588c24f 99 readReg = 0x16;
cfscontrols2 0:c584a588c24f 100 bytes = 3;
cfscontrols2 0:c584a588c24f 101 break;
cfscontrols2 0:c584a588c24f 102 }
cfscontrols2 0:c584a588c24f 103 case TEST_REG: //test registry
cfscontrols2 0:c584a588c24f 104 {
cfscontrols2 0:c584a588c24f 105 readReg = 0x17;
cfscontrols2 0:c584a588c24f 106 bytes = 3;
cfscontrols2 0:c584a588c24f 107 break;
cfscontrols2 0:c584a588c24f 108 }
cfscontrols2 0:c584a588c24f 109 default: //default to status registry
cfscontrols2 0:c584a588c24f 110 {
cfscontrols2 0:c584a588c24f 111 readReg = 0x10;
cfscontrols2 0:c584a588c24f 112 bytes = 1;
cfscontrols2 0:c584a588c24f 113 break;
cfscontrols2 0:c584a588c24f 114 }
cfscontrols2 0:c584a588c24f 115 } // end of switch statement
cfscontrols2 0:c584a588c24f 116
cfscontrols2 0:c584a588c24f 117 //send command to read the registry
cfscontrols2 0:c584a588c24f 118 _cs = 0;
cfscontrols2 0:c584a588c24f 119 wait_us(5);
cfscontrols2 0:c584a588c24f 120 _spi.write(readReg);
cfscontrols2 0:c584a588c24f 121
cfscontrols2 0:c584a588c24f 122 int value = 0;
cfscontrols2 0:c584a588c24f 123 //loop through bytes of returned data
cfscontrols2 0:c584a588c24f 124 for(int i=0; i<bytes; i++){
cfscontrols2 0:c584a588c24f 125 value = (value << 8) | _spi.write(EMPTY_SPI); //shift previous return value up by 8 bits to make room for new data
cfscontrols2 0:c584a588c24f 126 }
cfscontrols2 0:c584a588c24f 127 wait_us(5);
cfscontrols2 0:c584a588c24f 128 _cs = 1;
cfscontrols2 0:c584a588c24f 129
cfscontrols2 0:c584a588c24f 130 return value;
cfscontrols2 0:c584a588c24f 131 }
cfscontrols2 0:c584a588c24f 132
cfscontrols2 0:c584a588c24f 133 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 134 //function to write to the specified registry
cfscontrols2 0:c584a588c24f 135 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 136 int AD7730::writeRegistry(int registry, int value){
cfscontrols2 0:c584a588c24f 137
cfscontrols2 0:c584a588c24f 138 int writeReg = 0;
cfscontrols2 0:c584a588c24f 139 int bytes = 0;
cfscontrols2 0:c584a588c24f 140
cfscontrols2 0:c584a588c24f 141 switch(registry){
cfscontrols2 0:c584a588c24f 142
cfscontrols2 0:c584a588c24f 143 case MODE_REG: //mode registry
cfscontrols2 0:c584a588c24f 144 {
cfscontrols2 0:c584a588c24f 145 writeReg = 0x02;
cfscontrols2 0:c584a588c24f 146 bytes = 2;
cfscontrols2 0:c584a588c24f 147 _mode = value;
cfscontrols2 0:c584a588c24f 148 //check if continous converstion is being stopped or started
cfscontrols2 0:c584a588c24f 149 _continous = ((value & 0x2000) > 0)? true : false;
cfscontrols2 0:c584a588c24f 150 break;
cfscontrols2 0:c584a588c24f 151 }
cfscontrols2 0:c584a588c24f 152 case FILTER_REG: //filter registry
cfscontrols2 0:c584a588c24f 153 {
cfscontrols2 0:c584a588c24f 154 writeReg = 0x03;
cfscontrols2 0:c584a588c24f 155 bytes = 3;
cfscontrols2 0:c584a588c24f 156 _filter = value;
cfscontrols2 0:c584a588c24f 157 break;
cfscontrols2 0:c584a588c24f 158 }
cfscontrols2 0:c584a588c24f 159 case DAC_REG: //dac registry
cfscontrols2 0:c584a588c24f 160 {
cfscontrols2 0:c584a588c24f 161 writeReg = 0x04;
cfscontrols2 0:c584a588c24f 162 bytes = 1;
cfscontrols2 0:c584a588c24f 163 _dac = value;
cfscontrols2 0:c584a588c24f 164 break;
cfscontrols2 0:c584a588c24f 165 }
cfscontrols2 0:c584a588c24f 166 case OFFSET_REG: //offset registry
cfscontrols2 0:c584a588c24f 167 {
cfscontrols2 0:c584a588c24f 168 writeReg = 0x05;
cfscontrols2 0:c584a588c24f 169 bytes = 3;
cfscontrols2 0:c584a588c24f 170 _offset = value;
cfscontrols2 0:c584a588c24f 171 break;
cfscontrols2 0:c584a588c24f 172 }
cfscontrols2 0:c584a588c24f 173 case GAIN_REG: //gain registry
cfscontrols2 0:c584a588c24f 174 {
cfscontrols2 0:c584a588c24f 175 writeReg = 0x06;
cfscontrols2 0:c584a588c24f 176 bytes = 3;
cfscontrols2 0:c584a588c24f 177 _gain = value;
cfscontrols2 0:c584a588c24f 178 break;
cfscontrols2 0:c584a588c24f 179 }
cfscontrols2 0:c584a588c24f 180 default: //default to communications register
cfscontrols2 0:c584a588c24f 181 {
cfscontrols2 0:c584a588c24f 182 writeReg = 0x00;
cfscontrols2 0:c584a588c24f 183 bytes = 0;
cfscontrols2 0:c584a588c24f 184 break;
cfscontrols2 0:c584a588c24f 185 }
cfscontrols2 0:c584a588c24f 186 } // end of switch statement
cfscontrols2 0:c584a588c24f 187
cfscontrols2 0:c584a588c24f 188 //send command to write to a the registry
cfscontrols2 0:c584a588c24f 189 _cs = 0;
cfscontrols2 0:c584a588c24f 190 wait_us(5);
cfscontrols2 0:c584a588c24f 191 _spi.write(writeReg);
cfscontrols2 0:c584a588c24f 192
cfscontrols2 0:c584a588c24f 193 //send data
cfscontrols2 0:c584a588c24f 194 switch(bytes)
cfscontrols2 0:c584a588c24f 195 {
cfscontrols2 0:c584a588c24f 196 case 3:
cfscontrols2 0:c584a588c24f 197 _spi.write(((value >> 16) & 255));
cfscontrols2 0:c584a588c24f 198 case 2:
cfscontrols2 0:c584a588c24f 199 _spi.write(((value >> 8) & 255));
cfscontrols2 0:c584a588c24f 200 case 1:
cfscontrols2 0:c584a588c24f 201 _spi.write((value & 255));
cfscontrols2 0:c584a588c24f 202 break;
cfscontrols2 0:c584a588c24f 203 default:
cfscontrols2 0:c584a588c24f 204 break;
cfscontrols2 0:c584a588c24f 205 }
cfscontrols2 0:c584a588c24f 206 wait_us(5);
cfscontrols2 0:c584a588c24f 207 _cs = 1;
cfscontrols2 0:c584a588c24f 208
cfscontrols2 0:c584a588c24f 209 return value;
cfscontrols2 0:c584a588c24f 210 }
cfscontrols2 0:c584a588c24f 211
cfscontrols2 0:c584a588c24f 212
cfscontrols2 0:c584a588c24f 213 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 214 //function to initiate an internal full-scale calibration
cfscontrols2 0:c584a588c24f 215 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 216 int AD7730::internalFullCal(void){
cfscontrols2 0:c584a588c24f 217
cfscontrols2 0:c584a588c24f 218 //reset execution timer
cfscontrols2 0:c584a588c24f 219 _exeTmr.reset();
cfscontrols2 0:c584a588c24f 220
cfscontrols2 0:c584a588c24f 221 //1011000100110000 (0xB130) Internal Full-Scale Calibration, unipolar, long data, low reference, 0-80mv, channel 0
cfscontrols2 0:c584a588c24f 222 writeRegistry(MODE_REG, 0xB130);
cfscontrols2 0:c584a588c24f 223 wait_us(1); //give time for ready line to go high
cfscontrols2 0:c584a588c24f 224
cfscontrols2 0:c584a588c24f 225 //wait for ready pin to go low indicating calibration complete with timeout of 2000ms
cfscontrols2 0:c584a588c24f 226 int time = 0;
cfscontrols2 0:c584a588c24f 227 while(_readyDig && time < 2000){
cfscontrols2 0:c584a588c24f 228 wait_ms(2);
cfscontrols2 0:c584a588c24f 229 time += 2;
cfscontrols2 0:c584a588c24f 230 }
cfscontrols2 0:c584a588c24f 231
cfscontrols2 0:c584a588c24f 232 //update execution time
cfscontrols2 0:c584a588c24f 233 _exeTime = _exeTmr.read_us();
cfscontrols2 0:c584a588c24f 234
cfscontrols2 0:c584a588c24f 235 //check if timeout occurred
cfscontrols2 0:c584a588c24f 236 if(time >= 2000){
cfscontrols2 0:c584a588c24f 237 _exeError = 56;
cfscontrols2 0:c584a588c24f 238 return 1;
cfscontrols2 0:c584a588c24f 239 }
cfscontrols2 0:c584a588c24f 240 else {
cfscontrols2 0:c584a588c24f 241 _exeError = 0;
cfscontrols2 0:c584a588c24f 242 return 0;
cfscontrols2 0:c584a588c24f 243 }
cfscontrols2 0:c584a588c24f 244 }
cfscontrols2 0:c584a588c24f 245
cfscontrols2 0:c584a588c24f 246
cfscontrols2 0:c584a588c24f 247 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 248 //function to initiate an internal zero-scale calibration
cfscontrols2 0:c584a588c24f 249 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 250 int AD7730::internalZeroCal(void){
cfscontrols2 0:c584a588c24f 251
cfscontrols2 0:c584a588c24f 252 //reset execution timer
cfscontrols2 0:c584a588c24f 253 _exeTmr.reset();
cfscontrols2 0:c584a588c24f 254
cfscontrols2 0:c584a588c24f 255 //1001000100110000 (0x9100) Internal Zero-Scale Calibration, unipolar, long data, low reference, 0-10mv, channel 0
cfscontrols2 0:c584a588c24f 256 writeRegistry(MODE_REG, 0x9100);
cfscontrols2 0:c584a588c24f 257 wait_us(1); //give time for ready line to go high
cfscontrols2 0:c584a588c24f 258
cfscontrols2 0:c584a588c24f 259 //wait for ready pin to go low indicating calibration complete with timeout of 2000ms
cfscontrols2 0:c584a588c24f 260 int time = 0;
cfscontrols2 0:c584a588c24f 261 while(_readyDig && time < 2000){
cfscontrols2 0:c584a588c24f 262 wait_ms(2);
cfscontrols2 0:c584a588c24f 263 time += 2;
cfscontrols2 0:c584a588c24f 264 }
cfscontrols2 0:c584a588c24f 265
cfscontrols2 0:c584a588c24f 266 //update execution time
cfscontrols2 0:c584a588c24f 267 _exeTime = _exeTmr.read_us();
cfscontrols2 0:c584a588c24f 268
cfscontrols2 0:c584a588c24f 269 //check if timeout occurred
cfscontrols2 0:c584a588c24f 270 if(time >= 2000){
cfscontrols2 0:c584a588c24f 271 _exeError = 56;
cfscontrols2 0:c584a588c24f 272 return 1;
cfscontrols2 0:c584a588c24f 273 }
cfscontrols2 0:c584a588c24f 274 else {
cfscontrols2 0:c584a588c24f 275 _exeError = 0;
cfscontrols2 0:c584a588c24f 276 return 0;
cfscontrols2 0:c584a588c24f 277 }
cfscontrols2 0:c584a588c24f 278 }
cfscontrols2 0:c584a588c24f 279
cfscontrols2 0:c584a588c24f 280
cfscontrols2 0:c584a588c24f 281
cfscontrols2 0:c584a588c24f 282 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 283 //function to initialize the chip settings to default values after power up and to run internal calibration
cfscontrols2 0:c584a588c24f 284 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 285 int AD7730::initialize(void){
cfscontrols2 0:c584a588c24f 286
cfscontrols2 0:c584a588c24f 287 //reset device
cfscontrols2 0:c584a588c24f 288 reset(true); //initate a full reset
cfscontrols2 0:c584a588c24f 289
cfscontrols2 0:c584a588c24f 290 systemLowCal(_minWeight);
cfscontrols2 0:c584a588c24f 291
cfscontrols2 0:c584a588c24f 292 //set the Offset
cfscontrols2 0:c584a588c24f 293 writeRegistry(OFFSET_REG, _offset);
cfscontrols2 0:c584a588c24f 294
cfscontrols2 0:c584a588c24f 295 //set the Gain
cfscontrols2 0:c584a588c24f 296 writeRegistry(GAIN_REG, _gain);
cfscontrols2 0:c584a588c24f 297
cfscontrols2 0:c584a588c24f 298 //set the DAC
cfscontrols2 0:c584a588c24f 299 writeRegistry(DAC_REG, _dac);
cfscontrols2 0:c584a588c24f 300
cfscontrols2 0:c584a588c24f 301 return 0;
cfscontrols2 0:c584a588c24f 302
cfscontrols2 0:c584a588c24f 303 }
cfscontrols2 0:c584a588c24f 304
cfscontrols2 0:c584a588c24f 305
cfscontrols2 0:c584a588c24f 306 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 307 //function to initiate a system zero-scale calibration
cfscontrols2 0:c584a588c24f 308 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 309 int AD7730::systemLowCal(double wgt){
cfscontrols2 0:c584a588c24f 310
cfscontrols2 0:c584a588c24f 311 //set minimum weight for low calibration
cfscontrols2 0:c584a588c24f 312 _minWeight = wgt;
cfscontrols2 0:c584a588c24f 313
cfscontrols2 0:c584a588c24f 314
cfscontrols2 0:c584a588c24f 315 //1101000100000000 (0xD100) System Zero-Scale Calibration, unipolar, long data, low reference, 0-10mv, channel 0
cfscontrols2 0:c584a588c24f 316 int mode = 0xD100;
cfscontrols2 0:c584a588c24f 317
cfscontrols2 0:c584a588c24f 318 writeRegistry(MODE_REG, mode);
cfscontrols2 0:c584a588c24f 319
cfscontrols2 0:c584a588c24f 320 wait_us(1); //give time for ready pin to go high
cfscontrols2 0:c584a588c24f 321 int time = 0;
cfscontrols2 0:c584a588c24f 322 while(_readyDig && time < 2000){
cfscontrols2 0:c584a588c24f 323 time += 2;
cfscontrols2 0:c584a588c24f 324 wait_ms(2);
cfscontrols2 0:c584a588c24f 325 }//wait for ready pin to go low
cfscontrols2 0:c584a588c24f 326
cfscontrols2 0:c584a588c24f 327 if(_readyDig){
cfscontrols2 0:c584a588c24f 328 //printf("External Zero Failed\r\n");
cfscontrols2 0:c584a588c24f 329 }
cfscontrols2 0:c584a588c24f 330
cfscontrols2 0:c584a588c24f 331 return (time >= 2000) ? 1 : 0;
cfscontrols2 0:c584a588c24f 332
cfscontrols2 0:c584a588c24f 333 }
cfscontrols2 0:c584a588c24f 334
cfscontrols2 0:c584a588c24f 335
cfscontrols2 0:c584a588c24f 336 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 337 //function to initiate a system high calibration
cfscontrols2 0:c584a588c24f 338 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 339 int AD7730::systemHighCal(double max, double fullScale){
cfscontrols2 0:c584a588c24f 340
cfscontrols2 0:c584a588c24f 341 //get the current offset value
cfscontrols2 0:c584a588c24f 342 int offset = readRegistry(OFFSET_REG);
cfscontrols2 0:c584a588c24f 343 int fullScaleAdjust = ((double)offset - 8388608) + 16777215;
cfscontrols2 0:c584a588c24f 344 fullScaleAdjust /= 2;
cfscontrols2 0:c584a588c24f 345 //double calFactor = fullScale / (fullScaleAdjust / 2); //dual load cells splits the weight in half
cfscontrols2 0:c584a588c24f 346
cfscontrols2 0:c584a588c24f 347 //set maximum weight for high calibration
cfscontrols2 0:c584a588c24f 348 _maxWeight = max;
cfscontrols2 0:c584a588c24f 349 //calculate the expected value for the maximum weight based on the full scale of the load cell
cfscontrols2 0:c584a588c24f 350 double expected = ((fullScaleAdjust * max) / fullScale);
cfscontrols2 0:c584a588c24f 351
cfscontrols2 0:c584a588c24f 352 //take some samples
cfscontrols2 0:c584a588c24f 353 double avg = 0;
cfscontrols2 0:c584a588c24f 354 double value = 0;
cfscontrols2 0:c584a588c24f 355 for(int i=0; i<20; i++){
frada 1:82872c4221fc 356 value = (double)read(false);
cfscontrols2 0:c584a588c24f 357 avg += value;
cfscontrols2 0:c584a588c24f 358 }
cfscontrols2 0:c584a588c24f 359
cfscontrols2 0:c584a588c24f 360 avg = avg / 20;
cfscontrols2 0:c584a588c24f 361
cfscontrols2 0:c584a588c24f 362 //get current gain setting
cfscontrols2 0:c584a588c24f 363 double gain = (double)readRegistry(GAIN_REG);
cfscontrols2 0:c584a588c24f 364
cfscontrols2 0:c584a588c24f 365 //calculate new gain value
cfscontrols2 0:c584a588c24f 366 double adjustedGain = gain * (expected / avg);
cfscontrols2 0:c584a588c24f 367
cfscontrols2 0:c584a588c24f 368 printf("Expected: %.3f\r\nActual: %.3f\r\n", expected, avg);
cfscontrols2 0:c584a588c24f 369
cfscontrols2 0:c584a588c24f 370 int err = 0;
cfscontrols2 0:c584a588c24f 371 if(adjustedGain > 16777215){
cfscontrols2 0:c584a588c24f 372 //printf("Exceeded Maximum Gain Value\r\n");
cfscontrols2 0:c584a588c24f 373 err = 1;
cfscontrols2 0:c584a588c24f 374 }
cfscontrols2 0:c584a588c24f 375
cfscontrols2 0:c584a588c24f 376 //update gain registry
cfscontrols2 0:c584a588c24f 377 writeRegistry(GAIN_REG, (int)adjustedGain);
cfscontrols2 0:c584a588c24f 378
cfscontrols2 0:c584a588c24f 379 return err;
cfscontrols2 0:c584a588c24f 380 }
cfscontrols2 0:c584a588c24f 381
cfscontrols2 0:c584a588c24f 382
cfscontrols2 0:c584a588c24f 383
cfscontrols2 0:c584a588c24f 384 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 385 //function to initiate the conversion of a sample
cfscontrols2 0:c584a588c24f 386 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 387 int AD7730::startConversion(bool wait){
cfscontrols2 0:c584a588c24f 388
cfscontrols2 0:c584a588c24f 389 //set the mode to do a single conversion
cfscontrols2 0:c584a588c24f 390 //0101000100000000 (0x5000) Single Conversion, unipolar, short data, low reference, 0-10mv, channel 0
cfscontrols2 0:c584a588c24f 391 int mode = 0x5100;
cfscontrols2 0:c584a588c24f 392
cfscontrols2 0:c584a588c24f 393 writeRegistry(MODE_REG, mode);
cfscontrols2 0:c584a588c24f 394
cfscontrols2 0:c584a588c24f 395 if(wait){
cfscontrols2 0:c584a588c24f 396 //wait for conversion to complete
cfscontrols2 0:c584a588c24f 397
cfscontrols2 0:c584a588c24f 398 wait_us(1); //give time for ready to go high*/
cfscontrols2 0:c584a588c24f 399
cfscontrols2 0:c584a588c24f 400 int time = 0;
cfscontrols2 0:c584a588c24f 401 while(_readyDig && time < 2000000){
cfscontrols2 0:c584a588c24f 402 time += 2;
cfscontrols2 0:c584a588c24f 403 wait_us(2);
cfscontrols2 0:c584a588c24f 404 }//wait for ready pin to go low.*/
cfscontrols2 0:c584a588c24f 405
cfscontrols2 0:c584a588c24f 406 if(time >= 2000000){
cfscontrols2 0:c584a588c24f 407 //printf("Convert Timeout\r\n");
cfscontrols2 0:c584a588c24f 408 _exeError = 56;
cfscontrols2 0:c584a588c24f 409 return 1;
cfscontrols2 0:c584a588c24f 410 }
cfscontrols2 0:c584a588c24f 411 }
cfscontrols2 0:c584a588c24f 412
cfscontrols2 0:c584a588c24f 413 return 0;
cfscontrols2 0:c584a588c24f 414 }
cfscontrols2 0:c584a588c24f 415
cfscontrols2 0:c584a588c24f 416 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 417 //function to do a single read with conversion
cfscontrols2 0:c584a588c24f 418 /************************************************************************************************************************/
frada 1:82872c4221fc 419 int AD7730::read(bool _wait){
cfscontrols2 0:c584a588c24f 420
cfscontrols2 0:c584a588c24f 421 if(_continous){
cfscontrols2 0:c584a588c24f 422 //chip is running in continous conversion mode
cfscontrols2 0:c584a588c24f 423 return _lastValue;
cfscontrols2 0:c584a588c24f 424 }
cfscontrols2 0:c584a588c24f 425 else {
cfscontrols2 0:c584a588c24f 426 //a new conversion must be started
frada 1:82872c4221fc 427 startConversion(_wait);
cfscontrols2 0:c584a588c24f 428 return readRegistry(DATA_REG);
cfscontrols2 0:c584a588c24f 429 }
cfscontrols2 0:c584a588c24f 430 }
cfscontrols2 0:c584a588c24f 431
cfscontrols2 0:c584a588c24f 432
cfscontrols2 0:c584a588c24f 433 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 434 //function to set the filter settings
cfscontrols2 0:c584a588c24f 435 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 436 void AD7730::setFilter(int SF, bool chop, int filter2){
cfscontrols2 0:c584a588c24f 437
cfscontrols2 0:c584a588c24f 438 SF = SF << 12; //slide SF settings up 12 bits
cfscontrols2 0:c584a588c24f 439
cfscontrols2 0:c584a588c24f 440 switch(filter2){
cfscontrols2 0:c584a588c24f 441 case 2:
cfscontrols2 0:c584a588c24f 442 SF = SF | 512; //turn on bit 10 for skip mode
cfscontrols2 0:c584a588c24f 443 break;
cfscontrols2 0:c584a588c24f 444 case 1:
cfscontrols2 0:c584a588c24f 445 SF = SF | 256; //turn on bit 09 for fast mode
cfscontrols2 0:c584a588c24f 446 break;
cfscontrols2 0:c584a588c24f 447 default:
cfscontrols2 0:c584a588c24f 448 break; //leave bits 9 & 10 off so secondary filter is fully enabled
cfscontrols2 0:c584a588c24f 449 }
cfscontrols2 0:c584a588c24f 450
cfscontrols2 0:c584a588c24f 451 if(chop){
cfscontrols2 0:c584a588c24f 452 SF = SF | 16; //turn on bit 5 to enable chop mode
cfscontrols2 0:c584a588c24f 453 }
cfscontrols2 0:c584a588c24f 454
cfscontrols2 0:c584a588c24f 455 writeRegistry(FILTER_REG,SF);
cfscontrols2 0:c584a588c24f 456
cfscontrols2 0:c584a588c24f 457 }
cfscontrols2 0:c584a588c24f 458
cfscontrols2 0:c584a588c24f 459 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 460 //function to reset the chip
cfscontrols2 0:c584a588c24f 461 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 462 void AD7730::reset(bool fullReset){
cfscontrols2 0:c584a588c24f 463
cfscontrols2 0:c584a588c24f 464 _cs = 0;
cfscontrols2 0:c584a588c24f 465 wait_us(5);
cfscontrols2 0:c584a588c24f 466 _spi.write(0xFF);
cfscontrols2 0:c584a588c24f 467 _spi.write(0xFF);
cfscontrols2 0:c584a588c24f 468 _spi.write(0xFF);
cfscontrols2 0:c584a588c24f 469 _spi.write(0xFF);
cfscontrols2 0:c584a588c24f 470 _spi.write(0xFF);
cfscontrols2 0:c584a588c24f 471 wait_us(5);
cfscontrols2 0:c584a588c24f 472 _cs = 1;
cfscontrols2 0:c584a588c24f 473
cfscontrols2 0:c584a588c24f 474 //if not a full reset, then reload registry settings
cfscontrols2 0:c584a588c24f 475 if(!fullReset){
cfscontrols2 0:c584a588c24f 476 writeRegistry(MODE_REG, _mode);
cfscontrols2 0:c584a588c24f 477 writeRegistry(FILTER_REG, _filter);
cfscontrols2 0:c584a588c24f 478 writeRegistry(DAC_REG, _dac);
cfscontrols2 0:c584a588c24f 479 writeRegistry(OFFSET_REG, _offset);
cfscontrols2 0:c584a588c24f 480 writeRegistry(GAIN_REG, _gain);
cfscontrols2 0:c584a588c24f 481 }
cfscontrols2 0:c584a588c24f 482 else {
cfscontrols2 0:c584a588c24f 483 //reinitiate internal calibration
cfscontrols2 0:c584a588c24f 484 internalFullCal();
cfscontrols2 0:c584a588c24f 485 wait_ms(100);
cfscontrols2 0:c584a588c24f 486 internalZeroCal();
cfscontrols2 0:c584a588c24f 487 wait_ms(100);
cfscontrols2 0:c584a588c24f 488 }
cfscontrols2 0:c584a588c24f 489 }
cfscontrols2 0:c584a588c24f 490
cfscontrols2 0:c584a588c24f 491 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 492 //function to adjust the DAC
cfscontrols2 0:c584a588c24f 493 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 494 int AD7730::adjustDAC(int direction){
cfscontrols2 0:c584a588c24f 495
cfscontrols2 0:c584a588c24f 496 int DAC = readRegistry(DAC_REG);
cfscontrols2 0:c584a588c24f 497 int sign = DAC & 32; //get the sign bit
cfscontrols2 0:c584a588c24f 498 DAC &= 31; //remove sign bit
cfscontrols2 0:c584a588c24f 499
cfscontrols2 0:c584a588c24f 500
cfscontrols2 0:c584a588c24f 501 if(direction > 0){
cfscontrols2 0:c584a588c24f 502 //increment DAC
cfscontrols2 0:c584a588c24f 503 if((sign > 0) && (DAC == 1)){ //sign bit is set and DAC is already at 1 change to 0;
cfscontrols2 0:c584a588c24f 504 DAC = 0;
cfscontrols2 0:c584a588c24f 505 sign = 0;
cfscontrols2 0:c584a588c24f 506 }
cfscontrols2 0:c584a588c24f 507 else if((sign == 0) && (DAC >= 0)){ //sign bit is not set increment DAC
cfscontrols2 0:c584a588c24f 508 DAC++;
cfscontrols2 0:c584a588c24f 509 }
cfscontrols2 0:c584a588c24f 510 else if ((sign > 0) && (DAC > 0)){ //sign bit is set decrement DAC because it is negative
cfscontrols2 0:c584a588c24f 511 DAC--;
cfscontrols2 0:c584a588c24f 512 }
cfscontrols2 0:c584a588c24f 513
cfscontrols2 0:c584a588c24f 514 }
cfscontrols2 0:c584a588c24f 515
cfscontrols2 0:c584a588c24f 516 else if(direction < 0){
cfscontrols2 0:c584a588c24f 517 //decrement DAC
cfscontrols2 0:c584a588c24f 518 if((sign == 0) && (DAC == 0)){ //sign bit is not set and DAC is already at 0
cfscontrols2 0:c584a588c24f 519 DAC = 1;
cfscontrols2 0:c584a588c24f 520 sign = 1;
cfscontrols2 0:c584a588c24f 521 }
cfscontrols2 0:c584a588c24f 522 else if((sign == 0) && (DAC > 0)){ //sign bit is not set increment DAC
cfscontrols2 0:c584a588c24f 523 DAC--;
cfscontrols2 0:c584a588c24f 524 }
cfscontrols2 0:c584a588c24f 525 else if ((sign > 0) && (DAC >= 0)){ //sign bit is set decrement DAC because it is negative
cfscontrols2 0:c584a588c24f 526 DAC++;
cfscontrols2 0:c584a588c24f 527 }
cfscontrols2 0:c584a588c24f 528
cfscontrols2 0:c584a588c24f 529 }
cfscontrols2 0:c584a588c24f 530
cfscontrols2 0:c584a588c24f 531 else{
cfscontrols2 0:c584a588c24f 532 //no change in direction
cfscontrols2 0:c584a588c24f 533 //do nothing
cfscontrols2 0:c584a588c24f 534 return DAC;
cfscontrols2 0:c584a588c24f 535 }
cfscontrols2 0:c584a588c24f 536
cfscontrols2 0:c584a588c24f 537 if(DAC > 31){
cfscontrols2 0:c584a588c24f 538 DAC = 31; //limit DAC to maximum value of 31 (5 bits)
cfscontrols2 0:c584a588c24f 539 }
cfscontrols2 0:c584a588c24f 540
cfscontrols2 0:c584a588c24f 541 if(sign > 0){
cfscontrols2 0:c584a588c24f 542 DAC |= 32; //set the sign bit of DAC
cfscontrols2 0:c584a588c24f 543 }
cfscontrols2 0:c584a588c24f 544
cfscontrols2 0:c584a588c24f 545 //update DAC
cfscontrols2 0:c584a588c24f 546 writeRegistry(DAC_REG, DAC);
cfscontrols2 0:c584a588c24f 547
cfscontrols2 0:c584a588c24f 548 return DAC;
cfscontrols2 0:c584a588c24f 549 }
cfscontrols2 0:c584a588c24f 550
cfscontrols2 0:c584a588c24f 551 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 552 //function to set the filtering SF setting
cfscontrols2 0:c584a588c24f 553 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 554 void AD7730::setFilterSF(int sf){
cfscontrols2 0:c584a588c24f 555
cfscontrols2 0:c584a588c24f 556 //get current filter setting
cfscontrols2 0:c584a588c24f 557 int filter = readRegistry(FILTER_REG);
cfscontrols2 0:c584a588c24f 558
cfscontrols2 0:c584a588c24f 559 //clear sf bits
cfscontrols2 0:c584a588c24f 560 filter &= 0xFFF;
cfscontrols2 0:c584a588c24f 561
cfscontrols2 0:c584a588c24f 562 //bitshift sf up by 12 bits
cfscontrols2 0:c584a588c24f 563 sf = sf << 12;
cfscontrols2 0:c584a588c24f 564
cfscontrols2 0:c584a588c24f 565 //or sf bits with filter bits
cfscontrols2 0:c584a588c24f 566 filter = filter | sf;
cfscontrols2 0:c584a588c24f 567
cfscontrols2 0:c584a588c24f 568 //apply new filter setting
cfscontrols2 0:c584a588c24f 569 writeRegistry(FILTER_REG, filter);
cfscontrols2 0:c584a588c24f 570 }
cfscontrols2 0:c584a588c24f 571
cfscontrols2 0:c584a588c24f 572 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 573 //function to set the filtering chop mode
cfscontrols2 0:c584a588c24f 574 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 575 void AD7730::setFilterChop(int enabled){
cfscontrols2 0:c584a588c24f 576
cfscontrols2 0:c584a588c24f 577 //get current filter setting
cfscontrols2 0:c584a588c24f 578 int filter = readRegistry(FILTER_REG);
cfscontrols2 0:c584a588c24f 579
cfscontrols2 0:c584a588c24f 580 //clear bit 5
cfscontrols2 0:c584a588c24f 581 filter &= ~0x10;
cfscontrols2 0:c584a588c24f 582
cfscontrols2 0:c584a588c24f 583 //apply chop setting
cfscontrols2 0:c584a588c24f 584 if(enabled)
cfscontrols2 0:c584a588c24f 585 filter |= 0x10;
cfscontrols2 0:c584a588c24f 586
cfscontrols2 0:c584a588c24f 587 //apply new filter setting
cfscontrols2 0:c584a588c24f 588 writeRegistry(FILTER_REG, filter);
cfscontrols2 0:c584a588c24f 589 }
cfscontrols2 0:c584a588c24f 590
cfscontrols2 0:c584a588c24f 591 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 592 //function to set the mode of the second filter
cfscontrols2 0:c584a588c24f 593 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 594 void AD7730::setFilterMode(int mode){
cfscontrols2 0:c584a588c24f 595
cfscontrols2 0:c584a588c24f 596 //get current filter setting
cfscontrols2 0:c584a588c24f 597 int filter = readRegistry(FILTER_REG);
cfscontrols2 0:c584a588c24f 598
cfscontrols2 0:c584a588c24f 599 //clear bits 9 & 10
cfscontrols2 0:c584a588c24f 600 filter &= ~0x300;
cfscontrols2 0:c584a588c24f 601
cfscontrols2 0:c584a588c24f 602 //apply mode setting
cfscontrols2 0:c584a588c24f 603 if(mode == 1){
cfscontrols2 0:c584a588c24f 604 filter |= 0x100; //apply fast mode
cfscontrols2 0:c584a588c24f 605 }
cfscontrols2 0:c584a588c24f 606 else if(mode == 2){
cfscontrols2 0:c584a588c24f 607 filter |= 0x200; //apply skip mode
cfscontrols2 0:c584a588c24f 608 }
cfscontrols2 0:c584a588c24f 609 else {
cfscontrols2 0:c584a588c24f 610 //leave both bits unset
cfscontrols2 0:c584a588c24f 611 }
cfscontrols2 0:c584a588c24f 612
cfscontrols2 0:c584a588c24f 613
cfscontrols2 0:c584a588c24f 614 //apply new filter setting
cfscontrols2 0:c584a588c24f 615 writeRegistry(FILTER_REG, filter);
cfscontrols2 0:c584a588c24f 616 }
cfscontrols2 0:c584a588c24f 617
cfscontrols2 0:c584a588c24f 618 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 619 //function to set the chip to continous conversion
cfscontrols2 0:c584a588c24f 620 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 621 void AD7730::start(void){
cfscontrols2 0:c584a588c24f 622
cfscontrols2 0:c584a588c24f 623 writeRegistry(MODE_REG, 0x3100); //set to continous conversion mode
cfscontrols2 0:c584a588c24f 624 _interruptReady = new InterruptIn(_readyPin);
cfscontrols2 0:c584a588c24f 625 _tmr.start();
cfscontrols2 0:c584a588c24f 626 _frequency = 0;
cfscontrols2 0:c584a588c24f 627 _interruptReady->fall(this, &AD7730::interruptRead);
cfscontrols2 0:c584a588c24f 628 }
cfscontrols2 0:c584a588c24f 629
cfscontrols2 0:c584a588c24f 630 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 631 //function to stop the chip running in continous conversion mode
cfscontrols2 0:c584a588c24f 632 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 633 void AD7730::stop(void){
cfscontrols2 0:c584a588c24f 634
cfscontrols2 0:c584a588c24f 635 writeRegistry(MODE_REG, 0x1100); //set to idle mode
cfscontrols2 0:c584a588c24f 636
cfscontrols2 0:c584a588c24f 637 _interruptReady = NULL;
cfscontrols2 0:c584a588c24f 638
cfscontrols2 0:c584a588c24f 639 }
cfscontrols2 0:c584a588c24f 640
cfscontrols2 0:c584a588c24f 641 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 642 //function to check if the ready digital line is low
cfscontrols2 0:c584a588c24f 643 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 644 bool AD7730::isReady(void){
cfscontrols2 0:c584a588c24f 645
cfscontrols2 0:c584a588c24f 646 //if digital line is high, return not ready
cfscontrols2 0:c584a588c24f 647 return (_readyDig)? false : true;
cfscontrols2 0:c584a588c24f 648
cfscontrols2 0:c584a588c24f 649 }
cfscontrols2 0:c584a588c24f 650
cfscontrols2 0:c584a588c24f 651 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 652 //function to read data on falling edge of ready pin when running in continous conversion mode
cfscontrols2 0:c584a588c24f 653 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 654 void AD7730::interruptRead(void){
cfscontrols2 0:c584a588c24f 655
cfscontrols2 0:c584a588c24f 656 _continous = true; //set flag indicating that chip is running in continous mode
cfscontrols2 0:c584a588c24f 657
cfscontrols2 0:c584a588c24f 658 _lastValue = readRegistry(DATA_REG);
cfscontrols2 0:c584a588c24f 659
cfscontrols2 0:c584a588c24f 660 //store data in circular buffer
cfscontrols2 0:c584a588c24f 661 _readBuffer[_bufferCount] = _lastValue;
cfscontrols2 0:c584a588c24f 662 if(_bufferCount < 99){
cfscontrols2 0:c584a588c24f 663 _bufferCount++;
cfscontrols2 0:c584a588c24f 664 }
cfscontrols2 0:c584a588c24f 665 else {
cfscontrols2 0:c584a588c24f 666 _bufferCount = 0;
cfscontrols2 0:c584a588c24f 667 }
cfscontrols2 0:c584a588c24f 668
cfscontrols2 0:c584a588c24f 669 //update conversion speed frequency
cfscontrols2 0:c584a588c24f 670 _frequency = _tmr.read_us();
cfscontrols2 0:c584a588c24f 671 _tmr.reset();
cfscontrols2 0:c584a588c24f 672 }
cfscontrols2 0:c584a588c24f 673
cfscontrols2 0:c584a588c24f 674 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 675 //function to return the hertz of the data conversion
cfscontrols2 0:c584a588c24f 676 /************************************************************************************************************************/
cfscontrols2 0:c584a588c24f 677 double AD7730::getHz(void){
cfscontrols2 0:c584a588c24f 678
cfscontrols2 0:c584a588c24f 679 return (1000000 / (double)_frequency);
cfscontrols2 0:c584a588c24f 680 }