Library to communicate with LDC1614

Dependencies:   SHTx

Dependents:   Inductive_Sensor_3

Fork of LDC1101 by Bob Giesberts

Revision:
19:e205ab9142d8
Parent:
18:fc9bb81a631f
Child:
20:8e1b1efdbb49
--- 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;