Time of Flight Sensor
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Dependents: Ultrasound_And_IMU
Fork of X_NUCLEO_6180XA1 by
Revision 28:7c9031e96c22, committed 2015-11-05
- Comitter:
- gallonm
- Date:
- Thu Nov 05 17:20:03 2015 +0100
- Parent:
- 27:22c6f69967d9
- Child:
- 29:6d6b67e2e212
- Commit message:
- Settled AlsSetThresholds function that takes the parameters in lux.
VL6180x_AlsSetThresholds takes the parameters in raw device value.
Changed in this revision
--- a/Components/Display/Display_class.h Wed Nov 04 17:17:35 2015 +0100
+++ b/Components/Display/Display_class.h Thu Nov 05 17:20:03 2015 +0100
@@ -209,7 +209,7 @@
*pDisplay_DGT[digit] = 0;
}
- void Digit_off (int digit) // digits on
+ void Digit_off (int digit) // digits off
{
*pDisplay_DGT[digit] = 1;
}
--- a/Components/VL6180X/vl6180x_class.cpp Wed Nov 04 17:17:35 2015 +0100
+++ b/Components/VL6180X/vl6180x_class.cpp Thu Nov 05 17:20:03 2015 +0100
@@ -528,7 +528,7 @@
if( status ) break;
status = VL6180x_AlsSetAnalogueGain(dev, 0);
if( status ) break;
- status = VL6180x_AlsSetThresholds(dev, 0, 1800);
+ status = VL6180x_AlsSetThresholds(dev, 0, 0xFFFF);
if( status ) break;
/* set Als InterruptMode to new sample */
status=VL6180x_AlsConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_DISABLED);
@@ -725,33 +725,16 @@
-int VL6180X::VL6180x_AlsSetThresholds(VL6180xDev_t dev, lux_t low, lux_t high) {
+int VL6180X::VL6180x_AlsSetThresholds(VL6180xDev_t dev, uint16_t low, uint16_t high) {
int status;
- uint32_t AlsAnGain, IntPeriod, AlsScaler, GainFix, RawAlsHigh, RawAlsLow;
- uint16_t RawThreshLow, RawThreshHigh;
- const uint32_t LuxResxIntIme =(uint32_t)(0.56f* DEF_INT_PEFRIOD *(1<<LUXRES_FIX_PREC));
- void *ptr;
-
+
LOG_FUNCTION_START("%d %d", (int )low, (int)high);
- AlsAnGain=VL6180xDevDataGet(dev, AlsGainCode);
- IntPeriod=VL6180xDevDataGet(dev, IntegrationPeriod);
- AlsScaler=VL6180xDevDataGet(dev, AlsScaler);
- GainFix=AlsGainLookUp[AlsAnGain];
- IntPeriod++;
- RawAlsLow=low*AlsScaler*GainFix;
- RawAlsLow=RawAlsLow*IntPeriod;
- RawAlsLow=RawAlsLow/LuxResxIntIme;
- RawAlsHigh=high*(AlsScaler*GainFix);
- RawAlsHigh=RawAlsHigh*IntPeriod;
- RawAlsHigh=RawAlsHigh/LuxResxIntIme;
- ptr=&RawAlsLow;
- RawThreshLow=*(uint16_t*)ptr;
- status = VL6180x_WrWord(dev, SYSALS_THRESH_LOW, RawThreshLow);
+
+ status = VL6180x_WrWord(dev, SYSALS_THRESH_LOW, low);
if(!status ){
- ptr=&RawAlsHigh;
- RawThreshHigh=*(uint16_t*)ptr;
- status = VL6180x_WrWord(dev, SYSALS_THRESH_HIGH, RawThreshHigh);
+ status = VL6180x_WrWord(dev, SYSALS_THRESH_HIGH, high);
}
+
LOG_FUNCTION_END(status) ;
return status;
}
@@ -1179,17 +1162,17 @@
VL6180x_WrByte( dev, 0x0030, 0x00);
/* Recommended : Public registers - See data sheet for more detail */
- VL6180x_WrByte( dev, 0x0011, 0x10); /* Enables polling for New Sample ready when measurement completes */
- VL6180x_WrByte( dev, 0x010a, 0x30); /* Set the averaging sample period (compromise between lower noise and increased execution time) */
- VL6180x_WrByte( dev, 0x003f, 0x46); /* Sets the light and dark gain (upper nibble). Dark gain should not be changed.*/
- VL6180x_WrByte( dev, 0x0031, 0xFF); /* sets the # of range measurements after which auto calibration of system is performed */
- VL6180x_WrByte( dev, 0x0040, 0x63); /* Set ALS integration time to 100ms */
- VL6180x_WrByte( dev, 0x002e, 0x01); /* perform a single temperature calibration of the ranging sensor */
+ VL6180x_WrByte( dev, SYSTEM_MODE_GPIO1, 0x10); /* Enables polling for New Sample ready when measurement completes */
+ VL6180x_WrByte( dev, READOUT_AVERAGING_SAMPLE_PERIOD, 0x30); /* Set the averaging sample period (compromise between lower noise and increased execution time) */
+ VL6180x_WrByte( dev, SYSALS_ANALOGUE_GAIN, 0x46); /* Sets the light and dark gain (upper nibble). Dark gain should not be changed.*/
+ VL6180x_WrByte( dev, SYSRANGE_VHV_REPEAT_RATE, 0xFF); /* sets the # of range measurements after which auto calibration of system is performed */
+ VL6180x_WrByte( dev, SYSALS_INTEGRATION_PERIOD, 0x63); /* Set ALS integration time to 100ms */
+ VL6180x_WrByte( dev, SYSRANGE_VHV_RECALIBRATE, 0x01); /* perform a single temperature calibration of the ranging sensor */
/* Optional: Public registers - See data sheet for more detail */
- VL6180x_WrByte( dev, 0x001b, 0x09); /* Set default ranging inter-measurement period to 100ms */
- VL6180x_WrByte( dev, 0x003e, 0x31); /* Set default ALS inter-measurement period to 500ms */
- VL6180x_WrByte( dev, 0x0014, 0x24); /* Configures interrupt on New sample ready */
+ VL6180x_WrByte( dev, SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09); /* Set default ranging inter-measurement period to 100ms */
+ VL6180x_WrByte( dev, SYSALS_INTERMEASUREMENT_PERIOD, 0x31); /* Set default ALS inter-measurement period to 500ms */
+ VL6180x_WrByte( dev, SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24); /* Configures interrupt on New sample ready */
status=VL6180x_RangeSetMaxConvergenceTime(dev, 50); /* Calculate ece value on initialization (use max conv) */
@@ -1242,16 +1225,16 @@
VL6180x_WrByte( dev, 0x01ac, 0x3e);
VL6180x_WrByte( dev, 0x01a7, 0x1f);
VL6180x_WrByte( dev, 0x0030, 0x00);
- VL6180x_WrByte( dev, 0x0011, 0x10);
- VL6180x_WrByte( dev, 0x010a, 0x30);
- VL6180x_WrByte( dev, 0x003f, 0x46);
- VL6180x_WrByte( dev, 0x0031, 0xFF);
- VL6180x_WrByte( dev, 0x0040, 0x63);
- VL6180x_WrByte( dev, 0x002e, 0x01);
- VL6180x_WrByte( dev, 0x002c, 0xff);
- VL6180x_WrByte( dev, 0x001b, 0x09);
- VL6180x_WrByte( dev, 0x003e, 0x31);
- VL6180x_WrByte( dev, 0x0014, 0x24);
+ VL6180x_WrByte( dev, SYSTEM_MODE_GPIO1, 0x10);
+ VL6180x_WrByte( dev, READOUT_AVERAGING_SAMPLE_PERIOD, 0x30);
+ VL6180x_WrByte( dev, SYSALS_ANALOGUE_GAIN, 0x46);
+ VL6180x_WrByte( dev, SYSRANGE_VHV_REPEAT_RATE, 0xFF);
+ VL6180x_WrByte( dev, SYSALS_INTEGRATION_PERIOD, 0x63);
+ VL6180x_WrByte( dev, SYSRANGE_VHV_RECALIBRATE, 0x01);
+ VL6180x_WrByte( dev, SYSRANGE_MAX_AMBIENT_LEVEL_MULT, 0xff);
+ VL6180x_WrByte( dev, SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09);
+ VL6180x_WrByte( dev, SYSALS_INTERMEASUREMENT_PERIOD, 0x31);
+ VL6180x_WrByte( dev, SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24);
#if VL6180x_EXTENDED_RANGE
VL6180x_RangeSetMaxConvergenceTime(dev, 63);
#else
@@ -2680,8 +2663,39 @@
}
return 0;
}
-
-
+
+/******************************************************************************/
+
+int VL6180X::AlsSetThresholds(uint16_t lux_threshold_low, uint16_t lux_threshold_high)
+{
+ uint32_t AlsAnGain, IntPeriod, AlsScaler, GainFix, RawAlsHigh, RawAlsLow;
+ uint16_t RawThreshLow, RawThreshHigh;
+ const uint32_t LuxResxIntIme =(uint32_t)(0.56f* DEF_INT_PEFRIOD *(1<<LUXRES_FIX_PREC));
+ void *p_low;
+ void *p_high;
+
+ AlsAnGain=VL6180xDevDataGet(Device, AlsGainCode);
+ IntPeriod=VL6180xDevDataGet(Device, IntegrationPeriod);
+ AlsScaler=VL6180xDevDataGet(Device, AlsScaler);
+ GainFix=AlsGainLookUp[AlsAnGain];
+ IntPeriod++;
+ RawAlsLow=lux_threshold_low*AlsScaler*GainFix;
+ RawAlsLow=RawAlsLow*IntPeriod;
+ RawAlsLow=RawAlsLow/LuxResxIntIme;
+ RawAlsHigh=lux_threshold_high*(AlsScaler*GainFix);
+ RawAlsHigh=RawAlsHigh*IntPeriod;
+ RawAlsHigh=RawAlsHigh/LuxResxIntIme;
+ p_low=&RawAlsLow;
+ RawThreshLow=*(uint16_t*)p_low;
+ p_high=&RawAlsHigh;
+ RawThreshHigh=*(uint16_t*)p_high;
+ //return VL6180x_AlsSetThresholds(Device, RawThreshLow, RawThreshHigh);
+ VL6180x_AlsSetThresholds(Device, RawThreshLow, RawThreshHigh);
+ VL6180x_RdWord(Device, SYSALS_THRESH_HIGH, &RawThreshLow);
+ VL6180x_RdWord(Device, SYSALS_THRESH_LOW, &RawThreshHigh);
+}
+
+
int VL6180X::ReadID()
{
int status;
--- a/Components/VL6180X/vl6180x_class.h Wed Nov 04 17:17:35 2015 +0100
+++ b/Components/VL6180X/vl6180x_class.h Thu Nov 05 17:20:03 2015 +0100
@@ -123,7 +123,7 @@
/** Destructor
*/
//virtual ~VL6180X(){}
- /* FIXME warning: VL6180X class inherits from GenericSensor, RangeSensor and LightSensor, that haven`t a destructor.
+ /* warning: VL6180X class inherits from GenericSensor, RangeSensor and LightSensor, that haven`t a destructor.
The warning should request to introduce a virtual destructor to make sure to delete the object */
/* turns on the sensor */
@@ -277,13 +277,10 @@
return VL6180x_AlsSetAnalogueGain(Device, gain);
}
- int AlsSetThresholds(lux_t low, lux_t high)
- {
- return VL6180x_AlsSetThresholds(Device, low, high);
- }
+ int AlsSetThresholds(uint16_t lux_threshold_low, uint16_t lux_threshold_high);
int AlsGetInterruptStatus(uint8_t *pIntStatus)
- {
+ {
return VL6180x_AlsGetInterruptStatus(Device, pIntStatus);
}
@@ -473,7 +470,7 @@
int VL6180x_AlsSetIntegrationPeriod(VL6180xDev_t dev, uint16_t period_ms);
int VL6180x_AlsSetInterMeasurementPeriod(VL6180xDev_t dev, uint16_t intermeasurement_period_ms);
int VL6180x_AlsSetAnalogueGain(VL6180xDev_t dev, uint8_t gain);
- int VL6180x_AlsSetThresholds(VL6180xDev_t dev, lux_t low, lux_t high);
+ int VL6180x_AlsSetThresholds(VL6180xDev_t dev, uint16_t low, uint16_t high);
int VL6180x_AlsGetInterruptStatus(VL6180xDev_t dev, uint8_t *pIntStatus);
int VL6180x_StaticInit(VL6180xDev_t dev);
int VL6180x_RangeWaitDeviceReady(VL6180xDev_t dev, int MaxLoop );
--- a/x_nucleo_6180xa1.cpp Wed Nov 04 17:17:35 2015 +0100
+++ b/x_nucleo_6180xa1.cpp Thu Nov 05 17:20:03 2015 +0100
@@ -48,7 +48,7 @@
if(_instance==NULL)
_instance=new X_NUCLEO_6180XA1(ext_i2c);
else
- printf("Failed to init X_NUCLEO_6180XA1 board!\n");
+ VL6180x_ErrLog("Failed to create X_NUCLEO_6180XA1 instance\n\r");
return _instance;
}
