Library to communicate with LDC1101

Dependents:   Inductive_Sensor Inductive_Sensor_Jasper Inductive_Sensor_3

Fork of LDC1000 by First Last

Committer:
bobgiesberts
Date:
Sat Jan 16 09:12:32 2016 +0000
Revision:
22:8da965ce5af3
Parent:
21:7c9e04e7d34f
Child:
23:8faeabb395db
Small changes to the sleep function, little bit of waiting

Who changed what in which revision?

UserRevisionLine numberNew 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 22:8da965ce5af3 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 22:8da965ce5af3 19
bobgiesberts 16:07d0e43c2d12 20 _spiport.format(8,3);
bobgiesberts 16:07d0e43c2d12 21 _spiport.frequency(1E6);
bobgiesberts 18:fc9bb81a631f 22 setFrequency(f_CLKIN);
bobgiesberts 16:07d0e43c2d12 23
bobgiesberts 16:07d0e43c2d12 24 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 25 wait_us(100);
bobgiesberts 16:07d0e43c2d12 26
bobgiesberts 16:07d0e43c2d12 27 init();
bobgiesberts 16:07d0e43c2d12 28 }
bobgiesberts 16:07d0e43c2d12 29
bobgiesberts 21:7c9e04e7d34f 30 void LDC1101::func_mode(LDC_MODE mode) { writeSPI((uint8_t *)(&mode), 0x0B); wait_ms(0.8); }
bobgiesberts 22:8da965ce5af3 31
bobgiesberts 22:8da965ce5af3 32 void LDC1101::sleep(void)
bobgiesberts 22:8da965ce5af3 33 {
bobgiesberts 22:8da965ce5af3 34 /* stop toggling the CLKIN pin input and drive the CLKIN pin Low */
bobgiesberts 22:8da965ce5af3 35 func_mode( LDC_MODE_SHUTDOWN );
bobgiesberts 22:8da965ce5af3 36 _cs_pin.write(0); // CSB down
bobgiesberts 22:8da965ce5af3 37
bobgiesberts 22:8da965ce5af3 38 suicide( this );
bobgiesberts 22:8da965ce5af3 39 }
bobgiesberts 22:8da965ce5af3 40 void LDC1101::wakeup(void) {
bobgiesberts 22:8da965ce5af3 41 /* start toggling the clock input on the CLKIN pin */
bobgiesberts 22:8da965ce5af3 42 init();
bobgiesberts 22:8da965ce5af3 43 wait(0.5);
bobgiesberts 22:8da965ce5af3 44 }
bobgiesberts 20:8e1b1efdbb49 45
bobgiesberts 20:8e1b1efdbb49 46
bobgiesberts 16:07d0e43c2d12 47 void LDC1101::init()
bobgiesberts 16:07d0e43c2d12 48 {
bobgiesberts 20:8e1b1efdbb49 49 /********* SETTINGS *****************
bobgiesberts 22:8da965ce5af3 50 ** C_sensor = 120 pF
bobgiesberts 22:8da965ce5af3 51 ** L_sensor = 5 uH
bobgiesberts 22:8da965ce5af3 52 ** Rp_min = 1500 Ohm
bobgiesberts 20:8e1b1efdbb49 53 **
bobgiesberts 20:8e1b1efdbb49 54 ** RCount = 65535
bobgiesberts 20:8e1b1efdbb49 55 ** Samplerate = 15.3 Hz
bobgiesberts 20:8e1b1efdbb49 56 ** t_conv = 65.5 ms
bobgiesberts 20:8e1b1efdbb49 57 **
bobgiesberts 20:8e1b1efdbb49 58 ** f_sensor_min = 6.4 MHz (d = inf)
bobgiesberts 20:8e1b1efdbb49 59 ** f_sensor_max = 10 MHz (d = 0)
bobgiesberts 20:8e1b1efdbb49 60 ** divider = (4*f_sensor_max)/f_CLKIN = 4*10/16 = 2,5 --> 2
bobgiesberts 20:8e1b1efdbb49 61 ************************************/
bobgiesberts 20:8e1b1efdbb49 62
bobgiesberts 20:8e1b1efdbb49 63
bobgiesberts 18:fc9bb81a631f 64 // Set LDC1101 in configuration modus
bobgiesberts 20:8e1b1efdbb49 65 func_mode( LDC_MODE_STANDBY ); // STANDBY = 0x01 naar 0x0B
bobgiesberts 18:fc9bb81a631f 66
bobgiesberts 20:8e1b1efdbb49 67 // - initialise LHR mode & enable SHUTDOWN mode
bobgiesberts 19:e205ab9142d8 68 setLHRmode();
bobgiesberts 16:07d0e43c2d12 69
bobgiesberts 19:e205ab9142d8 70 // - set ResponseTime to 6144
bobgiesberts 20:8e1b1efdbb49 71 setResponseTime( LDC_RESPONSE_6144 );
bobgiesberts 19:e205ab9142d8 72
bobgiesberts 20:8e1b1efdbb49 73 // - set Reference Count to highest resolution
bobgiesberts 20:8e1b1efdbb49 74 setReferenceCount( 0xffff );
bobgiesberts 20:8e1b1efdbb49 75
bobgiesberts 20:8e1b1efdbb49 76 // - set calibrated value for f_sensor_min (d = inf, no target)
bobgiesberts 20:8e1b1efdbb49 77 setf_sensorMin( 6.4 ); // 6.4 MHz
bobgiesberts 18:fc9bb81a631f 78
bobgiesberts 19:e205ab9142d8 79 // - disable RP_MAX
bobgiesberts 22:8da965ce5af3 80 // - set RP_MIN to 1,5 kOhm (RPMIN_1)
bobgiesberts 22:8da965ce5af3 81 setRPsettings( 1, RPMIN_1 );
bobgiesberts 16:07d0e43c2d12 82
bobgiesberts 19:e205ab9142d8 83 // - set Divider to 2
bobgiesberts 20:8e1b1efdbb49 84 setDivider( DIVIDER_2 );
bobgiesberts 18:fc9bb81a631f 85
bobgiesberts 18:fc9bb81a631f 86 // Done configuring settings, set LDC1101 in measuring modus
bobgiesberts 20:8e1b1efdbb49 87 func_mode( LDC_MODE_ACTIVE );
bobgiesberts 16:07d0e43c2d12 88 }
bobgiesberts 16:07d0e43c2d12 89
bobgiesberts 20:8e1b1efdbb49 90 void LDC1101::setLHRmode( void ){
bobgiesberts 20:8e1b1efdbb49 91 writeSPIregister( 0x05, 0x03 ); // ALT_CONFIG: 0000 0011 --> LHR modus + Shutdown enabled
bobgiesberts 20:8e1b1efdbb49 92 writeSPIregister( 0x0C, 0x01 ); // D_CONFIG: Enables LHR modus, disables RP
bobgiesberts 19:e205ab9142d8 93 }
bobgiesberts 19:e205ab9142d8 94
bobgiesberts 19:e205ab9142d8 95 void LDC1101::setRPsettings(bool RP_MAX_DIS, RPMIN rpmin)
bobgiesberts 19:e205ab9142d8 96 {
bobgiesberts 19:e205ab9142d8 97 float rpmins[] = {96, 48, 24, 12, 6, 3, 1.5, 0.75};
bobgiesberts 19:e205ab9142d8 98 _RPmin = rpmins[rpmin];
bobgiesberts 19:e205ab9142d8 99 writeSPIregister(0x01, ((RP_MAX_DIS & 0x80) << 7 | rpmin));
bobgiesberts 19:e205ab9142d8 100 }
bobgiesberts 19:e205ab9142d8 101
bobgiesberts 17:a5cf2b4bec13 102 void LDC1101::setDivider(DIVIDER div)
bobgiesberts 17:a5cf2b4bec13 103 {
bobgiesberts 19:e205ab9142d8 104 uint8_t divs[] = {1, 2, 4, 8};
bobgiesberts 19:e205ab9142d8 105 _divider = divs[div];
bobgiesberts 17:a5cf2b4bec13 106 writeSPIregister(0x34, div);
bobgiesberts 20:8e1b1efdbb49 107 }
bobgiesberts 20:8e1b1efdbb49 108
bobgiesberts 20:8e1b1efdbb49 109 void LDC1101::setResponseTime(LDC_RESPONSE responsetime)
bobgiesberts 20:8e1b1efdbb49 110 {
bobgiesberts 20:8e1b1efdbb49 111 uint16_t resps[] = {0, 0, 192, 384, 768, 1536, 3072, 6144};
bobgiesberts 20:8e1b1efdbb49 112 _responsetime = resps[responsetime];
bobgiesberts 20:8e1b1efdbb49 113 uint8_t buffer[1];
bobgiesberts 20:8e1b1efdbb49 114 readSPI(buffer, 0x04, 1);
bobgiesberts 20:8e1b1efdbb49 115 writeSPIregister(0x04, (buffer[0] & 0xF8) + responsetime);
bobgiesberts 20:8e1b1efdbb49 116 }
bobgiesberts 20:8e1b1efdbb49 117
bobgiesberts 20:8e1b1efdbb49 118 void LDC1101::setReferenceCount(uint16_t rcount)
bobgiesberts 20:8e1b1efdbb49 119 {
bobgiesberts 20:8e1b1efdbb49 120 _Rcount = rcount;
bobgiesberts 20:8e1b1efdbb49 121 uint8_t LHR_RCOUNT_LSB = (rcount & 0x00ff);
bobgiesberts 20:8e1b1efdbb49 122 uint8_t LHR_RCOUNT_MSB = ((rcount & 0xff00) >> 8);
bobgiesberts 20:8e1b1efdbb49 123 writeSPIregister(0x30, LHR_RCOUNT_LSB); //LSB
bobgiesberts 20:8e1b1efdbb49 124 writeSPIregister(0x31, LHR_RCOUNT_MSB); //MSB
bobgiesberts 20:8e1b1efdbb49 125 }
bobgiesberts 20:8e1b1efdbb49 126
bobgiesberts 20:8e1b1efdbb49 127 void LDC1101::setSampleRate(float samplerate){ setReferenceCount( ((_fCLKIN/samplerate)-55)/16 ); }
bobgiesberts 17:a5cf2b4bec13 128
bobgiesberts 17:a5cf2b4bec13 129
bobgiesberts 20:8e1b1efdbb49 130 void LDC1101::setf_sensorMin(float f_sensor_min)
bobgiesberts 16:07d0e43c2d12 131 {
bobgiesberts 20:8e1b1efdbb49 132 uint8_t buffer[1];
bobgiesberts 20:8e1b1efdbb49 133 readSPI(buffer, 0x04, 1);
bobgiesberts 20:8e1b1efdbb49 134 uint8_t MIN_FREQ = 16 - (8 / f_sensor_min);
bobgiesberts 20:8e1b1efdbb49 135 writeSPIregister(0x04, ((buffer[0] & 0x0F) + (MIN_FREQ << 4)));
bobgiesberts 20:8e1b1efdbb49 136 }
bobgiesberts 20:8e1b1efdbb49 137
bobgiesberts 22:8da965ce5af3 138 bool LDC1101::is_New_LHR_data(void)
bobgiesberts 22:8da965ce5af3 139 {
bobgiesberts 22:8da965ce5af3 140 return(~(get_LHR_status() & 0x01));
bobgiesberts 22:8da965ce5af3 141 }
bobgiesberts 20:8e1b1efdbb49 142
bobgiesberts 22:8da965ce5af3 143 bool LDC1101::is_Oscillation_Error(void)
bobgiesberts 22:8da965ce5af3 144 {
bobgiesberts 22:8da965ce5af3 145 return(get_status() & 0x80);
bobgiesberts 22:8da965ce5af3 146 }
bobgiesberts 20:8e1b1efdbb49 147
bobgiesberts 22:8da965ce5af3 148 uint8_t LDC1101::get_status(void)
bobgiesberts 22:8da965ce5af3 149 {
bobgiesberts 22:8da965ce5af3 150
bobgiesberts 22:8da965ce5af3 151 uint8_t buffer[1];
bobgiesberts 22:8da965ce5af3 152 readSPI(buffer, 0x20, 1);
bobgiesberts 22:8da965ce5af3 153
bobgiesberts 22:8da965ce5af3 154 return buffer[0];
bobgiesberts 22:8da965ce5af3 155 }
bobgiesberts 20:8e1b1efdbb49 156
bobgiesberts 22:8da965ce5af3 157 uint8_t LDC1101::get_LHR_status(void)
bobgiesberts 22:8da965ce5af3 158 {
bobgiesberts 22:8da965ce5af3 159 uint8_t buffer[1];
bobgiesberts 22:8da965ce5af3 160 readSPI(buffer, 0x3B, 1);
bobgiesberts 22:8da965ce5af3 161 return buffer[0];
bobgiesberts 22:8da965ce5af3 162 }
bobgiesberts 20:8e1b1efdbb49 163
bobgiesberts 20:8e1b1efdbb49 164 float LDC1101::get_Q(void){ return _RPmin * sqrt(_cap/_inductance*1000000); }
bobgiesberts 16:07d0e43c2d12 165
bobgiesberts 19:e205ab9142d8 166
bobgiesberts 19:e205ab9142d8 167 float LDC1101::get_fsensor(void)
bobgiesberts 16:07d0e43c2d12 168 {
bobgiesberts 18:fc9bb81a631f 169 _L_data = get_LHR_Data();
bobgiesberts 18:fc9bb81a631f 170 _fsensor = _fCLKIN * _divider * _L_data/16777216; // (p.26)
bobgiesberts 18:fc9bb81a631f 171 return _fsensor;
bobgiesberts 19:e205ab9142d8 172 }
bobgiesberts 18:fc9bb81a631f 173
bobgiesberts 18:fc9bb81a631f 174
bobgiesberts 19:e205ab9142d8 175 float LDC1101::get_Inductance(void)
bobgiesberts 18:fc9bb81a631f 176 {
bobgiesberts 18:fc9bb81a631f 177 _fsensor = get_fsensor();
bobgiesberts 18:fc9bb81a631f 178 // 1
bobgiesberts 18:fc9bb81a631f 179 // L = --------------------- --> p. 34
bobgiesberts 18:fc9bb81a631f 180 // C * (2*PI*f_sensor)^2
bobgiesberts 20:8e1b1efdbb49 181 _inductance = 1./(_cap * 4*PI*PI*_fsensor*_fsensor); // (p.34)
bobgiesberts 19:e205ab9142d8 182 return _inductance;
bobgiesberts 19:e205ab9142d8 183 }
bobgiesberts 16:07d0e43c2d12 184
bobgiesberts 16:07d0e43c2d12 185
bobgiesberts 18:fc9bb81a631f 186 uint32_t LDC1101::get_LHR_Data(void)
bobgiesberts 16:07d0e43c2d12 187 {
bobgiesberts 18:fc9bb81a631f 188 uint8_t LHR_DATA[3];
bobgiesberts 18:fc9bb81a631f 189 readSPI(LHR_DATA, 0x38, 3); // 0x38 + 0x39 + 0x3A
bobgiesberts 20:8e1b1efdbb49 190 return (LHR_DATA[2]<<16) | (LHR_DATA[1]<<8) | LHR_DATA[0];
bobgiesberts 16:07d0e43c2d12 191 }
bobgiesberts 16:07d0e43c2d12 192
bobgiesberts 16:07d0e43c2d12 193 void LDC1101::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
bobgiesberts 16:07d0e43c2d12 194 {
bobgiesberts 16:07d0e43c2d12 195 // CSB down
bobgiesberts 16:07d0e43c2d12 196 _cs_pin.write(0);
bobgiesberts 16:07d0e43c2d12 197 _spiport.write(address | 0x80); //read flag
bobgiesberts 16:07d0e43c2d12 198 for(int i=0; i < num_bytes ; i++)
bobgiesberts 16:07d0e43c2d12 199 {
bobgiesberts 16:07d0e43c2d12 200 data[i] = _spiport.write(0xFF);
bobgiesberts 16:07d0e43c2d12 201 }
bobgiesberts 16:07d0e43c2d12 202 // CSB up
bobgiesberts 16:07d0e43c2d12 203 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 204 }
bobgiesberts 16:07d0e43c2d12 205
bobgiesberts 16:07d0e43c2d12 206 void LDC1101::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
bobgiesberts 16:07d0e43c2d12 207 {
bobgiesberts 16:07d0e43c2d12 208 // CSB down
bobgiesberts 16:07d0e43c2d12 209 _cs_pin.write(0);
bobgiesberts 16:07d0e43c2d12 210
bobgiesberts 16:07d0e43c2d12 211 _spiport.write(address);
bobgiesberts 16:07d0e43c2d12 212 for(int i=0; i < num_bytes ; i++)
bobgiesberts 16:07d0e43c2d12 213 {
bobgiesberts 16:07d0e43c2d12 214 _spiport.write(data[i]);
bobgiesberts 16:07d0e43c2d12 215 }
bobgiesberts 16:07d0e43c2d12 216 // CSB up
bobgiesberts 16:07d0e43c2d12 217 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 218 }
bobgiesberts 16:07d0e43c2d12 219
bobgiesberts 16:07d0e43c2d12 220
bobgiesberts 16:07d0e43c2d12 221 // EXTRA test: Get&print values of all variables to verify (to calculate the induction)
bobgiesberts 16:07d0e43c2d12 222 // The data will be printed on the screen using RealTerm: baud 9600.
bobgiesberts 16:07d0e43c2d12 223 // Begin ***********************************************************
bobgiesberts 19:e205ab9142d8 224 float LDC1101::get_fCLKIN() {return _fCLKIN;};
bobgiesberts 19:e205ab9142d8 225 uint8_t LDC1101::get_divider() {return _divider;};
bobgiesberts 19:e205ab9142d8 226 float LDC1101::get_RPmin() {return _RPmin;};
bobgiesberts 19:e205ab9142d8 227 float LDC1101::get_cap() {return _cap;};
bobgiesberts 16:07d0e43c2d12 228 // END ***********************************************************