Library to communicate with LDC1614
Dependents: Inductive_Sensor_3
Fork of LDC1101 by
LDC1101.cpp
- Committer:
- bobgiesberts
- Date:
- 2015-12-12
- Revision:
- 17:a5cf2b4bec13
- Parent:
- 16:07d0e43c2d12
- Child:
- 18:fc9bb81a631f
File content as of revision 17:a5cf2b4bec13:
/** * @file LDC1101.cpp * @brief this C++ file contains all required * functions to interface with Texas * Instruments' LDC1101. * * @author Victor Sluiter * * @date 2015-12-09 */ #include "LDC1101.h" 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) { cap = capacitor; _spiport.format(8,3); _spiport.frequency(1E6); setFrequency(f_external); // ---CSB must go low before accessing first address??? _cs_pin.write(1); wait_us(100); init(); } void LDC1101::init() { // configuration mode(LDC_MODE_STANDBY); // 0x01 naar 0x0B wait(0.1); wait_us(10); setResponseTime(LDC_RESPONSE_6144); setDivider(DIVIDER_1); // L-Only Measurement writeSPIregister(0x05, 0x03); // ALT_CONFIG: clock config >> we get 0x00 if this line is disabled and the cable is reconnected writeSPIregister(0x0C, 0x01); // D_CONF: Register 0x0C enables a function that can improve L measurements while disabling RP measurements // High Resolution Reference Count // LHR_COUNT_LSB: 0xff naar 0x30 ??? // LHR_COUNT_MSB: 0xff naar 0x31 ??? // Start measuring mode(LDC_MODE_ACTIVE); // 0x00 naar 0x0B } void LDC1101::setResponseTime(LDC_RESPONSE responsetime) { _responsetime = responsetime; writeSPIregister(0x04, responsetime); } void LDC1101::setDivider(DIVIDER div) { // _divider = (float) pow(2, div); writeSPIregister(0x34, div); } void LDC1101::setFrequency(float frequency) { _frequency = frequency; //_clock.period(1.0/frequency); //_clock.pulsewidth(0.5/frequency); } float LDC1101::getInductance() { uint16_t resp[] = {0,0,192, 384, 768, 1536, 3072, 6144}; _raw_l = readRawCounts(); // f_CLKIN * RESP_TIME // f_sensor = ------------------- // 3 * L_DATA _fsensor = 1 *(_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)]; // 2^SENSORDIV * f_CLKIN(L_DATA + LHROFFSET*2^8) // f_sensor = --------------------------------------------- // 2^24 // 1 // --------------------- --> p. 31 // C * (2*PI*f_sensor)^2 return 1./(cap*pow(2*PI*_fsensor,2)); }; uint32_t LDC1101::readRawCounts(void) { uint8_t val[5]; // 0x38 + 0x39 + 0x3A readSPI(val, 0x38, 5); uint32_t combinedbytes = (val[4]<<16)| (val[3]<<8) | val[2]; // combine the content of the 3 bytes from registers 23, 24 and 25 return combinedbytes; } void LDC1101::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes) { // CSB down _cs_pin.write(0); // makes sure the address starts with 1... Why? _spiport.write(address | 0x80); //read flag for(int i=0; i < num_bytes ; i++) { data[i] = _spiport.write(0xFF); } // CSB up _cs_pin.write(1); } void LDC1101::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes) { // CSB down _cs_pin.write(0); _spiport.write(address); for(int i=0; i < num_bytes ; i++) { _spiport.write(data[i]); } // CSB up _cs_pin.write(1); } // EXTRA test: Get&print values of all variables to verify (to calculate the induction) // The data will be printed on the screen using RealTerm: baud 9600. // Begin *********************************************************** float LDC1101::get_raw_l() {_raw_l = readRawCounts(); return _raw_l;}; float LDC1101::get_fsensor() { uint16_t resp[] = {0, 0, 192, 384, 768, 1536, 3072, 6144}; _raw_l = readRawCounts(); _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)]; return _fsensor;}; float LDC1101::get_frequency() {return _frequency;}; float LDC1101::get_responsetime() {return _responsetime;}; float LDC1101::get_cap() {return cap;}; // END ***********************************************************