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

LDC1000.cpp

Committer:
vsluiter
Date:
2015-04-05
Revision:
0:90873b4e8330
Child:
1:a88df80e7664

File content as of revision 0:90873b4e8330:

/**
* @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);
}