Library to communicate with LDC1101

Dependents:   Inductive_Sensor Inductive_Sensor_Jasper Inductive_Sensor_3

Fork of LDC1000 by First Last

Committer:
bobgiesberts
Date:
Wed Mar 30 12:00:10 2016 +0000
Revision:
26:1ef9172cd355
Parent:
25:ae111662ee03
Child:
27:05dd145c7997
In this improved version:;  - Solved the timing issue (error with converting floats to int in sleep);  - Shutdown when Vbatt < 3,10 V;  - Arrays instead of vectors;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bobgiesberts 16:07d0e43c2d12 1 #ifndef _LDC1101_H_
bobgiesberts 16:07d0e43c2d12 2 #define _LDC1101_H_
bobgiesberts 16:07d0e43c2d12 3
bobgiesberts 16:07d0e43c2d12 4 /**
bobgiesberts 16:07d0e43c2d12 5 * @file LDC1101.h
bobgiesberts 16:07d0e43c2d12 6 * @brief this header file will contain all required
bobgiesberts 16:07d0e43c2d12 7 * definitions for the functions to interface with Texas
bobgiesberts 16:07d0e43c2d12 8 * Instruments' LDC1101.
bobgiesberts 16:07d0e43c2d12 9 *
bobgiesberts 20:8e1b1efdbb49 10 * @author Victor Sluiter & Bob Giesberts
bobgiesberts 16:07d0e43c2d12 11 *
bobgiesberts 16:07d0e43c2d12 12 * @date 2015-12-09
bobgiesberts 16:07d0e43c2d12 13 */
bobgiesberts 16:07d0e43c2d12 14
bobgiesberts 16:07d0e43c2d12 15 #include "mbed.h"
bobgiesberts 16:07d0e43c2d12 16
bobgiesberts 16:07d0e43c2d12 17 #ifndef PI
bobgiesberts 16:07d0e43c2d12 18 #define PI 3.14
bobgiesberts 16:07d0e43c2d12 19 #endif
bobgiesberts 16:07d0e43c2d12 20
bobgiesberts 16:07d0e43c2d12 21 typedef enum { LDC_RESPONSE_192 = 2, \
bobgiesberts 16:07d0e43c2d12 22 LDC_RESPONSE_384 = 3, \
bobgiesberts 19:e205ab9142d8 23 LDC_RESPONSE_768 = 4, \
bobgiesberts 16:07d0e43c2d12 24 LDC_RESPONSE_1536= 5, \
bobgiesberts 16:07d0e43c2d12 25 LDC_RESPONSE_3072= 6, \
bobgiesberts 16:07d0e43c2d12 26 LDC_RESPONSE_6144= 7} LDC_RESPONSE;
bobgiesberts 16:07d0e43c2d12 27
bobgiesberts 19:e205ab9142d8 28 typedef enum { LDC_MODE_ACTIVE = 0, \
bobgiesberts 19:e205ab9142d8 29 LDC_MODE_STANDBY = 1, \
bobgiesberts 16:07d0e43c2d12 30 LDC_MODE_SHUTDOWN = 2} LDC_MODE;
bobgiesberts 16:07d0e43c2d12 31
bobgiesberts 17:a5cf2b4bec13 32 typedef enum { DIVIDER_1 = 0, \
bobgiesberts 17:a5cf2b4bec13 33 DIVIDER_2 = 1, \
bobgiesberts 17:a5cf2b4bec13 34 DIVIDER_4 = 2, \
bobgiesberts 17:a5cf2b4bec13 35 DIVIDER_8 = 3} DIVIDER;
bobgiesberts 17:a5cf2b4bec13 36
bobgiesberts 25:ae111662ee03 37 typedef enum { RPMAX_96 = 0, \
bobgiesberts 25:ae111662ee03 38 RPMAX_48 = 1, \
bobgiesberts 25:ae111662ee03 39 RPMAX_24 = 2, \
bobgiesberts 25:ae111662ee03 40 RPMAX_12 = 3, \
bobgiesberts 25:ae111662ee03 41 RPMAX_6 = 4, \
bobgiesberts 25:ae111662ee03 42 RPMAX_3 = 5, \
bobgiesberts 25:ae111662ee03 43 RPMAX_1 = 6, \
bobgiesberts 25:ae111662ee03 44 RPMAX_0 = 7} RPMAX;
bobgiesberts 25:ae111662ee03 45
bobgiesberts 19:e205ab9142d8 46 typedef enum { RPMIN_96 = 0, \
bobgiesberts 19:e205ab9142d8 47 RPMIN_48 = 1, \
bobgiesberts 19:e205ab9142d8 48 RPMIN_24 = 2, \
bobgiesberts 19:e205ab9142d8 49 RPMIN_12 = 3, \
bobgiesberts 19:e205ab9142d8 50 RPMIN_6 = 4, \
bobgiesberts 19:e205ab9142d8 51 RPMIN_3 = 5, \
bobgiesberts 19:e205ab9142d8 52 RPMIN_1 = 6, \
bobgiesberts 19:e205ab9142d8 53 RPMIN_0 = 7} RPMIN;
bobgiesberts 17:a5cf2b4bec13 54
bobgiesberts 16:07d0e43c2d12 55 /**
bobgiesberts 16:07d0e43c2d12 56 * Class for the LDC1101.
bobgiesberts 16:07d0e43c2d12 57 * @author Victor Sluiter
bobgiesberts 16:07d0e43c2d12 58 * @date 2015-12-09
bobgiesberts 16:07d0e43c2d12 59 */
bobgiesberts 16:07d0e43c2d12 60 class LDC1101
bobgiesberts 16:07d0e43c2d12 61 {
bobgiesberts 16:07d0e43c2d12 62 public:
bobgiesberts 16:07d0e43c2d12 63 /**
bobgiesberts 16:07d0e43c2d12 64 * @brief Create a new Class to interface to an LDC1101
bobgiesberts 16:07d0e43c2d12 65 **/
bobgiesberts 18:fc9bb81a631f 66 LDC1101(PinName mosi, PinName miso, PinName sck, PinName cs, float capacitor, float f_CLKIN, PinName clock_out=NC);
bobgiesberts 26:1ef9172cd355 67 ~LDC1101();
bobgiesberts 16:07d0e43c2d12 68
bobgiesberts 16:07d0e43c2d12 69 /**
bobgiesberts 16:07d0e43c2d12 70 * @brief Set power mode.
bobgiesberts 16:07d0e43c2d12 71 * The constructor sets the LDC1101 in Active mode.
bobgiesberts 16:07d0e43c2d12 72 * @param mode choose from LDC_MODE_ACTIVE, LDC_MODE STANDBY or LDC_MODE_SHUTDOWN
bobgiesberts 16:07d0e43c2d12 73 **/
bobgiesberts 20:8e1b1efdbb49 74 void func_mode(LDC_MODE mode);
bobgiesberts 20:8e1b1efdbb49 75 /**
bobgiesberts 20:8e1b1efdbb49 76 * @brief Set LDC1101 to lowest power setting
bobgiesberts 20:8e1b1efdbb49 77 **/
bobgiesberts 20:8e1b1efdbb49 78 void sleep(void);
bobgiesberts 20:8e1b1efdbb49 79 /**
bobgiesberts 20:8e1b1efdbb49 80 * @brief Get LDC1101 to work for you again
bobgiesberts 20:8e1b1efdbb49 81 **/
bobgiesberts 20:8e1b1efdbb49 82 void wakeup(void);
bobgiesberts 16:07d0e43c2d12 83 /**
bobgiesberts 16:07d0e43c2d12 84 * @brief initial configurations
bobgiesberts 16:07d0e43c2d12 85 **/
bobgiesberts 16:07d0e43c2d12 86 void init(void);
bobgiesberts 16:07d0e43c2d12 87 /**
bobgiesberts 19:e205ab9142d8 88 * @brief initialises LHR mode
bobgiesberts 19:e205ab9142d8 89 * Also enables shutdown modus
bobgiesberts 19:e205ab9142d8 90 **/
bobgiesberts 20:8e1b1efdbb49 91 void setLHRmode(void);
bobgiesberts 25:ae111662ee03 92 void setRPmode(void);
bobgiesberts 19:e205ab9142d8 93
bobgiesberts 19:e205ab9142d8 94 /**
bobgiesberts 19:e205ab9142d8 95 * @brief Settings for RP
bobgiesberts 19:e205ab9142d8 96 * @param RPMAX_DIS [7]
bobgiesberts 19:e205ab9142d8 97 * 0 - not disabled: RP_MAX is driven
bobgiesberts 19:e205ab9142d8 98 * 1 - disabled: RP_MAX is ignored, current drive is off.
bobgiesberts 19:e205ab9142d8 99 * @param RPMIN [2:0]
bobgiesberts 19:e205ab9142d8 100 * This setting can be calibrated with the target closest to the sensor: R_p(d = 0mm)
bobgiesberts 19:e205ab9142d8 101 * RPMIN < 0.8 x R_p(d = 0mm)
bobgiesberts 19:e205ab9142d8 102 * If R_p < 750 Ohm --> increase distance to target
bobgiesberts 19:e205ab9142d8 103 **/
bobgiesberts 25:ae111662ee03 104 void setRPsettings(bool RPMAX_DIS, RPMAX rpmax, RPMIN rpmin);
bobgiesberts 19:e205ab9142d8 105
bobgiesberts 19:e205ab9142d8 106 /**
bobgiesberts 17:a5cf2b4bec13 107 * @brief Sensor divider (p.26)
bobgiesberts 19:e205ab9142d8 108 * Sensor input divider (p.35)
bobgiesberts 20:8e1b1efdbb49 109 * Because f_CLKIN > 4*f_sensor_max is not realisable for higher frequencies, so there is a divider
bobgiesberts 20:8e1b1efdbb49 110 * f_CLKIN > 4 * f_sensor_max / SENSOR_DIV
bobgiesberts 25:ae111662ee03 111 * this effectively decreases resolution. Preferable use setLHRoffset instead.
bobgiesberts 17:a5cf2b4bec13 112 * @param div
bobgiesberts 17:a5cf2b4bec13 113 * - DIVIDER_1
bobgiesberts 17:a5cf2b4bec13 114 * - DIVIDER_2
bobgiesberts 17:a5cf2b4bec13 115 * - DIVIDER_4
bobgiesberts 17:a5cf2b4bec13 116 * - DIVIDER_8
bobgiesberts 17:a5cf2b4bec13 117 **/
bobgiesberts 17:a5cf2b4bec13 118 void setDivider(DIVIDER div);
bobgiesberts 25:ae111662ee03 119
bobgiesberts 25:ae111662ee03 120 /**
bobgiesberts 25:ae111662ee03 121 * @brief Sensor offset (p.26)
bobgiesberts 25:ae111662ee03 122 * Sensor offset
bobgiesberts 25:ae111662ee03 123 * The sensor might reach a value > 2^24. To prevent this, set an offset.
bobgiesberts 25:ae111662ee03 124 * @param offset
bobgiesberts 25:ae111662ee03 125 * 32 bit value that should be substracted from the current sensor value
bobgiesberts 25:ae111662ee03 126 **/
bobgiesberts 25:ae111662ee03 127 void setLHRoffset( uint32_t offset );
bobgiesberts 19:e205ab9142d8 128
bobgiesberts 16:07d0e43c2d12 129 /**
bobgiesberts 19:e205ab9142d8 130 * @brief Set the Response Time parameters. Does not apply in LHR mode (p.17)
bobgiesberts 16:07d0e43c2d12 131 * @param responsetime
bobgiesberts 16:07d0e43c2d12 132 * Larger value increases accuracy, but slows down the output data rate. Choose one of these values:
bobgiesberts 16:07d0e43c2d12 133 * - LDC_RESPONSE_192
bobgiesberts 16:07d0e43c2d12 134 * - LDC_RESPONSE_384
bobgiesberts 16:07d0e43c2d12 135 * - LDC_RESPONSE_768
bobgiesberts 16:07d0e43c2d12 136 * - LDC_RESPONSE_1536
bobgiesberts 16:07d0e43c2d12 137 * - LDC_RESPONSE_3072
bobgiesberts 16:07d0e43c2d12 138 * - LDC_RESPONSE_6144
bobgiesberts 19:e205ab9142d8 139 * ResponseTime
bobgiesberts 19:e205ab9142d8 140 * t_conv (s) = ------------
bobgiesberts 19:e205ab9142d8 141 * 3 x f_sensor
bobgiesberts 16:07d0e43c2d12 142 **/
bobgiesberts 16:07d0e43c2d12 143 void setResponseTime(LDC_RESPONSE responsetime);
bobgiesberts 16:07d0e43c2d12 144
bobgiesberts 19:e205ab9142d8 145 /**
bobgiesberts 19:e205ab9142d8 146 * @brief Set the Reference Count parameter.
bobgiesberts 20:8e1b1efdbb49 147 * @param LHR_RCount
bobgiesberts 19:e205ab9142d8 148 * For LHR mode, the conversion time is set by the reference count LHR_RCOUNT (0x30 & 0x31) (p.34)
bobgiesberts 19:e205ab9142d8 149 * The conversion time represents the number of clock cycles used to measure the sensor frequency.
bobgiesberts 19:e205ab9142d8 150 * Higher values for LHR_RCOUNT have a higher effective measurement resolution but a lower sample rate. (p.34)
bobgiesberts 19:e205ab9142d8 151 * The maximum setting (0xffff) is required for full resolution (p. 35)
bobgiesberts 20:8e1b1efdbb49 152 * LHR_RCount = (f_CLKIN/sample rate - 55)/16
bobgiesberts 20:8e1b1efdbb49 153 **/
bobgiesberts 20:8e1b1efdbb49 154 void setReferenceCount(uint16_t LHR_RCount);
bobgiesberts 20:8e1b1efdbb49 155
bobgiesberts 20:8e1b1efdbb49 156 /**
bobgiesberts 20:8e1b1efdbb49 157 * @brief Set the rample rate (indirectly set the reference count)
bobgiesberts 19:e205ab9142d8 158 **/
bobgiesberts 20:8e1b1efdbb49 159 void setSampleRate( float samplerate );
bobgiesberts 20:8e1b1efdbb49 160
bobgiesberts 20:8e1b1efdbb49 161 /**
bobgiesberts 20:8e1b1efdbb49 162 * @brief Set the minimum sensor frequency (so without any target)
bobgiesberts 20:8e1b1efdbb49 163 * @param f_sensor_min
bobgiesberts 25:ae111662ee03 164 * f_sensor_min in MHz
bobgiesberts 25:ae111662ee03 165 * value between 0.5 and 8 MHz
bobgiesberts 20:8e1b1efdbb49 166 **/
bobgiesberts 25:ae111662ee03 167 void set_fsensor_min(float f_sensor_min);
bobgiesberts 20:8e1b1efdbb49 168
bobgiesberts 19:e205ab9142d8 169 /**
bobgiesberts 19:e205ab9142d8 170 * @brief Set the value of the external capacitor
bobgiesberts 19:e205ab9142d8 171 * This is needed for the calculation of the inductance.
bobgiesberts 19:e205ab9142d8 172 **/
bobgiesberts 19:e205ab9142d8 173 void setCapacitor(float c){_cap = c;};
bobgiesberts 19:e205ab9142d8 174 /**
bobgiesberts 19:e205ab9142d8 175 * @brief set the value of the external clock
bobgiesberts 19:e205ab9142d8 176 * If PWMout is used to generate a clock signal, this will update the output frequency.s
bobgiesberts 19:e205ab9142d8 177 **/
bobgiesberts 19:e205ab9142d8 178 void setFrequency(float frequency){_fCLKIN = frequency;};
bobgiesberts 19:e205ab9142d8 179
bobgiesberts 19:e205ab9142d8 180
bobgiesberts 20:8e1b1efdbb49 181
bobgiesberts 20:8e1b1efdbb49 182
bobgiesberts 20:8e1b1efdbb49 183
bobgiesberts 19:e205ab9142d8 184 /**
bobgiesberts 19:e205ab9142d8 185 * @brief Read LHR_Data, the raw 24-bit inductance value.
bobgiesberts 19:e205ab9142d8 186 * This is needed for the calculation of the inductance.
bobgiesberts 19:e205ab9142d8 187 * It reads from addresses 0x38, 0x39 & 0x3A.
bobgiesberts 19:e205ab9142d8 188 **/
bobgiesberts 19:e205ab9142d8 189 uint32_t get_LHR_Data(void);
bobgiesberts 25:ae111662ee03 190 uint16_t get_RP_Data(void);
bobgiesberts 25:ae111662ee03 191 uint16_t get_L_Data(void);
bobgiesberts 25:ae111662ee03 192 /**
bobgiesberts 25:ae111662ee03 193 * @brief get the set minimum value for f_sensor (0x04[7:5])
bobgiesberts 25:ae111662ee03 194 **/
bobgiesberts 25:ae111662ee03 195 float get_fsensor_min(void);
bobgiesberts 19:e205ab9142d8 196 /**
bobgiesberts 19:e205ab9142d8 197 * @brief get the calculated value for f_sensor
bobgiesberts 19:e205ab9142d8 198 **/
bobgiesberts 25:ae111662ee03 199 float get_fsensor(uint32_t Ldata = 0);
bobgiesberts 19:e205ab9142d8 200 /**
bobgiesberts 19:e205ab9142d8 201 * @brief get the calculated inductance value
bobgiesberts 19:e205ab9142d8 202 **/
bobgiesberts 25:ae111662ee03 203 float get_Inductance(uint32_t Ldata = 0);
bobgiesberts 25:ae111662ee03 204 float get_RP( uint16_t RPdata = 0);
bobgiesberts 19:e205ab9142d8 205 /**
bobgiesberts 19:e205ab9142d8 206 * @brief get the reference frequency (f_CLKIN)
bobgiesberts 19:e205ab9142d8 207 **/
bobgiesberts 19:e205ab9142d8 208 float get_fCLKIN(void);
bobgiesberts 19:e205ab9142d8 209 /**
bobgiesberts 19:e205ab9142d8 210 * @brief get the responsetime
bobgiesberts 19:e205ab9142d8 211 **/
bobgiesberts 20:8e1b1efdbb49 212 uint16_t get_responsetime(void) { uint16_t resps[] = {0, 0, 192, 384, 768, 1536, 3072, 6144}; uint8_t resp[1]; readSPI(resp, 0x04, 1); return resps[(resp[0] & 0x07)]; };
bobgiesberts 19:e205ab9142d8 213 /**
bobgiesberts 19:e205ab9142d8 214 * @brief get RPmin
bobgiesberts 19:e205ab9142d8 215 **/
bobgiesberts 19:e205ab9142d8 216 float get_RPmin(void);
bobgiesberts 19:e205ab9142d8 217 /**
bobgiesberts 25:ae111662ee03 218 * @brief get RPmax
bobgiesberts 25:ae111662ee03 219 **/
bobgiesberts 25:ae111662ee03 220 float get_RPmax(void);
bobgiesberts 25:ae111662ee03 221 /**
bobgiesberts 19:e205ab9142d8 222 * @brief get the reference count
bobgiesberts 19:e205ab9142d8 223 **/
bobgiesberts 20:8e1b1efdbb49 224 uint16_t get_Rcount(void) { uint8_t rcount[2]; readSPI(rcount, 0x30, 2); return ((rcount[1] << 8) | rcount[0]); };
bobgiesberts 19:e205ab9142d8 225 /**
bobgiesberts 19:e205ab9142d8 226 * @brief get the divider
bobgiesberts 19:e205ab9142d8 227 **/
bobgiesberts 19:e205ab9142d8 228 uint8_t get_divider(void);
bobgiesberts 19:e205ab9142d8 229 /**
bobgiesberts 25:ae111662ee03 230 * @brief get LHR_OFFSET
bobgiesberts 25:ae111662ee03 231 **/
bobgiesberts 25:ae111662ee03 232 uint32_t get_LHRoffset(void);
bobgiesberts 25:ae111662ee03 233 /**
bobgiesberts 19:e205ab9142d8 234 * @brief get the capacitance
bobgiesberts 19:e205ab9142d8 235 **/
bobgiesberts 19:e205ab9142d8 236 float get_cap(void);
bobgiesberts 19:e205ab9142d8 237 /**
bobgiesberts 19:e205ab9142d8 238 * @brief get the quality
bobgiesberts 19:e205ab9142d8 239 **/
bobgiesberts 19:e205ab9142d8 240 float get_Q(void);
bobgiesberts 19:e205ab9142d8 241
bobgiesberts 22:8da965ce5af3 242 uint8_t get_status(void);
bobgiesberts 22:8da965ce5af3 243 uint8_t get_LHR_status(void);
bobgiesberts 22:8da965ce5af3 244 bool is_New_LHR_data(void);
bobgiesberts 22:8da965ce5af3 245 bool is_Oscillation_Error(void);
bobgiesberts 19:e205ab9142d8 246
bobgiesberts 19:e205ab9142d8 247
bobgiesberts 19:e205ab9142d8 248
bobgiesberts 19:e205ab9142d8 249
bobgiesberts 16:07d0e43c2d12 250 private:
bobgiesberts 16:07d0e43c2d12 251 void readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes = 1);
bobgiesberts 16:07d0e43c2d12 252 void writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes = 1);
bobgiesberts 16:07d0e43c2d12 253 void writeSPIregister(uint8_t reg, uint8_t value){writeSPI(&value,reg);}; // VERKEERD OM?!
bobgiesberts 22:8da965ce5af3 254 void suicide(void *obj) {delete obj;};
bobgiesberts 16:07d0e43c2d12 255
bobgiesberts 16:07d0e43c2d12 256
bobgiesberts 19:e205ab9142d8 257 uint16_t _responsetime; // Response Time
bobgiesberts 19:e205ab9142d8 258 uint8_t _divider; // divider
bobgiesberts 25:ae111662ee03 259 uint32_t _LHRoffset; // LHR_OFFSET
bobgiesberts 19:e205ab9142d8 260 float _RPmin; // RP_MIN
bobgiesberts 25:ae111662ee03 261 float _RPmax; // RP_MAX
bobgiesberts 19:e205ab9142d8 262 float _fsensor; // f_sensor: the calculated frequency of the sensor
bobgiesberts 25:ae111662ee03 263 float _f_sensor_min; // f_sensor_min: setting for the lowest expected value for f_sensor
bobgiesberts 19:e205ab9142d8 264 float _inductance; // the calculated inductance
bobgiesberts 19:e205ab9142d8 265 float _fCLKIN; // f_CLKIN: frequency of external clock: 16MHz
bobgiesberts 19:e205ab9142d8 266 float _cap; // capacitor: 120 pF
bobgiesberts 19:e205ab9142d8 267 uint32_t _L_data; // The raw measured data for inductance
bobgiesberts 19:e205ab9142d8 268 uint16_t _Rcount; // The reference count
bobgiesberts 19:e205ab9142d8 269
bobgiesberts 19:e205ab9142d8 270
bobgiesberts 16:07d0e43c2d12 271 SPI _spiport;
bobgiesberts 16:07d0e43c2d12 272 DigitalOut _cs_pin;
bobgiesberts 16:07d0e43c2d12 273
bobgiesberts 17:a5cf2b4bec13 274 //FastPWM _clock;
bobgiesberts 16:07d0e43c2d12 275 };
bobgiesberts 16:07d0e43c2d12 276
bobgiesberts 16:07d0e43c2d12 277 #endif