cancel
Showing results for 
Search instead for 
Did you mean: 

VL6180x ECE Threshold, negative convergence time

TCubi.1
Associate

Hello,

We want to set the ECE threshold of the VL6180x.

We are following the document DT0034 - VL6180X early convergence estimate implementation.

SAMPLE = 119 (reg 0x10A)

MAX_CONV = 15 (reg 0x01C)

PERIOD = 48 (reg 0x10A)

TIME = (SAMPLE + 1) * (24 + 70 + (PERIOD*10)) + 200

TIME = 69080

CONV_TIME = MAX_CONV * 1000 - TIME

CONV_TIME = -54080

Is it possible to have a negative convergence time and how to handle it?

Thanks for your help,

Thomas

1 ACCEPTED SOLUTION

Accepted Solutions
John E KVAM
ST Employee

A while back we had a lot of questions like this. So instead of reading complex manual and trying to figure it all out, we wrote an API that does it all for you.

That API can be found at:

STSW-IMG003

Even if you don't use the API, there is a function in there that will set the max convergence time for you.

And look it over for other routines you might need.

And if you are so inclined - just use the API in your project. All the functions have been validated.

The following is what that API does. Compare it to yours.

good luck

static int VL6180x_RangeSetEarlyConvergenceEestimateThreshold(VL6180xDev_t dev)
{
	int status;
 
	const uint32_t cMicroSecPerMilliSec  = 1000;
	const uint32_t cEceSampleTime_us     = 500;
	uint32_t ece_factor_m          = VL6180xDevDataGet(dev, EceFactorM);
	uint32_t ece_factor_d          = VL6180xDevDataGet(dev, EceFactorD);
	uint32_t convergTime_us;
	uint32_t fineThresh;
	uint32_t eceThresh;
	uint8_t  u8;
	uint32_t maxConv_ms;
	int32_t AveTime;
 
	LOG_FUNCTION_START("");
 
	do {
		status = VL6180x_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &u8);
		if (status) {
			VL6180x_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail");
			break;
		}
		maxConv_ms = u8;
		AveTime = _GetAveTotalTime(dev);
		if (AveTime < 0) {
			status = -1;
			break;
		}
 
		convergTime_us = maxConv_ms * cMicroSecPerMilliSec - AveTime;
		status = VL6180x_RdDWord(dev, 0xB8, &fineThresh);
		if (status) {
			VL6180x_ErrLog("reg 0xB8 rd fail");
			break;
		}
		fineThresh *= 256;
		eceThresh = ece_factor_m * cEceSampleTime_us * fineThresh / (convergTime_us * ece_factor_d);
 
		status = VL6180x_WrWord(dev, SYSRANGE_EARLY_CONVERGENCE_ESTIMATE, (uint16_t)eceThresh);
	} while (0);
 
	LOG_FUNCTION_END(status);
	return status;
}


If this or any post solves your issue, please mark them as 'Accept as Solution' It really helps. And if you notice anything wrong do not hesitate to 'Report Inappropriate Content'. Someone will review it.

View solution in original post

1 REPLY 1
John E KVAM
ST Employee

A while back we had a lot of questions like this. So instead of reading complex manual and trying to figure it all out, we wrote an API that does it all for you.

That API can be found at:

STSW-IMG003

Even if you don't use the API, there is a function in there that will set the max convergence time for you.

And look it over for other routines you might need.

And if you are so inclined - just use the API in your project. All the functions have been validated.

The following is what that API does. Compare it to yours.

good luck

static int VL6180x_RangeSetEarlyConvergenceEestimateThreshold(VL6180xDev_t dev)
{
	int status;
 
	const uint32_t cMicroSecPerMilliSec  = 1000;
	const uint32_t cEceSampleTime_us     = 500;
	uint32_t ece_factor_m          = VL6180xDevDataGet(dev, EceFactorM);
	uint32_t ece_factor_d          = VL6180xDevDataGet(dev, EceFactorD);
	uint32_t convergTime_us;
	uint32_t fineThresh;
	uint32_t eceThresh;
	uint8_t  u8;
	uint32_t maxConv_ms;
	int32_t AveTime;
 
	LOG_FUNCTION_START("");
 
	do {
		status = VL6180x_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &u8);
		if (status) {
			VL6180x_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail");
			break;
		}
		maxConv_ms = u8;
		AveTime = _GetAveTotalTime(dev);
		if (AveTime < 0) {
			status = -1;
			break;
		}
 
		convergTime_us = maxConv_ms * cMicroSecPerMilliSec - AveTime;
		status = VL6180x_RdDWord(dev, 0xB8, &fineThresh);
		if (status) {
			VL6180x_ErrLog("reg 0xB8 rd fail");
			break;
		}
		fineThresh *= 256;
		eceThresh = ece_factor_m * cEceSampleTime_us * fineThresh / (convergTime_us * ece_factor_d);
 
		status = VL6180x_WrWord(dev, SYSRANGE_EARLY_CONVERGENCE_ESTIMATE, (uint16_t)eceThresh);
	} while (0);
 
	LOG_FUNCTION_END(status);
	return status;
}


If this or any post solves your issue, please mark them as 'Accept as Solution' It really helps. And if you notice anything wrong do not hesitate to 'Report Inappropriate Content'. Someone will review it.