Library to communicate with LDC1614
Dependents: Inductive_Sensor_3
Fork of LDC1101 by
LDC1101.cpp@20:8e1b1efdbb49, 2015-12-18 (annotated)
- Committer:
- bobgiesberts
- Date:
- Fri Dec 18 15:49:12 2015 +0000
- Revision:
- 20:8e1b1efdbb49
- Parent:
- 19:e205ab9142d8
- Child:
- 21:7c9e04e7d34f
Tweaking internal sensor settings. Found optimal settings for RCount, FREQ_MIN and ResponseTime. Cleaned up a lot of mess
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bobgiesberts | 16:07d0e43c2d12 | 1 | /** |
bobgiesberts | 16:07d0e43c2d12 | 2 | * @file LDC1101.cpp |
bobgiesberts | 16:07d0e43c2d12 | 3 | * @brief this C++ file contains all required |
bobgiesberts | 16:07d0e43c2d12 | 4 | * functions to interface with Texas |
bobgiesberts | 16:07d0e43c2d12 | 5 | * Instruments' LDC1101. |
bobgiesberts | 16:07d0e43c2d12 | 6 | * |
bobgiesberts | 20:8e1b1efdbb49 | 7 | * @author Victor Sluiter & Bob Giesberts |
bobgiesberts | 16:07d0e43c2d12 | 8 | * |
bobgiesberts | 16:07d0e43c2d12 | 9 | * @date 2015-12-09 |
bobgiesberts | 16:07d0e43c2d12 | 10 | */ |
bobgiesberts | 16:07d0e43c2d12 | 11 | |
bobgiesberts | 16:07d0e43c2d12 | 12 | #include "LDC1101.h" |
bobgiesberts | 16:07d0e43c2d12 | 13 | |
bobgiesberts | 16:07d0e43c2d12 | 14 | |
bobgiesberts | 18:fc9bb81a631f | 15 | LDC1101::LDC1101(PinName mosi, PinName miso, PinName sck, PinName cs, float capacitor, float f_CLKIN, PinName clock_out) : _spiport(mosi,miso,sck, NC), _cs_pin(cs)//, _clock(clock_out,1) |
bobgiesberts | 16:07d0e43c2d12 | 16 | { |
bobgiesberts | 18:fc9bb81a631f | 17 | // settings |
bobgiesberts | 19:e205ab9142d8 | 18 | _cap = capacitor; |
bobgiesberts | 16:07d0e43c2d12 | 19 | _spiport.format(8,3); |
bobgiesberts | 16:07d0e43c2d12 | 20 | _spiport.frequency(1E6); |
bobgiesberts | 18:fc9bb81a631f | 21 | setFrequency(f_CLKIN); |
bobgiesberts | 16:07d0e43c2d12 | 22 | |
bobgiesberts | 16:07d0e43c2d12 | 23 | _cs_pin.write(1); |
bobgiesberts | 16:07d0e43c2d12 | 24 | wait_us(100); |
bobgiesberts | 16:07d0e43c2d12 | 25 | |
bobgiesberts | 16:07d0e43c2d12 | 26 | init(); |
bobgiesberts | 16:07d0e43c2d12 | 27 | } |
bobgiesberts | 16:07d0e43c2d12 | 28 | |
bobgiesberts | 20:8e1b1efdbb49 | 29 | void LDC1101::func_mode(LDC_MODE mode) { writeSPI((uint8_t *)(&mode), 0x0B); wait(0.1); } |
bobgiesberts | 20:8e1b1efdbb49 | 30 | void LDC1101::sleep(void) { /* stop toggling the CLKIN pin input and drive the CLKIN pin Low */ func_mode(LDC_MODE_SHUTDOWN); } |
bobgiesberts | 20:8e1b1efdbb49 | 31 | void LDC1101::wakeup(void) { /* start toggling the clock input on the CLKIN pin */ init(); } |
bobgiesberts | 20:8e1b1efdbb49 | 32 | |
bobgiesberts | 20:8e1b1efdbb49 | 33 | |
bobgiesberts | 16:07d0e43c2d12 | 34 | void LDC1101::init() |
bobgiesberts | 16:07d0e43c2d12 | 35 | { |
bobgiesberts | 20:8e1b1efdbb49 | 36 | /********* SETTINGS ***************** |
bobgiesberts | 20:8e1b1efdbb49 | 37 | ** C_sensor = 120 pF |
bobgiesberts | 20:8e1b1efdbb49 | 38 | ** L_sensor = 5 uH |
bobgiesberts | 20:8e1b1efdbb49 | 39 | ** Rs = ??? Ohm |
bobgiesberts | 20:8e1b1efdbb49 | 40 | ** Rp_min = ??? Ohm |
bobgiesberts | 20:8e1b1efdbb49 | 41 | ** |
bobgiesberts | 20:8e1b1efdbb49 | 42 | ** RCount = 65535 |
bobgiesberts | 20:8e1b1efdbb49 | 43 | ** Samplerate = 15.3 Hz |
bobgiesberts | 20:8e1b1efdbb49 | 44 | ** t_conv = 65.5 ms |
bobgiesberts | 20:8e1b1efdbb49 | 45 | ** |
bobgiesberts | 20:8e1b1efdbb49 | 46 | ** f_sensor_min = 6.4 MHz (d = inf) |
bobgiesberts | 20:8e1b1efdbb49 | 47 | ** f_sensor_max = 10 MHz (d = 0) |
bobgiesberts | 20:8e1b1efdbb49 | 48 | ** divider = (4*f_sensor_max)/f_CLKIN = 4*10/16 = 2,5 --> 2 |
bobgiesberts | 20:8e1b1efdbb49 | 49 | ************************************/ |
bobgiesberts | 20:8e1b1efdbb49 | 50 | |
bobgiesberts | 20:8e1b1efdbb49 | 51 | |
bobgiesberts | 18:fc9bb81a631f | 52 | // Set LDC1101 in configuration modus |
bobgiesberts | 20:8e1b1efdbb49 | 53 | func_mode( LDC_MODE_STANDBY ); // STANDBY = 0x01 naar 0x0B |
bobgiesberts | 18:fc9bb81a631f | 54 | |
bobgiesberts | 20:8e1b1efdbb49 | 55 | // - initialise LHR mode & enable SHUTDOWN mode |
bobgiesberts | 19:e205ab9142d8 | 56 | setLHRmode(); |
bobgiesberts | 16:07d0e43c2d12 | 57 | |
bobgiesberts | 19:e205ab9142d8 | 58 | // - set ResponseTime to 6144 |
bobgiesberts | 20:8e1b1efdbb49 | 59 | setResponseTime( LDC_RESPONSE_6144 ); |
bobgiesberts | 19:e205ab9142d8 | 60 | |
bobgiesberts | 20:8e1b1efdbb49 | 61 | // - set Reference Count to highest resolution |
bobgiesberts | 20:8e1b1efdbb49 | 62 | setReferenceCount( 0xffff ); |
bobgiesberts | 20:8e1b1efdbb49 | 63 | |
bobgiesberts | 20:8e1b1efdbb49 | 64 | // - set calibrated value for f_sensor_min (d = inf, no target) |
bobgiesberts | 20:8e1b1efdbb49 | 65 | setf_sensorMin( 6.4 ); // 6.4 MHz |
bobgiesberts | 18:fc9bb81a631f | 66 | |
bobgiesberts | 19:e205ab9142d8 | 67 | // - disable RP_MAX |
bobgiesberts | 19:e205ab9142d8 | 68 | // - set RP_MIN to 3 kOhm |
bobgiesberts | 20:8e1b1efdbb49 | 69 | setRPsettings( 1, RPMIN_12 ); |
bobgiesberts | 16:07d0e43c2d12 | 70 | |
bobgiesberts | 19:e205ab9142d8 | 71 | // - set Divider to 2 |
bobgiesberts | 20:8e1b1efdbb49 | 72 | setDivider( DIVIDER_2 ); |
bobgiesberts | 18:fc9bb81a631f | 73 | |
bobgiesberts | 18:fc9bb81a631f | 74 | // Done configuring settings, set LDC1101 in measuring modus |
bobgiesberts | 20:8e1b1efdbb49 | 75 | func_mode( LDC_MODE_ACTIVE ); |
bobgiesberts | 16:07d0e43c2d12 | 76 | } |
bobgiesberts | 16:07d0e43c2d12 | 77 | |
bobgiesberts | 20:8e1b1efdbb49 | 78 | void LDC1101::setLHRmode( void ){ |
bobgiesberts | 20:8e1b1efdbb49 | 79 | writeSPIregister( 0x05, 0x03 ); // ALT_CONFIG: 0000 0011 --> LHR modus + Shutdown enabled |
bobgiesberts | 20:8e1b1efdbb49 | 80 | writeSPIregister( 0x0C, 0x01 ); // D_CONFIG: Enables LHR modus, disables RP |
bobgiesberts | 19:e205ab9142d8 | 81 | } |
bobgiesberts | 19:e205ab9142d8 | 82 | |
bobgiesberts | 19:e205ab9142d8 | 83 | void LDC1101::setRPsettings(bool RP_MAX_DIS, RPMIN rpmin) |
bobgiesberts | 19:e205ab9142d8 | 84 | { |
bobgiesberts | 19:e205ab9142d8 | 85 | float rpmins[] = {96, 48, 24, 12, 6, 3, 1.5, 0.75}; |
bobgiesberts | 19:e205ab9142d8 | 86 | _RPmin = rpmins[rpmin]; |
bobgiesberts | 19:e205ab9142d8 | 87 | writeSPIregister(0x01, ((RP_MAX_DIS & 0x80) << 7 | rpmin)); |
bobgiesberts | 19:e205ab9142d8 | 88 | } |
bobgiesberts | 19:e205ab9142d8 | 89 | |
bobgiesberts | 17:a5cf2b4bec13 | 90 | void LDC1101::setDivider(DIVIDER div) |
bobgiesberts | 17:a5cf2b4bec13 | 91 | { |
bobgiesberts | 19:e205ab9142d8 | 92 | uint8_t divs[] = {1, 2, 4, 8}; |
bobgiesberts | 19:e205ab9142d8 | 93 | _divider = divs[div]; |
bobgiesberts | 17:a5cf2b4bec13 | 94 | writeSPIregister(0x34, div); |
bobgiesberts | 20:8e1b1efdbb49 | 95 | } |
bobgiesberts | 20:8e1b1efdbb49 | 96 | |
bobgiesberts | 20:8e1b1efdbb49 | 97 | void LDC1101::setResponseTime(LDC_RESPONSE responsetime) |
bobgiesberts | 20:8e1b1efdbb49 | 98 | { |
bobgiesberts | 20:8e1b1efdbb49 | 99 | uint16_t resps[] = {0, 0, 192, 384, 768, 1536, 3072, 6144}; |
bobgiesberts | 20:8e1b1efdbb49 | 100 | _responsetime = resps[responsetime]; |
bobgiesberts | 20:8e1b1efdbb49 | 101 | uint8_t buffer[1]; |
bobgiesberts | 20:8e1b1efdbb49 | 102 | readSPI(buffer, 0x04, 1); |
bobgiesberts | 20:8e1b1efdbb49 | 103 | writeSPIregister(0x04, (buffer[0] & 0xF8) + responsetime); |
bobgiesberts | 20:8e1b1efdbb49 | 104 | } |
bobgiesberts | 20:8e1b1efdbb49 | 105 | |
bobgiesberts | 20:8e1b1efdbb49 | 106 | void LDC1101::setReferenceCount(uint16_t rcount) |
bobgiesberts | 20:8e1b1efdbb49 | 107 | { |
bobgiesberts | 20:8e1b1efdbb49 | 108 | _Rcount = rcount; |
bobgiesberts | 20:8e1b1efdbb49 | 109 | uint8_t LHR_RCOUNT_LSB = (rcount & 0x00ff); |
bobgiesberts | 20:8e1b1efdbb49 | 110 | uint8_t LHR_RCOUNT_MSB = ((rcount & 0xff00) >> 8); |
bobgiesberts | 20:8e1b1efdbb49 | 111 | writeSPIregister(0x30, LHR_RCOUNT_LSB); //LSB |
bobgiesberts | 20:8e1b1efdbb49 | 112 | writeSPIregister(0x31, LHR_RCOUNT_MSB); //MSB |
bobgiesberts | 20:8e1b1efdbb49 | 113 | } |
bobgiesberts | 20:8e1b1efdbb49 | 114 | |
bobgiesberts | 20:8e1b1efdbb49 | 115 | void LDC1101::setSampleRate(float samplerate){ setReferenceCount( ((_fCLKIN/samplerate)-55)/16 ); } |
bobgiesberts | 17:a5cf2b4bec13 | 116 | |
bobgiesberts | 17:a5cf2b4bec13 | 117 | |
bobgiesberts | 20:8e1b1efdbb49 | 118 | void LDC1101::setf_sensorMin(float f_sensor_min) |
bobgiesberts | 16:07d0e43c2d12 | 119 | { |
bobgiesberts | 20:8e1b1efdbb49 | 120 | uint8_t buffer[1]; |
bobgiesberts | 20:8e1b1efdbb49 | 121 | readSPI(buffer, 0x04, 1); |
bobgiesberts | 20:8e1b1efdbb49 | 122 | uint8_t MIN_FREQ = 16 - (8 / f_sensor_min); |
bobgiesberts | 20:8e1b1efdbb49 | 123 | writeSPIregister(0x04, ((buffer[0] & 0x0F) + (MIN_FREQ << 4))); |
bobgiesberts | 20:8e1b1efdbb49 | 124 | } |
bobgiesberts | 20:8e1b1efdbb49 | 125 | |
bobgiesberts | 20:8e1b1efdbb49 | 126 | |
bobgiesberts | 20:8e1b1efdbb49 | 127 | |
bobgiesberts | 20:8e1b1efdbb49 | 128 | |
bobgiesberts | 20:8e1b1efdbb49 | 129 | |
bobgiesberts | 20:8e1b1efdbb49 | 130 | |
bobgiesberts | 20:8e1b1efdbb49 | 131 | float LDC1101::get_Q(void){ return _RPmin * sqrt(_cap/_inductance*1000000); } |
bobgiesberts | 16:07d0e43c2d12 | 132 | |
bobgiesberts | 19:e205ab9142d8 | 133 | |
bobgiesberts | 19:e205ab9142d8 | 134 | float LDC1101::get_fsensor(void) |
bobgiesberts | 16:07d0e43c2d12 | 135 | { |
bobgiesberts | 18:fc9bb81a631f | 136 | _L_data = get_LHR_Data(); |
bobgiesberts | 18:fc9bb81a631f | 137 | _fsensor = _fCLKIN * _divider * _L_data/16777216; // (p.26) |
bobgiesberts | 18:fc9bb81a631f | 138 | return _fsensor; |
bobgiesberts | 19:e205ab9142d8 | 139 | } |
bobgiesberts | 18:fc9bb81a631f | 140 | |
bobgiesberts | 18:fc9bb81a631f | 141 | |
bobgiesberts | 19:e205ab9142d8 | 142 | float LDC1101::get_Inductance(void) |
bobgiesberts | 18:fc9bb81a631f | 143 | { |
bobgiesberts | 18:fc9bb81a631f | 144 | _fsensor = get_fsensor(); |
bobgiesberts | 18:fc9bb81a631f | 145 | // 1 |
bobgiesberts | 18:fc9bb81a631f | 146 | // L = --------------------- --> p. 34 |
bobgiesberts | 18:fc9bb81a631f | 147 | // C * (2*PI*f_sensor)^2 |
bobgiesberts | 20:8e1b1efdbb49 | 148 | _inductance = 1./(_cap * 4*PI*PI*_fsensor*_fsensor); // (p.34) |
bobgiesberts | 19:e205ab9142d8 | 149 | return _inductance; |
bobgiesberts | 19:e205ab9142d8 | 150 | } |
bobgiesberts | 16:07d0e43c2d12 | 151 | |
bobgiesberts | 16:07d0e43c2d12 | 152 | |
bobgiesberts | 18:fc9bb81a631f | 153 | uint32_t LDC1101::get_LHR_Data(void) |
bobgiesberts | 16:07d0e43c2d12 | 154 | { |
bobgiesberts | 18:fc9bb81a631f | 155 | uint8_t LHR_DATA[3]; |
bobgiesberts | 18:fc9bb81a631f | 156 | readSPI(LHR_DATA, 0x38, 3); // 0x38 + 0x39 + 0x3A |
bobgiesberts | 20:8e1b1efdbb49 | 157 | return (LHR_DATA[2]<<16) | (LHR_DATA[1]<<8) | LHR_DATA[0]; |
bobgiesberts | 16:07d0e43c2d12 | 158 | } |
bobgiesberts | 16:07d0e43c2d12 | 159 | |
bobgiesberts | 16:07d0e43c2d12 | 160 | void LDC1101::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes) |
bobgiesberts | 16:07d0e43c2d12 | 161 | { |
bobgiesberts | 16:07d0e43c2d12 | 162 | // CSB down |
bobgiesberts | 16:07d0e43c2d12 | 163 | _cs_pin.write(0); |
bobgiesberts | 16:07d0e43c2d12 | 164 | _spiport.write(address | 0x80); //read flag |
bobgiesberts | 16:07d0e43c2d12 | 165 | for(int i=0; i < num_bytes ; i++) |
bobgiesberts | 16:07d0e43c2d12 | 166 | { |
bobgiesberts | 16:07d0e43c2d12 | 167 | data[i] = _spiport.write(0xFF); |
bobgiesberts | 16:07d0e43c2d12 | 168 | } |
bobgiesberts | 16:07d0e43c2d12 | 169 | // CSB up |
bobgiesberts | 16:07d0e43c2d12 | 170 | _cs_pin.write(1); |
bobgiesberts | 16:07d0e43c2d12 | 171 | } |
bobgiesberts | 16:07d0e43c2d12 | 172 | |
bobgiesberts | 16:07d0e43c2d12 | 173 | void LDC1101::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes) |
bobgiesberts | 16:07d0e43c2d12 | 174 | { |
bobgiesberts | 16:07d0e43c2d12 | 175 | // CSB down |
bobgiesberts | 16:07d0e43c2d12 | 176 | _cs_pin.write(0); |
bobgiesberts | 16:07d0e43c2d12 | 177 | |
bobgiesberts | 16:07d0e43c2d12 | 178 | _spiport.write(address); |
bobgiesberts | 16:07d0e43c2d12 | 179 | for(int i=0; i < num_bytes ; i++) |
bobgiesberts | 16:07d0e43c2d12 | 180 | { |
bobgiesberts | 16:07d0e43c2d12 | 181 | _spiport.write(data[i]); |
bobgiesberts | 16:07d0e43c2d12 | 182 | } |
bobgiesberts | 16:07d0e43c2d12 | 183 | // CSB up |
bobgiesberts | 16:07d0e43c2d12 | 184 | _cs_pin.write(1); |
bobgiesberts | 16:07d0e43c2d12 | 185 | } |
bobgiesberts | 16:07d0e43c2d12 | 186 | |
bobgiesberts | 16:07d0e43c2d12 | 187 | |
bobgiesberts | 16:07d0e43c2d12 | 188 | // EXTRA test: Get&print values of all variables to verify (to calculate the induction) |
bobgiesberts | 16:07d0e43c2d12 | 189 | // The data will be printed on the screen using RealTerm: baud 9600. |
bobgiesberts | 16:07d0e43c2d12 | 190 | // Begin *********************************************************** |
bobgiesberts | 19:e205ab9142d8 | 191 | float LDC1101::get_fCLKIN() {return _fCLKIN;}; |
bobgiesberts | 19:e205ab9142d8 | 192 | uint8_t LDC1101::get_divider() {return _divider;}; |
bobgiesberts | 19:e205ab9142d8 | 193 | float LDC1101::get_RPmin() {return _RPmin;}; |
bobgiesberts | 19:e205ab9142d8 | 194 | float LDC1101::get_cap() {return _cap;}; |
bobgiesberts | 16:07d0e43c2d12 | 195 | // END *********************************************************** |