Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of AD7730 by
AD7730.cpp@1:82872c4221fc, 2015-03-17 (annotated)
- Committer:
- frada
- Date:
- Tue Mar 17 12:13:39 2015 +0000
- Revision:
- 1:82872c4221fc
- Parent:
- 0:c584a588c24f
-
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |
