Library to work with the LDC1000 from Texas Instruments
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):
- Setting the RpMAX and RpMIN values
- Setting the interrupt pin functionality
LDC1000.cpp@10:4fa62f8092c4, 2015-05-29 (annotated)
- Committer:
- hamid567
- Date:
- Fri May 29 13:35:48 2015 +0000
- Revision:
- 10:4fa62f8092c4
- Parent:
- 9:6e2d808b113d
- Child:
- 11:0f53fbf73613
working version with registers commented and all not needed write commando's disabled.
Who changed what in which revision?
User | Revision | Line number | New 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 | 10:4fa62f8092c4 | 31 | /* writeSPIregister(0x0B,0x00); // power op standby |
hamid567 | 10:4fa62f8092c4 | 32 | writeSPIregister(0x01,0x0E); // rp_max |
hamid567 | 10:4fa62f8092c4 | 33 | writeSPIregister(0x02,0x3C); // rp_min |
hamid567 | 10:4fa62f8092c4 | 34 | writeSPIregister(0x03,0x15); // min reson freq |
hamid567 | 10:4fa62f8092c4 | 35 | writeSPIregister(0x04,0x17);*/ // LDC config |
hamid567 | 10:4fa62f8092c4 | 36 | writeSPIregister(0x05,0x00); // clock config >> we get 0x00 if this line is disabled and the cable is reconnected |
hamid567 | 10:4fa62f8092c4 | 37 | /* writeSPIregister(0x06,0x50); // treshhold High LSB we get 0x00 if this 4 lines is disabled and the cable is reconnected |
hamid567 | 10:4fa62f8092c4 | 38 | writeSPIregister(0x07,0x14); // treshhold High MSB |
hamid567 | 10:4fa62f8092c4 | 39 | writeSPIregister(0x08,0xC0); // treshhold Low LSB |
hamid567 | 10:4fa62f8092c4 | 40 | writeSPIregister(0x09,0x12); // treshhold Low MSB |
hamid567 | 10:4fa62f8092c4 | 41 | writeSPIregister(0x0A,0x04); */ // INTB pin config |
hamid567 | 10:4fa62f8092c4 | 42 | writeSPIregister(0x0C,0x01); // |
hamid567 | 10:4fa62f8092c4 | 43 | // writeSPIregister(0x0B,0x01); // Power mode active |
hamid567 | 10:4fa62f8092c4 | 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 |