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:
Fri May 29 13:45:48 2015 +0000
Revision:
11:0f53fbf73613
Parent:
10:4fa62f8092c4
Child:
12:312970050c8c
Working version with reduced code.

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
hamid567 4:62ebb87678f8 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,1)
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 7:7f1522ad3df5 21 mode(LDC_MODE_STANDBY);
hamid567 5:98d4fd07734a 22 setFrequency(f_external);
hamid567 8:b5fb9681869c 23 wait(0.1);
hamid567 1:a88df80e7664 24 wait_us(10);
hamid567 8:b5fb9681869c 25
hamid567 8:b5fb9681869c 26 setWatchdog(5000);
hamid567 8:b5fb9681869c 27 setResponseTime(LDC_RESPONSE_6144);
hamid567 8:b5fb9681869c 28 setOutputPower(LDC_AMPLITUDE_4V);
hamid567 11:0f53fbf73613 29
hamid567 10:4fa62f8092c4 30 writeSPIregister(0x05,0x00); // clock config >> we get 0x00 if this line is disabled and the cable is reconnected
hamid567 11:0f53fbf73613 31 writeSPIregister(0x0C,0x01); // Register 0x0C enables a function that can improve L measurements while disabling RP measurements
hamid567 10:4fa62f8092c4 32
hamid567 5:98d4fd07734a 33 mode(LDC_MODE_ACTIVE);
vsluiter 0:90873b4e8330 34 }
vsluiter 0:90873b4e8330 35
vsluiter 0:90873b4e8330 36 void LDC1000::setOutputPower(LDC_AMPLITUDE amplitude)
vsluiter 0:90873b4e8330 37 {
vsluiter 0:90873b4e8330 38 uint8_t buffer;
vsluiter 0:90873b4e8330 39 _amplitude = amplitude;
vsluiter 0:90873b4e8330 40 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 41 buffer &= 0xE7; //clear amplitude bits
hamid567 8:b5fb9681869c 42 buffer |= (amplitude<<3) & 0x18;
vsluiter 0:90873b4e8330 43 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 44
vsluiter 0:90873b4e8330 45 }
vsluiter 0:90873b4e8330 46
hamid567 2:44b76f6f19d5 47 void LDC1000::setWatchdog(float frequency)
hamid567 2:44b76f6f19d5 48 {
hamid567 2:44b76f6f19d5 49 uint8_t buffer;
hamid567 2:44b76f6f19d5 50 buffer = 68.94*log(frequency/2500);
hamid567 2:44b76f6f19d5 51 writeSPI(&buffer,0x03);
hamid567 2:44b76f6f19d5 52 }
hamid567 1:a88df80e7664 53
vsluiter 0:90873b4e8330 54 void LDC1000::setResponseTime(LDC_RESPONSE responsetime)
vsluiter 0:90873b4e8330 55 {
vsluiter 0:90873b4e8330 56 uint8_t buffer;
vsluiter 0:90873b4e8330 57 _responsetime = responsetime;
vsluiter 0:90873b4e8330 58 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 59 buffer &= 0xF8; //clear responsetime bits
hamid567 5:98d4fd07734a 60 buffer |= responsetime & 0x07;
hamid567 8:b5fb9681869c 61 //writeSPIregister(0x04,buffer);
vsluiter 0:90873b4e8330 62 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 63 }
vsluiter 0:90873b4e8330 64
vsluiter 0:90873b4e8330 65 void LDC1000::setFrequency(float frequency)
vsluiter 0:90873b4e8330 66 {
vsluiter 0:90873b4e8330 67 _frequency = frequency;
vsluiter 0:90873b4e8330 68 _clock.period(1.0/frequency);
hamid567 4:62ebb87678f8 69 _clock.pulsewidth(0.5/frequency);
vsluiter 0:90873b4e8330 70 }
vsluiter 0:90873b4e8330 71
vsluiter 0:90873b4e8330 72 float LDC1000::getInductance()
vsluiter 0:90873b4e8330 73 {
hamid567 8:b5fb9681869c 74 uint16_t resp[] = {0,0,192, 384, 768, 1536, 3072, 6144};
vsluiter 0:90873b4e8330 75 _raw_l = readRawCounts();
vsluiter 0:90873b4e8330 76 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
hamid567 2:44b76f6f19d5 77 return 1./(cap*pow(2*PI*_fsensor,2));
vsluiter 0:90873b4e8330 78 };
vsluiter 0:90873b4e8330 79
hamid567 8:b5fb9681869c 80
hamid567 9:6e2d808b113d 81 /* reads all 5 registers also after cable reconnect but het returns just one byte*/
hamid567 8:b5fb9681869c 82 uint32_t LDC1000::readRawCounts(void)
hamid567 8:b5fb9681869c 83 {
hamid567 8:b5fb9681869c 84 uint8_t val[5];
hamid567 8:b5fb9681869c 85 readSPI(val,0x21,5);
hamid567 9:6e2d808b113d 86 unsigned int combinedbytes = (val[4]<<16)| (val[3]<<8) | val[2]; // combine the 3 bytes from registers 23, 24 and 25
hamid567 9:6e2d808b113d 87 return combinedbytes;
hamid567 8:b5fb9681869c 88 }
hamid567 8:b5fb9681869c 89
vsluiter 0:90873b4e8330 90 void LDC1000::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 91 {
vsluiter 0:90873b4e8330 92 _cs_pin.write(0);
vsluiter 0:90873b4e8330 93 _spiport.write(address | 0x80); //read flag
vsluiter 0:90873b4e8330 94 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 95 {
hamid567 1:a88df80e7664 96 data[i] = _spiport.write(0xFF);
vsluiter 0:90873b4e8330 97 }
vsluiter 0:90873b4e8330 98 _cs_pin.write(1);
vsluiter 0:90873b4e8330 99 }
vsluiter 0:90873b4e8330 100
vsluiter 0:90873b4e8330 101 void LDC1000::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 102 {
vsluiter 0:90873b4e8330 103 _cs_pin.write(0);
vsluiter 0:90873b4e8330 104 _spiport.write(address);
vsluiter 0:90873b4e8330 105 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 106 {
hamid567 1:a88df80e7664 107 _spiport.write(data[i]);
vsluiter 0:90873b4e8330 108 }
vsluiter 0:90873b4e8330 109 _cs_pin.write(1);
hamid567 8:b5fb9681869c 110 }
hamid567 8:b5fb9681869c 111
hamid567 11:0f53fbf73613 112
hamid567 11:0f53fbf73613 113 // EXTRA test: Get&print values of all variables to verify (to calculate the induction)
hamid567 11:0f53fbf73613 114 // The data will be printed on the screen using RealTerm: baud 9600.
hamid567 8:b5fb9681869c 115 // Begin ***********************************************************
hamid567 8:b5fb9681869c 116 float LDC1000::get_raw_l() {_raw_l = readRawCounts();
hamid567 8:b5fb9681869c 117 return _raw_l;};
hamid567 8:b5fb9681869c 118 float LDC1000::get_fsensor() {
hamid567 8:b5fb9681869c 119 uint16_t resp[] = {0, 0, 192, 384, 768, 1536, 3072, 6144};
hamid567 8:b5fb9681869c 120 _raw_l = readRawCounts();
hamid567 8:b5fb9681869c 121 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
hamid567 8:b5fb9681869c 122 return _fsensor;};
hamid567 8:b5fb9681869c 123
hamid567 8:b5fb9681869c 124 float LDC1000::get_frequency() {return _frequency;};
hamid567 8:b5fb9681869c 125 float LDC1000::get_responsetime() {return _responsetime;};
hamid567 8:b5fb9681869c 126 float LDC1000::get_cap() {return cap;};
hamid567 8:b5fb9681869c 127 // END ***********************************************************
hamid567 8:b5fb9681869c 128