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:
Tue May 19 13:26:40 2015 +0000
Revision:
2:44b76f6f19d5
Parent:
1:a88df80e7664
Child:
4:62ebb87678f8
Added timeout / watchdog

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