Library to work with the LDC1000 from Texas Instruments

Dependencies:   FastPWM

Dependents:   LDC1000_test

LDC1000

This library was written to interface to Texas Instruments' LDC1000 in order to perform inductance measurement. This libary needs a SPI peripheral on your mbed device to talk to the LDC1000.

Clock

The LDC1000 needs a high speed clock for its internal frequency counter. In order to provide this clock, the FastPWM library is used. This may change the behaviour of other PWM channels, please be aware of that, and read the FastPWM documentation to understand the implications.

Unsupported

Not supported (yet):

  1. Setting the RpMAX and RpMIN values
  2. Setting the interrupt pin functionality
Committer:
vsluiter
Date:
Sun Apr 05 18:19:12 2015 +0000
Revision:
0:90873b4e8330
Child:
1:a88df80e7664
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:90873b4e8330 1 /**
vsluiter 0:90873b4e8330 2 * @file LDC1000.h
vsluiter 0:90873b4e8330 3 * @brief this C++ file wcontains all required
vsluiter 0:90873b4e8330 4 * functions to interface with Texas
vsluiter 0:90873b4e8330 5 * Instruments' LDC1000.
vsluiter 0:90873b4e8330 6 *
vsluiter 0:90873b4e8330 7 * @author Victor Sluiter
vsluiter 0:90873b4e8330 8 *
vsluiter 0:90873b4e8330 9 * @date 2015-04-01
vsluiter 0:90873b4e8330 10 */
vsluiter 0:90873b4e8330 11
vsluiter 0:90873b4e8330 12 #include "LDC1000.h"
vsluiter 0:90873b4e8330 13
vsluiter 0:90873b4e8330 14 LDC1000::LDC1000(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)
vsluiter 0:90873b4e8330 15 {
vsluiter 0:90873b4e8330 16 cap = capacitor;
vsluiter 0:90873b4e8330 17 _spiport.format(8,3);
vsluiter 0:90873b4e8330 18 _spiport.frequency(1E6);
vsluiter 0:90873b4e8330 19 _cs_pin.write(1);
vsluiter 0:90873b4e8330 20 setFrequency(f_external);
vsluiter 0:90873b4e8330 21 setResponseTime(LDC_RESPONSE_384);
vsluiter 0:90873b4e8330 22 mode(LDC_MODE_ACTIVE);
vsluiter 0:90873b4e8330 23 }
vsluiter 0:90873b4e8330 24
vsluiter 0:90873b4e8330 25 void LDC1000::setOutputPower(LDC_AMPLITUDE amplitude)
vsluiter 0:90873b4e8330 26 {
vsluiter 0:90873b4e8330 27 uint8_t buffer;
vsluiter 0:90873b4e8330 28 _amplitude = amplitude;
vsluiter 0:90873b4e8330 29 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 30 buffer &= 0xE7; //clear amplitude bits
vsluiter 0:90873b4e8330 31 buffer |= (amplitude<<3) & 0xE7;
vsluiter 0:90873b4e8330 32 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 33
vsluiter 0:90873b4e8330 34 }
vsluiter 0:90873b4e8330 35
vsluiter 0:90873b4e8330 36 void LDC1000::setResponseTime(LDC_RESPONSE responsetime)
vsluiter 0:90873b4e8330 37 {
vsluiter 0:90873b4e8330 38 uint8_t buffer;
vsluiter 0:90873b4e8330 39 _responsetime = responsetime;
vsluiter 0:90873b4e8330 40 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 41 buffer &= 0xF8; //clear responsetime bits
vsluiter 0:90873b4e8330 42 buffer |= responsetime & 0xF8;
vsluiter 0:90873b4e8330 43 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 44 }
vsluiter 0:90873b4e8330 45
vsluiter 0:90873b4e8330 46 void LDC1000::setFrequency(float frequency)
vsluiter 0:90873b4e8330 47 {
vsluiter 0:90873b4e8330 48 _frequency = frequency;
vsluiter 0:90873b4e8330 49 _clock.period(1.0/frequency);
vsluiter 0:90873b4e8330 50 }
vsluiter 0:90873b4e8330 51
vsluiter 0:90873b4e8330 52 float LDC1000::getInductance()
vsluiter 0:90873b4e8330 53 {
vsluiter 0:90873b4e8330 54 uint16_t resp[] = {192, 384, 768, 1536, 3072, 6144};
vsluiter 0:90873b4e8330 55 _raw_l = readRawCounts();
vsluiter 0:90873b4e8330 56 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
vsluiter 0:90873b4e8330 57 return 1/(cap*pow(2*PI*_fsensor,2));
vsluiter 0:90873b4e8330 58 };
vsluiter 0:90873b4e8330 59
vsluiter 0:90873b4e8330 60 uint32_t LDC1000::readRawCounts(void)
vsluiter 0:90873b4e8330 61 {
vsluiter 0:90873b4e8330 62 union
vsluiter 0:90873b4e8330 63 {
vsluiter 0:90873b4e8330 64 uint8_t buf[4];
vsluiter 0:90873b4e8330 65 uint32_t value;
vsluiter 0:90873b4e8330 66 } val;
vsluiter 0:90873b4e8330 67 val.value = 0;
vsluiter 0:90873b4e8330 68 readSPI(val.buf,0x23,3);
vsluiter 0:90873b4e8330 69 return val.value;
vsluiter 0:90873b4e8330 70 }
vsluiter 0:90873b4e8330 71
vsluiter 0:90873b4e8330 72 void LDC1000::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 73 {
vsluiter 0:90873b4e8330 74 _cs_pin.write(0);
vsluiter 0:90873b4e8330 75 _spiport.write(address | 0x80); //read flag
vsluiter 0:90873b4e8330 76 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 77 {
vsluiter 0:90873b4e8330 78 _spiport.write(data[i]);
vsluiter 0:90873b4e8330 79 }
vsluiter 0:90873b4e8330 80 _cs_pin.write(1);
vsluiter 0:90873b4e8330 81 }
vsluiter 0:90873b4e8330 82
vsluiter 0:90873b4e8330 83 void LDC1000::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 84 {
vsluiter 0:90873b4e8330 85 _cs_pin.write(0);
vsluiter 0:90873b4e8330 86 _spiport.write(address);
vsluiter 0:90873b4e8330 87 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 88 {
vsluiter 0:90873b4e8330 89 *data = _spiport.write(0xFF);
vsluiter 0:90873b4e8330 90 }
vsluiter 0:90873b4e8330 91 _cs_pin.write(1);
vsluiter 0:90873b4e8330 92 }