Mirror with some correction

Dependencies:   mbed FastIO FastPWM USBDevice

Committer:
arnoz
Date:
Fri Oct 01 08:19:46 2021 +0000
Revision:
116:7a67265d7c19
Parent:
90:aa4e571da8e8
- Correct information regarding your last merge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mjr 82:4f6209cb5c33 1 // VL6180X Time of Flight sensor interface
mjr 82:4f6209cb5c33 2
mjr 82:4f6209cb5c33 3 #ifndef _VL6180X_H_
mjr 82:4f6209cb5c33 4 #define _VL6180X_H_
mjr 82:4f6209cb5c33 5
mjr 82:4f6209cb5c33 6 #include "mbed.h"
mjr 82:4f6209cb5c33 7 #include "BitBangI2C.h"
mjr 82:4f6209cb5c33 8
mjr 82:4f6209cb5c33 9
mjr 82:4f6209cb5c33 10 #define VL6180X_IDENTIFICATION_MODEL_ID 0x0000
mjr 82:4f6209cb5c33 11 #define VL6180X_IDENTIFICATION_MODEL_REV_MAJOR 0x0001
mjr 82:4f6209cb5c33 12 #define VL6180X_IDENTIFICATION_MODEL_REV_MINOR 0x0002
mjr 82:4f6209cb5c33 13 #define VL6180X_IDENTIFICATION_MODULE_REV_MAJOR 0x0003
mjr 82:4f6209cb5c33 14 #define VL6180X_IDENTIFICATION_MODULE_REV_MINOR 0x0004
mjr 82:4f6209cb5c33 15 #define VL6180X_IDENTIFICATION_DATE 0x0006 // NB - 16-bit value
mjr 82:4f6209cb5c33 16 #define VL6180X_IDENTIFICATION_TIME 0x0008 // NB - 16-bit value
mjr 82:4f6209cb5c33 17
mjr 82:4f6209cb5c33 18 #define VL6180X_SYSTEM_MODE_GPIO0 0x0010
mjr 82:4f6209cb5c33 19 #define VL6180X_SYSTEM_MODE_GPIO1 0x0011
mjr 82:4f6209cb5c33 20 #define VL6180X_SYSTEM_HISTORY_CTRL 0x0012
mjr 82:4f6209cb5c33 21 #define VL6180X_SYSTEM_INTERRUPT_CONFIG_GPIO 0x0014
mjr 82:4f6209cb5c33 22 #define VL6180X_SYSTEM_INTERRUPT_CLEAR 0x0015
mjr 82:4f6209cb5c33 23 #define VL6180X_SYSTEM_FRESH_OUT_OF_RESET 0x0016
mjr 82:4f6209cb5c33 24 #define VL6180X_SYSTEM_GROUPED_PARAMETER_HOLD 0x0017
mjr 82:4f6209cb5c33 25
mjr 82:4f6209cb5c33 26 #define VL6180X_SYSRANGE_START 0x0018
mjr 82:4f6209cb5c33 27 #define VL6180X_SYSRANGE_THRESH_HIGH 0x0019
mjr 82:4f6209cb5c33 28 #define VL6180X_SYSRANGE_THRESH_LOW 0x001A
mjr 82:4f6209cb5c33 29 #define VL6180X_SYSRANGE_INTERMEASUREMENT_PERIOD 0x001B
mjr 82:4f6209cb5c33 30 #define VL6180X_SYSRANGE_MAX_CONVERGENCE_TIME 0x001C
mjr 82:4f6209cb5c33 31 #define VL6180X_SYSRANGE_CROSSTALK_COMPENSATION_RATE 0x001E
mjr 82:4f6209cb5c33 32 #define VL6180X_SYSRANGE_CROSSTALK_VALID_HEIGHT 0x0021
mjr 82:4f6209cb5c33 33 #define VL6180X_SYSRANGE_EARLY_CONVERGENCE_ESTIMATE 0x0022
mjr 82:4f6209cb5c33 34 #define VL6180X_SYSRANGE_PART_TO_PART_RANGE_OFFSET 0x0024
mjr 82:4f6209cb5c33 35 #define VL6180X_SYSRANGE_RANGE_IGNORE_VALID_HEIGHT 0x0025
mjr 82:4f6209cb5c33 36 #define VL6180X_SYSRANGE_RANGE_IGNORE_THRESHOLD 0x0026
mjr 82:4f6209cb5c33 37 #define VL6180X_SYSRANGE_MAX_AMBIENT_LEVEL_MULT 0x002C
mjr 82:4f6209cb5c33 38 #define VL6180X_SYSRANGE_RANGE_CHECK_ENABLES 0x002D
mjr 82:4f6209cb5c33 39 #define VL6180X_SYSRANGE_VHV_RECALIBRATE 0x002E
mjr 82:4f6209cb5c33 40 #define VL6180X_SYSRANGE_VHV_REPEAT_RATE 0x0031
mjr 82:4f6209cb5c33 41
mjr 82:4f6209cb5c33 42 #define VL6180X_SYSALS_START 0x0038
mjr 82:4f6209cb5c33 43 #define VL6180X_SYSALS_THRESH_HIGH 0x003A
mjr 82:4f6209cb5c33 44 #define VL6180X_SYSALS_THRESH_LOW 0x003C
mjr 82:4f6209cb5c33 45 #define VL6180X_SYSALS_INTERMEASUREMENT_PERIOD 0x003E
mjr 82:4f6209cb5c33 46 #define VL6180X_SYSALS_ANALOGUE_GAIN 0x003F
mjr 82:4f6209cb5c33 47 #define VL6180X_SYSALS_INTEGRATION_PERIOD 0x0040
mjr 82:4f6209cb5c33 48
mjr 82:4f6209cb5c33 49 #define VL6180X_RESULT_RANGE_STATUS 0x004D
mjr 82:4f6209cb5c33 50 #define VL6180X_RESULT_ALS_STATUS 0x004E
mjr 82:4f6209cb5c33 51 #define VL6180X_RESULT_INTERRUPT_STATUS_GPIO 0x004F
mjr 82:4f6209cb5c33 52 #define VL6180X_RESULT_ALS_VAL 0x0050
mjr 82:4f6209cb5c33 53 #define VL6180X_RESULT_HISTORY_BUFFER 0x0052
mjr 82:4f6209cb5c33 54 #define VL6180X_RESULT_RANGE_VAL 0x0062
mjr 82:4f6209cb5c33 55 #define VL6180X_RESULT_RANGE_RAW 0x0064
mjr 82:4f6209cb5c33 56 #define VL6180X_RESULT_RANGE_RETURN_RATE 0x0066
mjr 82:4f6209cb5c33 57 #define VL6180X_RESULT_RANGE_REFERENCE_RATE 0x0068
mjr 82:4f6209cb5c33 58 #define VL6180X_RESULT_RANGE_RETURN_SIGNAL_COUNT 0x006C
mjr 82:4f6209cb5c33 59 #define VL6180X_RESULT_RANGE_REFERENCE_SIGNAL_COUNT 0x0070
mjr 82:4f6209cb5c33 60 #define VL6180X_RESULT_RANGE_RETURN_AMB_COUNT 0x0074
mjr 82:4f6209cb5c33 61 #define VL6180X_RESULT_RANGE_REFERENCE_AMB_COUNT 0x0078
mjr 82:4f6209cb5c33 62 #define VL6180X_RESULT_RANGE_RETURN_CONV_TIME 0x007C
mjr 82:4f6209cb5c33 63 #define VL6180X_RESULT_RANGE_REFERENCE_CONV_TIME 0x0080
mjr 82:4f6209cb5c33 64
mjr 82:4f6209cb5c33 65 #define VL6180X_READOUT_AVERAGING_SAMPLE_PERIOD 0x010A
mjr 82:4f6209cb5c33 66 #define VL6180X_FIRMWARE_BOOTUP 0x0119
mjr 82:4f6209cb5c33 67 #define VL6180X_FIRMWARE_RESULT_SCALER 0x0120
mjr 82:4f6209cb5c33 68 #define VL6180X_I2C_SLAVE_DEVICE_ADDRESS 0x0212
mjr 82:4f6209cb5c33 69 #define VL6180X_INTERLEAVED_MODE_ENABLE 0x02A3
mjr 82:4f6209cb5c33 70
mjr 82:4f6209cb5c33 71 // gain settings
mjr 82:4f6209cb5c33 72 enum VL6180X_ALS_Gain
mjr 82:4f6209cb5c33 73 {
mjr 82:4f6209cb5c33 74 GAIN_20 = 0, // 20
mjr 82:4f6209cb5c33 75 GAIN_10, // 10.32
mjr 82:4f6209cb5c33 76 GAIN_5, // 5.21
mjr 82:4f6209cb5c33 77 GAIN_2_5, // 2.60
mjr 82:4f6209cb5c33 78 GAIN_1_67, // 1.72
mjr 82:4f6209cb5c33 79 GAIN_1_25, // 1.28
mjr 82:4f6209cb5c33 80 GAIN_1, // 1.01
mjr 82:4f6209cb5c33 81 GAIN_40, // 40
mjr 82:4f6209cb5c33 82 };
mjr 82:4f6209cb5c33 83
mjr 82:4f6209cb5c33 84 // identification
mjr 82:4f6209cb5c33 85 struct VL6180X_ID
mjr 82:4f6209cb5c33 86 {
mjr 82:4f6209cb5c33 87 uint8_t model; // model number
mjr 82:4f6209cb5c33 88 uint8_t modelRevMajor; // model revision number major...
mjr 82:4f6209cb5c33 89 uint8_t modelRevMinor; // ...and minor
mjr 82:4f6209cb5c33 90 uint8_t moduleRevMajor; // module revision number major...
mjr 82:4f6209cb5c33 91 uint8_t moduleRevMinor; // ... and minior
mjr 82:4f6209cb5c33 92 struct
mjr 82:4f6209cb5c33 93 {
mjr 82:4f6209cb5c33 94 uint8_t month; // month 1..12
mjr 82:4f6209cb5c33 95 uint8_t day; // day of month 1..31
mjr 82:4f6209cb5c33 96 uint16_t year; // calendar year, 4-digit (e.g., 2016)
mjr 82:4f6209cb5c33 97 uint8_t phase; // manufacturing phase, 0..7
mjr 82:4f6209cb5c33 98 uint8_t hh; // hour, 0..23
mjr 82:4f6209cb5c33 99 uint8_t mm; // minute, 0..59
mjr 82:4f6209cb5c33 100 uint8_t ss; // second, 0..59
mjr 82:4f6209cb5c33 101 } manufDate; // manufacturing date and time
mjr 82:4f6209cb5c33 102 };
mjr 82:4f6209cb5c33 103
mjr 82:4f6209cb5c33 104 // range statistics
mjr 82:4f6209cb5c33 105 struct VL6180X_RangeStats
mjr 82:4f6209cb5c33 106 {
mjr 82:4f6209cb5c33 107 uint16_t returnRate; // return signal rate
mjr 82:4f6209cb5c33 108 uint16_t refReturnRate; // reference return rate
mjr 82:4f6209cb5c33 109 uint32_t returnCnt; // return signal count
mjr 82:4f6209cb5c33 110 uint32_t refReturnCnt; // reference return count
mjr 82:4f6209cb5c33 111 uint32_t ambCnt; // ambient count
mjr 82:4f6209cb5c33 112 uint32_t refAmbCnt; // reference ambient count
mjr 82:4f6209cb5c33 113 uint32_t convTime; // convergence time
mjr 82:4f6209cb5c33 114 uint32_t refConvTime; // reference convergence time
mjr 82:4f6209cb5c33 115 };
mjr 82:4f6209cb5c33 116
mjr 82:4f6209cb5c33 117 class VL6180X
mjr 82:4f6209cb5c33 118 {
mjr 82:4f6209cb5c33 119 public:
mjr 82:4f6209cb5c33 120 // Set up the interface with the given I2C pins, I2C address, and
mjr 87:8d35c74403af 121 // the GPIO0 pin (for resetting the sensor at startup).
mjr 87:8d35c74403af 122 //
mjr 87:8d35c74403af 123 // If 'internalPullups' is true, we'll set the I2C SDA/SCL pins to
mjr 87:8d35c74403af 124 // enable the internal pullup resistors. Set this to false if you're
mjr 87:8d35c74403af 125 // using your own external pullup resistors on the lines. External
mjr 87:8d35c74403af 126 // pullups are better if you're attaching more than one device to the
mjr 90:aa4e571da8e8 127 // same physical I2C bus; the internal pullups are fine if there's only
mjr 90:aa4e571da8e8 128 // one I2C device (in this case the VL6180X) connected to these pins.
mjr 82:4f6209cb5c33 129 //
mjr 90:aa4e571da8e8 130 // Note that VL6180X's I2C address is always 0x29 at power-on. The
mjr 90:aa4e571da8e8 131 // address can be changed during a session, but there's no way to save
mjr 90:aa4e571da8e8 132 // the value persistently on the VL6180X, so it always resets to 0x29
mjr 90:aa4e571da8e8 133 // on the next power cycle. As a result, I see little reason to ever
mjr 90:aa4e571da8e8 134 // change it during a session.
mjr 87:8d35c74403af 135 VL6180X(PinName sda, PinName scl, uint8_t addr, PinName gpio0,
mjr 87:8d35c74403af 136 bool internalPullups);
mjr 82:4f6209cb5c33 137
mjr 82:4f6209cb5c33 138 // destruction
mjr 82:4f6209cb5c33 139 ~VL6180X();
mjr 82:4f6209cb5c33 140
mjr 82:4f6209cb5c33 141 // Send the required initialization sequence. Returns true on
mjr 82:4f6209cb5c33 142 // success, false on failure.
mjr 82:4f6209cb5c33 143 bool init();
mjr 82:4f6209cb5c33 144
mjr 82:4f6209cb5c33 145 // set up default settings
mjr 82:4f6209cb5c33 146 void setDefaults();
mjr 82:4f6209cb5c33 147
mjr 82:4f6209cb5c33 148 // Start a distance reading, returning immediately without waiting
mjr 82:4f6209cb5c33 149 // for the reading to finish. The caller can poll for the finished
mjr 82:4f6209cb5c33 150 // reading via distanceReady().
mjr 82:4f6209cb5c33 151 void startRangeReading();
mjr 82:4f6209cb5c33 152
mjr 82:4f6209cb5c33 153 // Get TOF range distance in mm. Returns 0 on success, a device
mjr 82:4f6209cb5c33 154 // "range error code" (>0) on failure, or -1 on timeout.
mjr 87:8d35c74403af 155 //
mjr 87:8d35c74403af 156 // 'tMid' is the timestamp in microseconds of the midpoint of the
mjr 87:8d35c74403af 157 // sample, relative to an arbitrary zero point. This can be used
mjr 87:8d35c74403af 158 // to construct a timeline of successive readings, such as for
mjr 87:8d35c74403af 159 // velocity calculations. 'dt' is the time the sensor took to
mjr 87:8d35c74403af 160 // collect the sample.
mjr 87:8d35c74403af 161 int getRange(
mjr 87:8d35c74403af 162 uint8_t &distance, uint32_t &tMid, uint32_t &dt,
mjr 87:8d35c74403af 163 uint32_t timeout_us);
mjr 82:4f6209cb5c33 164
mjr 82:4f6209cb5c33 165 // get range statistics
mjr 82:4f6209cb5c33 166 void getRangeStats(VL6180X_RangeStats &stats);
mjr 82:4f6209cb5c33 167
mjr 82:4f6209cb5c33 168 // set continuous distance mode
mjr 82:4f6209cb5c33 169 void continuousDistanceMode(bool on);
mjr 82:4f6209cb5c33 170
mjr 82:4f6209cb5c33 171 // is a sample ready?
mjr 82:4f6209cb5c33 172 bool rangeReady();
mjr 82:4f6209cb5c33 173
mjr 82:4f6209cb5c33 174 // get identification data
mjr 82:4f6209cb5c33 175 void getID(VL6180X_ID &id);
mjr 82:4f6209cb5c33 176
mjr 87:8d35c74403af 177 protected:
mjr 87:8d35c74403af 178 // READOUT_AVERAGING_SAMPLE_PERIOD setting. Each unit represents
mjr 87:8d35c74403af 179 // 64.5us of added time beyond the 1.3ms fixed base period. The
mjr 87:8d35c74403af 180 // default is 48 units.
mjr 87:8d35c74403af 181 static const int averagingSamplePeriod = 48;
mjr 82:4f6209cb5c33 182
mjr 82:4f6209cb5c33 183 // I2C interface to device
mjr 82:4f6209cb5c33 184 BitBangI2C i2c;
mjr 82:4f6209cb5c33 185
mjr 82:4f6209cb5c33 186 // GPIO0 pin for hard reset
mjr 85:3c28aee81cde 187 DigitalInOut gpio0Pin;
mjr 82:4f6209cb5c33 188
mjr 82:4f6209cb5c33 189 // device address
mjr 82:4f6209cb5c33 190 uint8_t addr;
mjr 82:4f6209cb5c33 191
mjr 82:4f6209cb5c33 192 // current distance mode: 0=single shot, 1=continuous
mjr 82:4f6209cb5c33 193 bool distMode;
mjr 87:8d35c74403af 194
mjr 87:8d35c74403af 195 // range reading is in progress
mjr 87:8d35c74403af 196 bool rangeStarted;
mjr 87:8d35c74403af 197
mjr 87:8d35c74403af 198 // sample timer
mjr 87:8d35c74403af 199 Timer sampleTimer;
mjr 87:8d35c74403af 200
mjr 87:8d35c74403af 201 // time (from Timer t) of start of last range sample
mjr 87:8d35c74403af 202 uint32_t tSampleStart;
mjr 82:4f6209cb5c33 203
mjr 82:4f6209cb5c33 204 // read registers
mjr 82:4f6209cb5c33 205 uint8_t readReg8(uint16_t regAddr);
mjr 82:4f6209cb5c33 206 uint16_t readReg16(uint16_t regAddr);
mjr 82:4f6209cb5c33 207 uint32_t readReg32(uint16_t regAddr);
mjr 82:4f6209cb5c33 208
mjr 82:4f6209cb5c33 209 // write registers
mjr 82:4f6209cb5c33 210 void writeReg8(uint16_t regAddr, uint8_t data);
mjr 82:4f6209cb5c33 211 void writeReg16(uint16_t regAddr, uint16_t data);
mjr 82:4f6209cb5c33 212 };
mjr 82:4f6209cb5c33 213
mjr 82:4f6209cb5c33 214 #endif