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 11:25:13 2015 +0000
Revision:
9:6e2d808b113d
Parent:
8:b5fb9681869c
Child:
10:4fa62f8092c4
Working version: we get induction like on the EVM GUI.; After cable deconnect and reconnect, the program stil gives measurement data (no zeros)

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 5:98d4fd07734a 29
hamid567 8:b5fb9681869c 30 //*** Write comando's like in EVM start log:
hamid567 8:b5fb9681869c 31 /* writeSPIregister(0x0B,0x00); */
hamid567 8:b5fb9681869c 32 writeSPIregister(0x01,0x0E);
hamid567 8:b5fb9681869c 33 writeSPIregister(0x02,0x3C);
hamid567 5:98d4fd07734a 34 writeSPIregister(0x03,0x15);
hamid567 8:b5fb9681869c 35 writeSPIregister(0x04,0x17);
hamid567 8:b5fb9681869c 36 writeSPIregister(0x05,0x00);
hamid567 8:b5fb9681869c 37 writeSPIregister(0x06,0x50);
hamid567 8:b5fb9681869c 38 writeSPIregister(0x07,0x14);
hamid567 8:b5fb9681869c 39 writeSPIregister(0x08,0xC0);
hamid567 8:b5fb9681869c 40 writeSPIregister(0x09,0x12);
hamid567 8:b5fb9681869c 41 writeSPIregister(0x0A,0x04);
hamid567 8:b5fb9681869c 42 writeSPIregister(0x0C,0x01);
hamid567 8:b5fb9681869c 43 writeSPIregister(0x0B,0x01);/*
hamid567 8:b5fb9681869c 44 */
hamid567 5:98d4fd07734a 45 mode(LDC_MODE_ACTIVE);
vsluiter 0:90873b4e8330 46 }
vsluiter 0:90873b4e8330 47
vsluiter 0:90873b4e8330 48 void LDC1000::setOutputPower(LDC_AMPLITUDE amplitude)
vsluiter 0:90873b4e8330 49 {
vsluiter 0:90873b4e8330 50 uint8_t buffer;
vsluiter 0:90873b4e8330 51 _amplitude = amplitude;
vsluiter 0:90873b4e8330 52 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 53 buffer &= 0xE7; //clear amplitude bits
hamid567 8:b5fb9681869c 54 buffer |= (amplitude<<3) & 0x18;
vsluiter 0:90873b4e8330 55 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 56
vsluiter 0:90873b4e8330 57 }
vsluiter 0:90873b4e8330 58
hamid567 2:44b76f6f19d5 59 void LDC1000::setWatchdog(float frequency)
hamid567 2:44b76f6f19d5 60 {
hamid567 2:44b76f6f19d5 61 uint8_t buffer;
hamid567 2:44b76f6f19d5 62 buffer = 68.94*log(frequency/2500);
hamid567 2:44b76f6f19d5 63 writeSPI(&buffer,0x03);
hamid567 2:44b76f6f19d5 64 }
hamid567 1:a88df80e7664 65
vsluiter 0:90873b4e8330 66 void LDC1000::setResponseTime(LDC_RESPONSE responsetime)
vsluiter 0:90873b4e8330 67 {
vsluiter 0:90873b4e8330 68 uint8_t buffer;
vsluiter 0:90873b4e8330 69 _responsetime = responsetime;
vsluiter 0:90873b4e8330 70 readSPI(&buffer, 0x04);
vsluiter 0:90873b4e8330 71 buffer &= 0xF8; //clear responsetime bits
hamid567 5:98d4fd07734a 72 buffer |= responsetime & 0x07;
hamid567 8:b5fb9681869c 73 //writeSPIregister(0x04,buffer);
vsluiter 0:90873b4e8330 74 writeSPI(&buffer,0x04);
vsluiter 0:90873b4e8330 75 }
vsluiter 0:90873b4e8330 76
vsluiter 0:90873b4e8330 77 void LDC1000::setFrequency(float frequency)
vsluiter 0:90873b4e8330 78 {
vsluiter 0:90873b4e8330 79 _frequency = frequency;
vsluiter 0:90873b4e8330 80 _clock.period(1.0/frequency);
hamid567 4:62ebb87678f8 81 _clock.pulsewidth(0.5/frequency);
vsluiter 0:90873b4e8330 82 }
vsluiter 0:90873b4e8330 83
vsluiter 0:90873b4e8330 84 float LDC1000::getInductance()
vsluiter 0:90873b4e8330 85 {
hamid567 8:b5fb9681869c 86 uint16_t resp[] = {0,0,192, 384, 768, 1536, 3072, 6144};
vsluiter 0:90873b4e8330 87 _raw_l = readRawCounts();
vsluiter 0:90873b4e8330 88 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
hamid567 2:44b76f6f19d5 89 return 1./(cap*pow(2*PI*_fsensor,2));
vsluiter 0:90873b4e8330 90 };
vsluiter 0:90873b4e8330 91
hamid567 8:b5fb9681869c 92
hamid567 9:6e2d808b113d 93 /* reads all 5 registers also after cable reconnect but het returns just one byte*/
hamid567 8:b5fb9681869c 94 uint32_t LDC1000::readRawCounts(void)
hamid567 8:b5fb9681869c 95 {
hamid567 8:b5fb9681869c 96 uint8_t val[5];
hamid567 8:b5fb9681869c 97 readSPI(val,0x21,5);
hamid567 9:6e2d808b113d 98 unsigned int combinedbytes = (val[4]<<16)| (val[3]<<8) | val[2]; // combine the 3 bytes from registers 23, 24 and 25
hamid567 9:6e2d808b113d 99 return combinedbytes;
hamid567 9:6e2d808b113d 100 // return (uint32_t)(*(&val[2]));
hamid567 8:b5fb9681869c 101 }
hamid567 8:b5fb9681869c 102
hamid567 8:b5fb9681869c 103
hamid567 8:b5fb9681869c 104 /*
vsluiter 0:90873b4e8330 105 uint32_t LDC1000::readRawCounts(void)
vsluiter 0:90873b4e8330 106 {
vsluiter 0:90873b4e8330 107 union
vsluiter 0:90873b4e8330 108 {
vsluiter 0:90873b4e8330 109 uint8_t buf[4];
vsluiter 0:90873b4e8330 110 uint32_t value;
vsluiter 0:90873b4e8330 111 } val;
hamid567 8:b5fb9681869c 112 val.value = 8;
hamid567 8:b5fb9681869c 113 readSPI(val.buf,0x23,3);
vsluiter 0:90873b4e8330 114 return val.value;
vsluiter 0:90873b4e8330 115 }
hamid567 8:b5fb9681869c 116 */
hamid567 5:98d4fd07734a 117
vsluiter 0:90873b4e8330 118 void LDC1000::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 119 {
vsluiter 0:90873b4e8330 120 _cs_pin.write(0);
vsluiter 0:90873b4e8330 121 _spiport.write(address | 0x80); //read flag
vsluiter 0:90873b4e8330 122 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 123 {
hamid567 1:a88df80e7664 124 data[i] = _spiport.write(0xFF);
vsluiter 0:90873b4e8330 125 }
vsluiter 0:90873b4e8330 126 _cs_pin.write(1);
vsluiter 0:90873b4e8330 127 }
vsluiter 0:90873b4e8330 128
vsluiter 0:90873b4e8330 129 void LDC1000::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 130 {
vsluiter 0:90873b4e8330 131 _cs_pin.write(0);
vsluiter 0:90873b4e8330 132 _spiport.write(address);
vsluiter 0:90873b4e8330 133 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 134 {
hamid567 1:a88df80e7664 135 _spiport.write(data[i]);
vsluiter 0:90873b4e8330 136 }
vsluiter 0:90873b4e8330 137 _cs_pin.write(1);
hamid567 8:b5fb9681869c 138 }
hamid567 8:b5fb9681869c 139
hamid567 8:b5fb9681869c 140 // EXTRA test get and print variables values to verify (to calculate the induction)
hamid567 8:b5fb9681869c 141 // Begin ***********************************************************
hamid567 8:b5fb9681869c 142 float LDC1000::get_raw_l() {_raw_l = readRawCounts();
hamid567 8:b5fb9681869c 143 return _raw_l;};
hamid567 8:b5fb9681869c 144 float LDC1000::get_fsensor() {
hamid567 8:b5fb9681869c 145 uint16_t resp[] = {0, 0, 192, 384, 768, 1536, 3072, 6144};
hamid567 8:b5fb9681869c 146 _raw_l = readRawCounts();
hamid567 8:b5fb9681869c 147 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
hamid567 8:b5fb9681869c 148 return _fsensor;};
hamid567 8:b5fb9681869c 149
hamid567 8:b5fb9681869c 150 float LDC1000::get_frequency() {return _frequency;};
hamid567 8:b5fb9681869c 151 float LDC1000::get_responsetime() {return _responsetime;};
hamid567 8:b5fb9681869c 152 float LDC1000::get_cap() {return cap;};
hamid567 8:b5fb9681869c 153 // END ***********************************************************
hamid567 8:b5fb9681869c 154