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:
hamid567
Date:
Wed Apr 29 14:57:22 2015 +0000
Revision:
1:a88df80e7664
Parent:
0:90873b4e8330
Child:
2:44b76f6f19d5
Corrected read and write actions

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);
hamid567 1:a88df80e7664 20 wait_us(100);
hamid567 1:a88df80e7664 21 mode(LDC_MODE_ACTIVE);
hamid567 1:a88df80e7664 22 wait_us(10);
vsluiter 0:90873b4e8330 23 setFrequency(f_external);
vsluiter 0:90873b4e8330 24 setResponseTime(LDC_RESPONSE_384);
vsluiter 0:90873b4e8330 25 }
vsluiter 0:90873b4e8330 26
vsluiter 0:90873b4e8330 27 void LDC1000::setOutputPower(LDC_AMPLITUDE amplitude)
vsluiter 0:90873b4e8330 28 {
vsluiter 0:90873b4e8330 29 uint8_t buffer;
vsluiter 0:90873b4e8330 30 _amplitude = amplitude;
vsluiter 0:90873b4e8330 31 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 32 buffer &= 0xE7; //clear amplitude bits
vsluiter 0:90873b4e8330 33 buffer |= (amplitude<<3) & 0xE7;
vsluiter 0:90873b4e8330 34 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 35
vsluiter 0:90873b4e8330 36 }
vsluiter 0:90873b4e8330 37
hamid567 1:a88df80e7664 38
hamid567 1:a88df80e7664 39
vsluiter 0:90873b4e8330 40 void LDC1000::setResponseTime(LDC_RESPONSE responsetime)
vsluiter 0:90873b4e8330 41 {
vsluiter 0:90873b4e8330 42 uint8_t buffer;
vsluiter 0:90873b4e8330 43 _responsetime = responsetime;
vsluiter 0:90873b4e8330 44 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 45 buffer &= 0xF8; //clear responsetime bits
vsluiter 0:90873b4e8330 46 buffer |= responsetime & 0xF8;
vsluiter 0:90873b4e8330 47 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 48 }
vsluiter 0:90873b4e8330 49
vsluiter 0:90873b4e8330 50 void LDC1000::setFrequency(float frequency)
vsluiter 0:90873b4e8330 51 {
vsluiter 0:90873b4e8330 52 _frequency = frequency;
hamid567 1:a88df80e7664 53 _clock.write(0.5);
vsluiter 0:90873b4e8330 54 _clock.period(1.0/frequency);
vsluiter 0:90873b4e8330 55 }
vsluiter 0:90873b4e8330 56
vsluiter 0:90873b4e8330 57 float LDC1000::getInductance()
vsluiter 0:90873b4e8330 58 {
vsluiter 0:90873b4e8330 59 uint16_t resp[] = {192, 384, 768, 1536, 3072, 6144};
vsluiter 0:90873b4e8330 60 _raw_l = readRawCounts();
vsluiter 0:90873b4e8330 61 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
vsluiter 0:90873b4e8330 62 return 1/(cap*pow(2*PI*_fsensor,2));
vsluiter 0:90873b4e8330 63 };
vsluiter 0:90873b4e8330 64
vsluiter 0:90873b4e8330 65 uint32_t LDC1000::readRawCounts(void)
vsluiter 0:90873b4e8330 66 {
vsluiter 0:90873b4e8330 67 union
vsluiter 0:90873b4e8330 68 {
vsluiter 0:90873b4e8330 69 uint8_t buf[4];
vsluiter 0:90873b4e8330 70 uint32_t value;
vsluiter 0:90873b4e8330 71 } val;
vsluiter 0:90873b4e8330 72 val.value = 0;
vsluiter 0:90873b4e8330 73 readSPI(val.buf,0x23,3);
vsluiter 0:90873b4e8330 74 return val.value;
vsluiter 0:90873b4e8330 75 }
vsluiter 0:90873b4e8330 76
vsluiter 0:90873b4e8330 77 void LDC1000::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 78 {
vsluiter 0:90873b4e8330 79 _cs_pin.write(0);
vsluiter 0:90873b4e8330 80 _spiport.write(address | 0x80); //read flag
vsluiter 0:90873b4e8330 81 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 82 {
hamid567 1:a88df80e7664 83 data[i] = _spiport.write(0xFF);
vsluiter 0:90873b4e8330 84 }
vsluiter 0:90873b4e8330 85 _cs_pin.write(1);
vsluiter 0:90873b4e8330 86 }
vsluiter 0:90873b4e8330 87
vsluiter 0:90873b4e8330 88 void LDC1000::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 89 {
vsluiter 0:90873b4e8330 90 _cs_pin.write(0);
vsluiter 0:90873b4e8330 91 _spiport.write(address);
vsluiter 0:90873b4e8330 92 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 93 {
hamid567 1:a88df80e7664 94 _spiport.write(data[i]);
vsluiter 0:90873b4e8330 95 }
vsluiter 0:90873b4e8330 96 _cs_pin.write(1);
vsluiter 0:90873b4e8330 97 }