Library to communicate with LDC1614
Dependents: Inductive_Sensor_3
Fork of LDC1101 by
Diff: LDC1101.h
- Revision:
- 19:e205ab9142d8
- Parent:
- 18:fc9bb81a631f
- Child:
- 20:8e1b1efdbb49
diff -r fc9bb81a631f -r e205ab9142d8 LDC1101.h --- a/LDC1101.h Wed Dec 16 10:58:31 2015 +0000 +++ b/LDC1101.h Wed Dec 16 16:25:33 2015 +0000 @@ -21,13 +21,13 @@ typedef enum { LDC_RESPONSE_192 = 2, \ LDC_RESPONSE_384 = 3, \ - LDC_RESPONSE_768 = 4, \ + LDC_RESPONSE_768 = 4, \ LDC_RESPONSE_1536= 5, \ LDC_RESPONSE_3072= 6, \ LDC_RESPONSE_6144= 7} LDC_RESPONSE; -typedef enum { LDC_MODE_ACTIVE = 0, \ - LDC_MODE_STANDBY = 1, \ +typedef enum { LDC_MODE_ACTIVE = 0, \ + LDC_MODE_STANDBY = 1, \ LDC_MODE_SHUTDOWN = 2} LDC_MODE; typedef enum { DIVIDER_1 = 0, \ @@ -35,6 +35,14 @@ DIVIDER_4 = 2, \ DIVIDER_8 = 3} DIVIDER; +typedef enum { RPMIN_96 = 0, \ + RPMIN_48 = 1, \ + RPMIN_24 = 2, \ + RPMIN_12 = 3, \ + RPMIN_6 = 4, \ + RPMIN_3 = 5, \ + RPMIN_1 = 6, \ + RPMIN_0 = 7} RPMIN; /** * Class for the LDC1101. @@ -54,7 +62,7 @@ * The constructor sets the LDC1101 in Active mode. * @param mode choose from LDC_MODE_ACTIVE, LDC_MODE STANDBY or LDC_MODE_SHUTDOWN **/ - void mode(LDC_MODE mode) { writeSPI((uint8_t *)(&mode), 0x0B); }; + void func_mode(LDC_MODE mode) { writeSPI((uint8_t *)(&mode), 0x0B); }; /** * @brief initial configurations @@ -62,56 +70,53 @@ void init(void); /** + * @brief initialises LHR mode + * Also enables shutdown modus + **/ + void setLHRmode(void) + { + writeSPIregister(0x05, 0x03); // ALT_CONFIG: 0000 0011 --> LHR modus + Shutdown enabled + writeSPIregister(0x0C, 0x01); // D_CONFIG: Enables a function that can improve L measurements while disabling RP measurements + }; + + /** + * @brief Settings for RP + * @param RPMAX_DIS [7] + * 0 - not disabled: RP_MAX is driven + * 1 - disabled: RP_MAX is ignored, current drive is off. + * @param RPMIN [2:0] + * pi * V_amp + * R_p = ----------- + * 4 * I_drive + * This setting can be calibrated with the target closest to the sensor: R_p(d = 0mm) + * RPMIN < 0.8 x R_p(d = 0mm) + * If R_p < 750 Ohm --> increase distance to target + * - 000: RPMIN = 96 kOhm | I_drive = 4.7 uA + * - 001: RPMIN = 48 kOhm | I_drive = 9.4 uA + * - 010: RPMIN = 24 kOhm | I_drive = 18.7 uA + * - 011: RPMIN = 12 kOhm | I_drive = 37.5 uA + * - 100: RPMIN = 6 kOhm | I_drive = 75 uA + * - 101: RPMIN = 3 kOhm | I_drive = 150 uA + * - 110: RPMIN = 1.5 kOhm | I_drive = 300 uA + * - 111: RPMIN = 0.75 kOhm | I_drive = 600 uA (default) + **/ + void setRPsettings(bool RPMAX_DIS, RPMIN rpmin); + + /** * @brief Sensor divider (p.26) + * Sensor input divider (p.35) + * Because f_CLKIN > 4*f_sensor is not realisable for higher frequencies, so there is a divider + * f_CLKIN > 4 * f_sensor / SENSOR_DIV * @param div - * Divides the sensor by a certain amount * - DIVIDER_1 * - DIVIDER_2 * - DIVIDER_4 * - DIVIDER_8 **/ void setDivider(DIVIDER div); - - - /** - * @brief get the calculated value for f_sensor - **/ - float get_fsensor(void); - - - /** - * @brief get the calculated inductance value - **/ - float get_Inductance(void); - - - // EXTRA test get variables values to verify (to calculate the induction) - float get_fCLKIN(void); - float get_responsetime(void); - float get_cap(void); - - + /** - * @brief Set the value of the external capacitor - * This is needed for the calculation of the inductance. - **/ - void setCapacitor(float c){cap = c;}; - /** - * @brief set the value of the external clock - * If PWMout is used to generate a clock signal, this will update the output frequency.s - **/ - void setFrequency(float frequency); - - /** - * @brief Read LHR_Data, the raw 24-bit inductance value. - * This is needed for the calculation of the inductance. - * It reads from addresses 0x38, 0x39 & 0x3A. - **/ - uint32_t get_LHR_Data(void); - - - /** - * @brief Set the Response Time parameters. + * @brief Set the Response Time parameters. Does not apply in LHR mode (p.17) * @param responsetime * Larger value increases accuracy, but slows down the output data rate. Choose one of these values: * - LDC_RESPONSE_192 @@ -120,26 +125,103 @@ * - LDC_RESPONSE_1536 * - LDC_RESPONSE_3072 * - LDC_RESPONSE_6144 + * ResponseTime + * t_conv (s) = ------------ + * 3 x f_sensor **/ void setResponseTime(LDC_RESPONSE responsetime); + /** + * @brief Set the Reference Count parameter. + * @param LHR_Count + * For LHR mode, the conversion time is set by the reference count LHR_RCOUNT (0x30 & 0x31) (p.34) + * The conversion time represents the number of clock cycles used to measure the sensor frequency. + * Higher values for LHR_RCOUNT have a higher effective measurement resolution but a lower sample rate. (p.34) + * The maximum setting (0xffff) is required for full resolution (p. 35) + * 1) LHR_Count = 1/sample rate [kS/s] - 55/f_CLKIN + * 2) The reference count value must be chosen to support the required number of effective bits (ENOB). + * e.g. ENOB 13 bits --> minimum converstion time 2^13 = 8192 clock cycles required. 8192 = 0x2000 = RCOUNT. + **/ + void setReferenceCount(uint16_t LHR_Count); + /** + * @brief Set the value of the external capacitor + * This is needed for the calculation of the inductance. + **/ + void setCapacitor(float c){_cap = c;}; + /** + * @brief set the value of the external clock + * If PWMout is used to generate a clock signal, this will update the output frequency.s + **/ + void setFrequency(float frequency){_fCLKIN = frequency;}; + + + /** + * @brief Read LHR_Data, the raw 24-bit inductance value. + * This is needed for the calculation of the inductance. + * It reads from addresses 0x38, 0x39 & 0x3A. + **/ + uint32_t get_LHR_Data(void); + /** + * @brief get the calculated value for f_sensor + **/ + float get_fsensor(void); + /** + * @brief get the calculated inductance value + **/ + float get_Inductance(void); + /** + * @brief get the reference frequency (f_CLKIN) + **/ + float get_fCLKIN(void); + /** + * @brief get the responsetime + **/ + uint16_t get_responsetime(void); + /** + * @brief get RPmin + **/ + float get_RPmin(void); + /** + * @brief get the reference count + **/ + uint16_t get_Rcount(void); + /** + * @brief get the divider + **/ + uint8_t get_divider(void); + /** + * @brief get the capacitance + **/ + float get_cap(void); + /** + * @brief get the quality + **/ + float get_Q(void); + + + + + + private: void readSPI(uint8_t *data, uint8_t address, uint8_t num_bytes = 1); void writeSPI(uint8_t *data, uint8_t address, uint8_t num_bytes = 1); void writeSPIregister(uint8_t reg, uint8_t value){writeSPI(&value,reg);}; // VERKEERD OM?! uint32_t readINTB(void); // EXTRA UNTB Read register - LDC_RESPONSE _responsetime_; - DIVIDER _divider_; - float _responsetime; - float _divider; - float _fsensor; - float _inductance; - float _fCLKIN; //frequency of external clock: 16MHz - float cap; - uint32_t _L_data; uint32_t INTB; // extra: read register INTB + uint16_t _responsetime; // Response Time + uint8_t _divider; // divider + float _RPmin; // RP_MIN + float _fsensor; // f_sensor: the calculated frequency of the sensor + float _inductance; // the calculated inductance + float _fCLKIN; // f_CLKIN: frequency of external clock: 16MHz + float _cap; // capacitor: 120 pF + uint32_t _L_data; // The raw measured data for inductance + uint16_t _Rcount; // The reference count + + SPI _spiport; DigitalOut _cs_pin;