Bob Giesberts / LDC1614

Dependencies:   SHTx

Dependents:   Inductive_Sensor_3

Fork of LDC1101 by Bob Giesberts

Revision:
0:90873b4e8330
Child:
1:a88df80e7664
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LDC1000.cpp	Sun Apr 05 18:19:12 2015 +0000
@@ -0,0 +1,92 @@
+/**
+* @file LDC1000.h
+* @brief this C++ file wcontains all required
+* functions to interface with Texas
+* Instruments' LDC1000.
+*
+* @author Victor Sluiter
+*
+* @date 2015-04-01
+*/
+
+#include "LDC1000.h"
+
+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)
+{
+    cap = capacitor;
+    _spiport.format(8,3);
+    _spiport.frequency(1E6);
+    _cs_pin.write(1);
+    setFrequency(f_external);
+    setResponseTime(LDC_RESPONSE_384);
+    mode(LDC_MODE_ACTIVE);
+}
+
+void LDC1000::setOutputPower(LDC_AMPLITUDE amplitude)
+{
+    uint8_t buffer;
+    _amplitude  = amplitude;
+    readSPI(&buffer, 0x04);
+    buffer &= 0xE7; //clear amplitude bits
+    buffer |= (amplitude<<3) & 0xE7;
+    writeSPI(&buffer,0x04);
+
+}
+
+void LDC1000::setResponseTime(LDC_RESPONSE responsetime)
+{
+    uint8_t buffer;
+    _responsetime = responsetime;
+    readSPI(&buffer, 0x04);
+    buffer &= 0xF8; //clear responsetime bits
+    buffer |= responsetime & 0xF8;
+    writeSPI(&buffer,0x04);
+}
+
+void LDC1000::setFrequency(float frequency)
+{
+    _frequency = frequency;
+    _clock.period(1.0/frequency);
+}
+
+float LDC1000::getInductance()
+{
+    uint16_t resp[] = {192, 384, 768, 1536, 3072, 6144};
+    _raw_l = readRawCounts();
+    _fsensor = (_frequency/(_raw_l*3.0))*resp[(uint8_t)(_responsetime)];
+    return 1/(cap*pow(2*PI*_fsensor,2));
+};
+
+uint32_t LDC1000::readRawCounts(void)
+{
+    union
+    {
+        uint8_t buf[4];
+        uint32_t value;
+    } val;
+    val.value = 0;
+    readSPI(val.buf,0x23,3);
+    return val.value;
+}
+
+void LDC1000::readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
+{
+    _cs_pin.write(0);
+    _spiport.write(address | 0x80); //read flag 
+    for(int i=0; i < num_bytes ; i++)
+    {
+        _spiport.write(data[i]);
+    }
+    _cs_pin.write(1);
+}
+
+void LDC1000::writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes)
+{
+    _cs_pin.write(0);
+    _spiport.write(address); 
+    for(int i=0; i < num_bytes ; i++)
+    {
+        *data = _spiport.write(0xFF);
+    }
+    _cs_pin.write(1);
+}
\ No newline at end of file