Library to communicate with LDC1614

Dependencies:   SHTx

Dependents:   Inductive_Sensor_3

Fork of LDC1101 by Bob Giesberts

Committer:
bobgiesberts
Date:
Sat Dec 12 11:26:23 2015 +0000
Revision:
17:a5cf2b4bec13
Parent:
16:07d0e43c2d12
Child:
18:fc9bb81a631f
Including SD File system

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 16:07d0e43c2d12 7 * @author Victor Sluiter
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 17:a5cf2b4bec13 15 LDC1101::LDC1101(PinName mosi, PinName miso, PinName sck, PinName cs, float capacitor, float f_external, PinName clock_out) : _spiport(mosi,miso,sck, NC), _cs_pin(cs)//, _clock(clock_out,1)
bobgiesberts 16:07d0e43c2d12 16 {
bobgiesberts 16:07d0e43c2d12 17
bobgiesberts 16:07d0e43c2d12 18 cap = capacitor;
bobgiesberts 16:07d0e43c2d12 19 _spiport.format(8,3);
bobgiesberts 16:07d0e43c2d12 20 _spiport.frequency(1E6);
bobgiesberts 16:07d0e43c2d12 21 setFrequency(f_external);
bobgiesberts 16:07d0e43c2d12 22
bobgiesberts 16:07d0e43c2d12 23 // ---CSB must go low before accessing first address???
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 16:07d0e43c2d12 30 void LDC1101::init()
bobgiesberts 16:07d0e43c2d12 31 {
bobgiesberts 16:07d0e43c2d12 32 // configuration
bobgiesberts 16:07d0e43c2d12 33 mode(LDC_MODE_STANDBY); // 0x01 naar 0x0B
bobgiesberts 16:07d0e43c2d12 34
bobgiesberts 16:07d0e43c2d12 35 wait(0.1);
bobgiesberts 16:07d0e43c2d12 36 wait_us(10);
bobgiesberts 16:07d0e43c2d12 37
bobgiesberts 16:07d0e43c2d12 38 setResponseTime(LDC_RESPONSE_6144);
bobgiesberts 17:a5cf2b4bec13 39 setDivider(DIVIDER_1);
bobgiesberts 16:07d0e43c2d12 40
bobgiesberts 16:07d0e43c2d12 41 // L-Only Measurement
bobgiesberts 16:07d0e43c2d12 42 writeSPIregister(0x05, 0x03); // ALT_CONFIG: clock config >> we get 0x00 if this line is disabled and the cable is reconnected
bobgiesberts 16:07d0e43c2d12 43 writeSPIregister(0x0C, 0x01); // D_CONF: Register 0x0C enables a function that can improve L measurements while disabling RP measurements
bobgiesberts 16:07d0e43c2d12 44
bobgiesberts 16:07d0e43c2d12 45 // High Resolution Reference Count
bobgiesberts 16:07d0e43c2d12 46 // LHR_COUNT_LSB: 0xff naar 0x30 ???
bobgiesberts 16:07d0e43c2d12 47 // LHR_COUNT_MSB: 0xff naar 0x31 ???
bobgiesberts 16:07d0e43c2d12 48
bobgiesberts 16:07d0e43c2d12 49 // Start measuring
bobgiesberts 16:07d0e43c2d12 50 mode(LDC_MODE_ACTIVE); // 0x00 naar 0x0B
bobgiesberts 16:07d0e43c2d12 51 }
bobgiesberts 16:07d0e43c2d12 52
bobgiesberts 16:07d0e43c2d12 53 void LDC1101::setResponseTime(LDC_RESPONSE responsetime)
bobgiesberts 16:07d0e43c2d12 54 {
bobgiesberts 16:07d0e43c2d12 55 _responsetime = responsetime;
bobgiesberts 16:07d0e43c2d12 56 writeSPIregister(0x04, responsetime);
bobgiesberts 16:07d0e43c2d12 57 }
bobgiesberts 16:07d0e43c2d12 58
bobgiesberts 17:a5cf2b4bec13 59 void LDC1101::setDivider(DIVIDER div)
bobgiesberts 17:a5cf2b4bec13 60 {
bobgiesberts 17:a5cf2b4bec13 61 // _divider = (float) pow(2, div);
bobgiesberts 17:a5cf2b4bec13 62 writeSPIregister(0x34, div);
bobgiesberts 17:a5cf2b4bec13 63 }
bobgiesberts 17:a5cf2b4bec13 64
bobgiesberts 17:a5cf2b4bec13 65
bobgiesberts 16:07d0e43c2d12 66 void LDC1101::setFrequency(float frequency)
bobgiesberts 16:07d0e43c2d12 67 {
bobgiesberts 16:07d0e43c2d12 68 _frequency = frequency;
bobgiesberts 17:a5cf2b4bec13 69 //_clock.period(1.0/frequency);
bobgiesberts 17:a5cf2b4bec13 70 //_clock.pulsewidth(0.5/frequency);
bobgiesberts 16:07d0e43c2d12 71 }
bobgiesberts 16:07d0e43c2d12 72
bobgiesberts 16:07d0e43c2d12 73 float LDC1101::getInductance()
bobgiesberts 16:07d0e43c2d12 74 {
bobgiesberts 16:07d0e43c2d12 75 uint16_t resp[] = {0,0,192, 384, 768, 1536, 3072, 6144};
bobgiesberts 16:07d0e43c2d12 76 _raw_l = readRawCounts();
bobgiesberts 16:07d0e43c2d12 77
bobgiesberts 17:a5cf2b4bec13 78 // f_CLKIN * RESP_TIME
bobgiesberts 17:a5cf2b4bec13 79 // f_sensor = -------------------
bobgiesberts 17:a5cf2b4bec13 80 // 3 * L_DATA
bobgiesberts 17:a5cf2b4bec13 81 _fsensor = 1 *(_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
bobgiesberts 17:a5cf2b4bec13 82
bobgiesberts 17:a5cf2b4bec13 83 // 2^SENSORDIV * f_CLKIN(L_DATA + LHROFFSET*2^8)
bobgiesberts 17:a5cf2b4bec13 84 // f_sensor = ---------------------------------------------
bobgiesberts 17:a5cf2b4bec13 85 // 2^24
bobgiesberts 16:07d0e43c2d12 86
bobgiesberts 16:07d0e43c2d12 87 // 1
bobgiesberts 16:07d0e43c2d12 88 // --------------------- --> p. 31
bobgiesberts 16:07d0e43c2d12 89 // C * (2*PI*f_sensor)^2
bobgiesberts 16:07d0e43c2d12 90 return 1./(cap*pow(2*PI*_fsensor,2));
bobgiesberts 16:07d0e43c2d12 91 };
bobgiesberts 16:07d0e43c2d12 92
bobgiesberts 16:07d0e43c2d12 93
bobgiesberts 16:07d0e43c2d12 94 uint32_t LDC1101::readRawCounts(void)
bobgiesberts 16:07d0e43c2d12 95 {
bobgiesberts 16:07d0e43c2d12 96 uint8_t val[5];
bobgiesberts 16:07d0e43c2d12 97
bobgiesberts 16:07d0e43c2d12 98 // 0x38 + 0x39 + 0x3A
bobgiesberts 16:07d0e43c2d12 99 readSPI(val, 0x38, 5);
bobgiesberts 16:07d0e43c2d12 100 uint32_t combinedbytes = (val[4]<<16)| (val[3]<<8) | val[2]; // combine the content of the 3 bytes from registers 23, 24 and 25
bobgiesberts 16:07d0e43c2d12 101 return combinedbytes;
bobgiesberts 16:07d0e43c2d12 102 }
bobgiesberts 16:07d0e43c2d12 103
bobgiesberts 16:07d0e43c2d12 104 void LDC1101::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
bobgiesberts 16:07d0e43c2d12 105 {
bobgiesberts 16:07d0e43c2d12 106 // CSB down
bobgiesberts 16:07d0e43c2d12 107 _cs_pin.write(0);
bobgiesberts 16:07d0e43c2d12 108
bobgiesberts 16:07d0e43c2d12 109 // makes sure the address starts with 1... Why?
bobgiesberts 16:07d0e43c2d12 110 _spiport.write(address | 0x80); //read flag
bobgiesberts 16:07d0e43c2d12 111 for(int i=0; i < num_bytes ; i++)
bobgiesberts 16:07d0e43c2d12 112 {
bobgiesberts 16:07d0e43c2d12 113 data[i] = _spiport.write(0xFF);
bobgiesberts 16:07d0e43c2d12 114 }
bobgiesberts 16:07d0e43c2d12 115 // CSB up
bobgiesberts 16:07d0e43c2d12 116 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 117 }
bobgiesberts 16:07d0e43c2d12 118
bobgiesberts 16:07d0e43c2d12 119 void LDC1101::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
bobgiesberts 16:07d0e43c2d12 120 {
bobgiesberts 16:07d0e43c2d12 121 // CSB down
bobgiesberts 16:07d0e43c2d12 122 _cs_pin.write(0);
bobgiesberts 16:07d0e43c2d12 123
bobgiesberts 16:07d0e43c2d12 124 _spiport.write(address);
bobgiesberts 16:07d0e43c2d12 125 for(int i=0; i < num_bytes ; i++)
bobgiesberts 16:07d0e43c2d12 126 {
bobgiesberts 16:07d0e43c2d12 127 _spiport.write(data[i]);
bobgiesberts 16:07d0e43c2d12 128 }
bobgiesberts 16:07d0e43c2d12 129 // CSB up
bobgiesberts 16:07d0e43c2d12 130 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 131 }
bobgiesberts 16:07d0e43c2d12 132
bobgiesberts 16:07d0e43c2d12 133
bobgiesberts 16:07d0e43c2d12 134 // EXTRA test: Get&print values of all variables to verify (to calculate the induction)
bobgiesberts 16:07d0e43c2d12 135 // The data will be printed on the screen using RealTerm: baud 9600.
bobgiesberts 16:07d0e43c2d12 136 // Begin ***********************************************************
bobgiesberts 16:07d0e43c2d12 137 float LDC1101::get_raw_l() {_raw_l = readRawCounts();
bobgiesberts 16:07d0e43c2d12 138 return _raw_l;};
bobgiesberts 16:07d0e43c2d12 139 float LDC1101::get_fsensor() {
bobgiesberts 16:07d0e43c2d12 140 uint16_t resp[] = {0, 0, 192, 384, 768, 1536, 3072, 6144};
bobgiesberts 16:07d0e43c2d12 141 _raw_l = readRawCounts();
bobgiesberts 16:07d0e43c2d12 142 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
bobgiesberts 16:07d0e43c2d12 143 return _fsensor;};
bobgiesberts 16:07d0e43c2d12 144
bobgiesberts 16:07d0e43c2d12 145 float LDC1101::get_frequency() {return _frequency;};
bobgiesberts 16:07d0e43c2d12 146 float LDC1101::get_responsetime() {return _responsetime;};
bobgiesberts 16:07d0e43c2d12 147 float LDC1101::get_cap() {return cap;};
bobgiesberts 16:07d0e43c2d12 148 // END ***********************************************************