Library to communicate with LDC1101

Dependents:   Inductive_Sensor Inductive_Sensor_Jasper Inductive_Sensor_3

Fork of LDC1000 by First Last

Committer:
bobgiesberts
Date:
Thu Dec 10 15:12:16 2015 +0000
Revision:
16:07d0e43c2d12
Child:
17:a5cf2b4bec13
Started new library for LDC1101, forked from LDC1000

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 16:07d0e43c2d12 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 16:07d0e43c2d12 39
bobgiesberts 16:07d0e43c2d12 40 // L-Only Measurement
bobgiesberts 16:07d0e43c2d12 41 writeSPIregister(0x05, 0x03); // ALT_CONFIG: clock config >> we get 0x00 if this line is disabled and the cable is reconnected
bobgiesberts 16:07d0e43c2d12 42 writeSPIregister(0x0C, 0x01); // D_CONF: Register 0x0C enables a function that can improve L measurements while disabling RP measurements
bobgiesberts 16:07d0e43c2d12 43
bobgiesberts 16:07d0e43c2d12 44 // High Resolution Reference Count
bobgiesberts 16:07d0e43c2d12 45 // LHR_COUNT_LSB: 0xff naar 0x30 ???
bobgiesberts 16:07d0e43c2d12 46 // LHR_COUNT_MSB: 0xff naar 0x31 ???
bobgiesberts 16:07d0e43c2d12 47
bobgiesberts 16:07d0e43c2d12 48 // Start measuring
bobgiesberts 16:07d0e43c2d12 49 mode(LDC_MODE_ACTIVE); // 0x00 naar 0x0B
bobgiesberts 16:07d0e43c2d12 50 }
bobgiesberts 16:07d0e43c2d12 51
bobgiesberts 16:07d0e43c2d12 52 void LDC1101::setResponseTime(LDC_RESPONSE responsetime)
bobgiesberts 16:07d0e43c2d12 53 {
bobgiesberts 16:07d0e43c2d12 54 _responsetime = responsetime;
bobgiesberts 16:07d0e43c2d12 55 writeSPIregister(0x04, responsetime);
bobgiesberts 16:07d0e43c2d12 56 }
bobgiesberts 16:07d0e43c2d12 57
bobgiesberts 16:07d0e43c2d12 58 void LDC1101::setFrequency(float frequency)
bobgiesberts 16:07d0e43c2d12 59 {
bobgiesberts 16:07d0e43c2d12 60 _frequency = frequency;
bobgiesberts 16:07d0e43c2d12 61 _clock.period(1.0/frequency);
bobgiesberts 16:07d0e43c2d12 62 _clock.pulsewidth(0.5/frequency);
bobgiesberts 16:07d0e43c2d12 63 }
bobgiesberts 16:07d0e43c2d12 64
bobgiesberts 16:07d0e43c2d12 65 float LDC1101::getInductance()
bobgiesberts 16:07d0e43c2d12 66 {
bobgiesberts 16:07d0e43c2d12 67 uint16_t resp[] = {0,0,192, 384, 768, 1536, 3072, 6144};
bobgiesberts 16:07d0e43c2d12 68 _raw_l = readRawCounts();
bobgiesberts 16:07d0e43c2d12 69
bobgiesberts 16:07d0e43c2d12 70 // f_CLKIN * RESP_TIME
bobgiesberts 16:07d0e43c2d12 71 // -------------------
bobgiesberts 16:07d0e43c2d12 72 // 3 * L_DATA
bobgiesberts 16:07d0e43c2d12 73 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
bobgiesberts 16:07d0e43c2d12 74
bobgiesberts 16:07d0e43c2d12 75 // 1
bobgiesberts 16:07d0e43c2d12 76 // --------------------- --> p. 31
bobgiesberts 16:07d0e43c2d12 77 // C * (2*PI*f_sensor)^2
bobgiesberts 16:07d0e43c2d12 78 return 1./(cap*pow(2*PI*_fsensor,2));
bobgiesberts 16:07d0e43c2d12 79 };
bobgiesberts 16:07d0e43c2d12 80
bobgiesberts 16:07d0e43c2d12 81
bobgiesberts 16:07d0e43c2d12 82 uint32_t LDC1101::readRawCounts(void)
bobgiesberts 16:07d0e43c2d12 83 {
bobgiesberts 16:07d0e43c2d12 84 uint8_t val[5];
bobgiesberts 16:07d0e43c2d12 85
bobgiesberts 16:07d0e43c2d12 86 // 0x38 + 0x39 + 0x3A
bobgiesberts 16:07d0e43c2d12 87 readSPI(val, 0x38, 5);
bobgiesberts 16:07d0e43c2d12 88 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 89 return combinedbytes;
bobgiesberts 16:07d0e43c2d12 90 }
bobgiesberts 16:07d0e43c2d12 91
bobgiesberts 16:07d0e43c2d12 92 void LDC1101::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
bobgiesberts 16:07d0e43c2d12 93 {
bobgiesberts 16:07d0e43c2d12 94 // CSB down
bobgiesberts 16:07d0e43c2d12 95 _cs_pin.write(0);
bobgiesberts 16:07d0e43c2d12 96
bobgiesberts 16:07d0e43c2d12 97 // makes sure the address starts with 1... Why?
bobgiesberts 16:07d0e43c2d12 98 _spiport.write(address | 0x80); //read flag
bobgiesberts 16:07d0e43c2d12 99 for(int i=0; i < num_bytes ; i++)
bobgiesberts 16:07d0e43c2d12 100 {
bobgiesberts 16:07d0e43c2d12 101 data[i] = _spiport.write(0xFF);
bobgiesberts 16:07d0e43c2d12 102 }
bobgiesberts 16:07d0e43c2d12 103 // CSB up
bobgiesberts 16:07d0e43c2d12 104 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 105 }
bobgiesberts 16:07d0e43c2d12 106
bobgiesberts 16:07d0e43c2d12 107 void LDC1101::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
bobgiesberts 16:07d0e43c2d12 108 {
bobgiesberts 16:07d0e43c2d12 109 // CSB down
bobgiesberts 16:07d0e43c2d12 110 _cs_pin.write(0);
bobgiesberts 16:07d0e43c2d12 111
bobgiesberts 16:07d0e43c2d12 112 _spiport.write(address);
bobgiesberts 16:07d0e43c2d12 113 for(int i=0; i < num_bytes ; i++)
bobgiesberts 16:07d0e43c2d12 114 {
bobgiesberts 16:07d0e43c2d12 115 _spiport.write(data[i]);
bobgiesberts 16:07d0e43c2d12 116 }
bobgiesberts 16:07d0e43c2d12 117 // CSB up
bobgiesberts 16:07d0e43c2d12 118 _cs_pin.write(1);
bobgiesberts 16:07d0e43c2d12 119 }
bobgiesberts 16:07d0e43c2d12 120
bobgiesberts 16:07d0e43c2d12 121
bobgiesberts 16:07d0e43c2d12 122 // EXTRA test: Get&print values of all variables to verify (to calculate the induction)
bobgiesberts 16:07d0e43c2d12 123 // The data will be printed on the screen using RealTerm: baud 9600.
bobgiesberts 16:07d0e43c2d12 124 // Begin ***********************************************************
bobgiesberts 16:07d0e43c2d12 125 float LDC1101::get_raw_l() {_raw_l = readRawCounts();
bobgiesberts 16:07d0e43c2d12 126 return _raw_l;};
bobgiesberts 16:07d0e43c2d12 127 float LDC1101::get_fsensor() {
bobgiesberts 16:07d0e43c2d12 128 uint16_t resp[] = {0, 0, 192, 384, 768, 1536, 3072, 6144};
bobgiesberts 16:07d0e43c2d12 129 _raw_l = readRawCounts();
bobgiesberts 16:07d0e43c2d12 130 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
bobgiesberts 16:07d0e43c2d12 131 return _fsensor;};
bobgiesberts 16:07d0e43c2d12 132
bobgiesberts 16:07d0e43c2d12 133 float LDC1101::get_frequency() {return _frequency;};
bobgiesberts 16:07d0e43c2d12 134 float LDC1101::get_responsetime() {return _responsetime;};
bobgiesberts 16:07d0e43c2d12 135 float LDC1101::get_cap() {return cap;};
bobgiesberts 16:07d0e43c2d12 136 // END ***********************************************************