IoT-MBBR (masterthesis)
Masterthesis upgrading a Moving Bed BioReactor with extra sensors and cloud connectivity.
VL53L1X_calibration.c
Go to the documentation of this file.
1 /*
2 * Copyright (c) 2017, STMicroelectronics - All Rights Reserved
3 *
4 * This file : part of VL53L1 Core and : dual licensed,
5 * either 'STMicroelectronics
6 * Proprietary license'
7 * or 'BSD 3-clause "New" or "Revised" License' , at your option.
8 *
9 ********************************************************************************
10 *
11 * 'STMicroelectronics Proprietary license'
12 *
13 ********************************************************************************
14 *
15 * License terms: STMicroelectronics Proprietary in accordance with licensing
16 * terms at www.st.com/sla0081
17 *
18 * STMicroelectronics confidential
19 * Reproduction and Communication of this document : strictly prohibited unless
20 * specifically authorized in writing by STMicroelectronics.
21 *
22 *
23 ********************************************************************************
24 *
25 * Alternatively, VL53L1 Core may be distributed under the terms of
26 * 'BSD 3-clause "New" or "Revised" License', in which case the following
27 * provisions apply instead of the ones mentioned above :
28 *
29 ********************************************************************************
30 *
31 * License terms: BSD 3-clause "New" or "Revised" License.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions are met:
35 *
36 * 1. Redistributions of source code must retain the above copyright notice, this
37 * list of conditions and the following disclaimer.
38 *
39 * 2. Redistributions in binary form must reproduce the above copyright notice,
40 * this list of conditions and the following disclaimer in the documentation
41 * and/or other materials provided with the distribution.
42 *
43 * 3. Neither the name of the copyright holder nor the names of its contributors
44 * may be used to endorse or promote products derived from this software
45 * without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
48 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
53 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
54 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
55 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
56 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 *
58 *
59 ********************************************************************************
60 *
61 */
62 /**
63  * @file vl53l1x_calibration.c
64  * @brief Calibration functions implementation
65  */
66 #include "VL53L1X_api.h"
67 #include "VL53L1X_calibration.h"
68 
69 #define ALGO__PART_TO_PART_RANGE_OFFSET_MM 0x001E
70 #define MM_CONFIG__INNER_OFFSET_MM 0x0020
71 #define MM_CONFIG__OUTER_OFFSET_MM 0x0022
72 
74 {
75  uint8_t i, tmp;
76  int16_t AverageDistance = 0;
77  uint16_t distance;
78  VL53L1X_ERROR status = 0;
79 
81  status = VL53L1_WrWord(dev, MM_CONFIG__INNER_OFFSET_MM, 0x0);
82  status = VL53L1_WrWord(dev, MM_CONFIG__OUTER_OFFSET_MM, 0x0);
83  status = VL53L1X_StartRanging(dev); /* Enable VL53L1X sensor */
84  for (i = 0; i < 50; i++) {
85  tmp = 0;
86  while (tmp == 0){
87  status = VL53L1X_CheckForDataReady(dev, &tmp);
88  }
89  status = VL53L1X_GetDistance(dev, &distance);
90  status = VL53L1X_ClearInterrupt(dev);
91  AverageDistance = AverageDistance + distance;
92  }
93  status = VL53L1X_StopRanging(dev);
94  AverageDistance = AverageDistance / 50;
95  *offset = TargetDistInMm - AverageDistance;
96  status = VL53L1_WrWord(dev, ALGO__PART_TO_PART_RANGE_OFFSET_MM, *offset*4);
97  return status;
98 }
99 
101 {
102  uint8_t i, tmp;
103  float AverageSignalRate = 0;
104  float AverageDistance = 0;
105  float AverageSpadNb = 0;
106  uint16_t distance = 0, spadNum;
107  uint16_t sr;
108  VL53L1X_ERROR status = 0;
109  uint32_t calXtalk;
110 
111  status = VL53L1_WrWord(dev, 0x0016,0);
112  status = VL53L1X_StartRanging(dev);
113  for (i = 0; i < 50; i++) {
114  tmp = 0;
115  while (tmp == 0){
116  status = VL53L1X_CheckForDataReady(dev, &tmp);
117  }
118  status= VL53L1X_GetSignalRate(dev, &sr);
119  status= VL53L1X_GetDistance(dev, &distance);
120  status = VL53L1X_ClearInterrupt(dev);
121  AverageDistance = AverageDistance + distance;
122  status = VL53L1X_GetSpadNb(dev, &spadNum);
123  AverageSpadNb = AverageSpadNb + spadNum;
124  AverageSignalRate =
125  AverageSignalRate + sr;
126  }
127  status = VL53L1X_StopRanging(dev);
128  AverageDistance = AverageDistance / 50;
129  AverageSpadNb = AverageSpadNb / 50;
130  AverageSignalRate = AverageSignalRate / 50;
131  /* Calculate Xtalk value */
132  calXtalk = (uint16_t)(512*(AverageSignalRate*(1-(AverageDistance/TargetDistInMm)))/AverageSpadNb);
133  *xtalk = (uint16_t)(calXtalk*1000)>>9;
134  status = VL53L1_WrWord(dev, 0x0016, calXtalk);
135  return status;
136 }
int8_t VL53L1_WrWord(uint16_t dev, uint16_t index, uint16_t data)
Write a word (16 bits) to the I2C bus.
int8_t VL53L1X_ERROR
Definition: VL53L1X_api.h:78
VL53L1X_ERROR VL53L1X_StopRanging(uint16_t dev)
This function stops the ranging.
Definition: VL53L1X_api.c:283
VL53L1X_ERROR VL53L1X_StartRanging(uint16_t dev)
This function starts the ranging distance operation The ranging operation is continuous. The clear interrupt has to be done after each get data to allow the interrupt to raise when the next data is ready 1=active high (default), 0=active low, use SetInterruptPolarity() to change the interrupt polarity if required.
Definition: VL53L1X_api.c:275
int16_t offset
Definition: VL43L1X.c:52
signed char int8_t
Typedef defining 8 bit char type. The developer should modify this to suit the platform being deploye...
Definition: vl53l1_types.h:103
#define MM_CONFIG__OUTER_OFFSET_MM
short int16_t
Typedef defining 16 bit short type. The developer should modify this to suit the platform being deplo...
Definition: vl53l1_types.h:93
uint16_t xtalk
Definition: VL43L1X.c:53
int8_t VL53L1X_CalibrateXtalk(uint16_t dev, uint16_t TargetDistInMm, uint16_t *xtalk)
This function performs the xtalk calibration. The function returns the xtalk value found and programs...
VL53L1X_ERROR VL53L1X_GetSignalRate(uint16_t dev, uint16_t *signal)
This function returns the returned signal in kcps.
Definition: VL53L1X_api.c:581
VL53L1X_ERROR VL53L1X_GetDistance(uint16_t dev, uint16_t *distance)
This function returns the distance measured by the sensor in mm.
Definition: VL53L1X_api.c:546
#define ALGO__PART_TO_PART_RANGE_OFFSET_MM
VL53L1X_ERROR VL53L1X_GetSpadNb(uint16_t dev, uint16_t *spNb)
This function returns the current number of enabled SPADs.
Definition: VL53L1X_api.c:592
int8_t VL53L1X_CalibrateOffset(uint16_t dev, uint16_t TargetDistInMm, int16_t *offset)
This function performs the offset calibration. The function returns the offset value found and progra...
#define MM_CONFIG__INNER_OFFSET_MM
VL53L1X_ERROR VL53L1X_CheckForDataReady(uint16_t dev, uint8_t *isDataReady)
This function checks if the new ranging data is available by polling the dedicated register...
Definition: VL53L1X_api.c:291
VL53L1X_ERROR VL53L1X_ClearInterrupt(uint16_t dev)
This function clears the interrupt, to be called after a ranging data reading to arm the interrupt fo...
Definition: VL53L1X_api.c:245
unsigned short uint16_t
Typedef defining 16 bit unsigned short type. The developer should modify this to suit the platform be...
Definition: vl53l1_types.h:88
unsigned char uint8_t
Typedef defining 8 bit unsigned char type. The developer should modify this to suit the platform bein...
Definition: vl53l1_types.h:98
unsigned int uint32_t
Typedef defining 32 bit unsigned int type. The developer should modify this to suit the platform bein...
Definition: vl53l1_types.h:78