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 09:28:46 2015 +0000
Revision:
8:b5fb9681869c
Parent:
7:7f1522ad3df5
Child:
9:6e2d808b113d
Working program but with not the right return data from readCounts()

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 8:b5fb9681869c 93 /* oude code terugzetten*/
hamid567 8:b5fb9681869c 94
hamid567 8:b5fb9681869c 95 uint32_t LDC1000::readRawCounts(void)
hamid567 8:b5fb9681869c 96 {
hamid567 8:b5fb9681869c 97 //union
hamid567 8:b5fb9681869c 98 //{
hamid567 8:b5fb9681869c 99 // uint8_t buf[4];
hamid567 8:b5fb9681869c 100 // uint32_t value;
hamid567 8:b5fb9681869c 101 //} val;
hamid567 8:b5fb9681869c 102 //val.value = 0;
hamid567 8:b5fb9681869c 103 uint8_t val[5];
hamid567 8:b5fb9681869c 104 readSPI(val,0x21,5);
hamid567 8:b5fb9681869c 105 return (uint32_t)(*(&val[2]));
hamid567 8:b5fb9681869c 106 }
hamid567 8:b5fb9681869c 107
hamid567 8:b5fb9681869c 108
hamid567 8:b5fb9681869c 109
hamid567 8:b5fb9681869c 110
hamid567 8:b5fb9681869c 111
hamid567 8:b5fb9681869c 112 /*
vsluiter 0:90873b4e8330 113 uint32_t LDC1000::readRawCounts(void)
vsluiter 0:90873b4e8330 114 {
vsluiter 0:90873b4e8330 115 union
vsluiter 0:90873b4e8330 116 {
vsluiter 0:90873b4e8330 117 uint8_t buf[4];
vsluiter 0:90873b4e8330 118 uint32_t value;
vsluiter 0:90873b4e8330 119 } val;
hamid567 8:b5fb9681869c 120 val.value = 8;
hamid567 8:b5fb9681869c 121 readSPI(val.buf,0x23,3);
vsluiter 0:90873b4e8330 122 return val.value;
vsluiter 0:90873b4e8330 123 }
hamid567 8:b5fb9681869c 124 */
hamid567 5:98d4fd07734a 125
vsluiter 0:90873b4e8330 126 void LDC1000::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 127 {
vsluiter 0:90873b4e8330 128 _cs_pin.write(0);
vsluiter 0:90873b4e8330 129 _spiport.write(address | 0x80); //read flag
vsluiter 0:90873b4e8330 130 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 131 {
hamid567 1:a88df80e7664 132 data[i] = _spiport.write(0xFF);
vsluiter 0:90873b4e8330 133 }
vsluiter 0:90873b4e8330 134 _cs_pin.write(1);
vsluiter 0:90873b4e8330 135 }
vsluiter 0:90873b4e8330 136
vsluiter 0:90873b4e8330 137 void LDC1000::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
vsluiter 0:90873b4e8330 138 {
vsluiter 0:90873b4e8330 139 _cs_pin.write(0);
vsluiter 0:90873b4e8330 140 _spiport.write(address);
vsluiter 0:90873b4e8330 141 for(int i=0; i < num_bytes ; i++)
vsluiter 0:90873b4e8330 142 {
hamid567 1:a88df80e7664 143 _spiport.write(data[i]);
vsluiter 0:90873b4e8330 144 }
vsluiter 0:90873b4e8330 145 _cs_pin.write(1);
hamid567 8:b5fb9681869c 146 }
hamid567 8:b5fb9681869c 147
hamid567 8:b5fb9681869c 148 // EXTRA test get and print variables values to verify (to calculate the induction)
hamid567 8:b5fb9681869c 149 // Begin ***********************************************************
hamid567 8:b5fb9681869c 150 float LDC1000::get_raw_l() {_raw_l = readRawCounts();
hamid567 8:b5fb9681869c 151 return _raw_l;};
hamid567 8:b5fb9681869c 152 float LDC1000::get_fsensor() {
hamid567 8:b5fb9681869c 153 uint16_t resp[] = {0, 0, 192, 384, 768, 1536, 3072, 6144};
hamid567 8:b5fb9681869c 154 _raw_l = readRawCounts();
hamid567 8:b5fb9681869c 155 _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
hamid567 8:b5fb9681869c 156 return _fsensor;};
hamid567 8:b5fb9681869c 157
hamid567 8:b5fb9681869c 158 float LDC1000::get_frequency() {return _frequency;};
hamid567 8:b5fb9681869c 159 float LDC1000::get_responsetime() {return _responsetime;};
hamid567 8:b5fb9681869c 160 float LDC1000::get_cap() {return cap;};
hamid567 8:b5fb9681869c 161 // END ***********************************************************
hamid567 8:b5fb9681869c 162