VL53L1X Distance Sensor 50% failure rate (erratic measurements).
Hi,
We have an issue with a production build of a VL53L1X based design. The VL53L1X is interfaced to a PIC18F micro, I have inherited the codebase and hardware. The initial production run was for 500 units, of these approx 260 passed our production tests and some have been working well in the field for some time.
The remaining 240 all exhibit an almost identical failure mode. Basically the readings will only
1 - Uart Output (Legacy Code - Good Sensor)
VTOF=345mm (5989) (0)
VTOF=346mm (5978) (0)
VTOF=346mm (6020) (0)
VTOF=344mm (5949) (0)
VTOF=345mm (6153) (0)
VTOF=346mm (5979) (0)
VTOF=347mm (6098) (0)
VTOF=345mm (6147) (0)
VTOF=347mm (6176) (0)
VTOF=346mm (6166) (0)
Min: 344, Max: 347, Avg: 345.70, Std Dev: 0.95
2 - Uart Output (Legacy Code - Bad Sensor)
VTOF=652mm (33) (1)
VTOF=524mm (48) (0)
VTOF=571mm (38) (7)
VTOF=496mm (25) (1)
VTOF=734mm (23) (1)
VTOF=570mm (14) (1)
VTOF=604mm (30) (1)
VTOF=515mm (19) (1)
VTOF=550mm (3) (2)
VTOF=587mm (11) (2)
Min: 496, Max: 734, Avg: 580.30, Std Dev: 70.73
*Numbers in brackets are "signal_rate" and "range_Status"
Above tests were run with a 300*200 grey target at 350mm, indoor lighting.
The inherited codebase was written some time ago by an outside contractor. I decided to implement the Ultra Lite Driver to see if the issue was to do with the firmware (the old code just puts a "known good" calibration table into the VL53L1X and begins reading).
After porting the library and writing some debug code, the bad sensors are still reading incorrectly. Although they are now much worse than when using the legacy code. I assume I will have to perform some calibration to get the offsets correct, but the repeatability issue remains on the bad sensor, which offest won't fix anyway.
3 - Ultra Lite Driver Register Printout (Good Sensor)
Timing Budget in ms : 100
Distance Mode : 2
Intermeasurement Period in ms : null
Boot State : 3
Sensor ID : 60108
Measured Distance : 673 mm
Signal Per SPAD : 24 kcps
Ambient Per SPAD : null
Signal Rate : 440 kcps
Number of SPADs : 1
Ambient Rate : null
Range Status : 2
Result - Distance : null
Offset : null
Crosstalk (Xtalk) : null
Distance Threshold Window : 0
Distance Threshold Low : null
Distance Threshold High : null
ROI Width : 63815, 4096
ROI Center : 199
Signal Threshold : 1024 kcps
Sigma Threshold : 90 mm
4 - Ultra Lite Driver (Bad Sensor)
Timing Budget in ms : 100
Distance Mode : 2
Intermeasurement Period in ms : null
Boot State : 3
Sensor ID : 60108
Measured Distance : 629 mm
Signal Per SPAD : 25 kcps
Ambient Per SPAD : null
Signal Rate : 464 kcps
Number of SPADs : 1
Ambient Rate : null
Range Status : 2
Result - Distance : null
Offset : null
Crosstalk (Xtalk) : null
Distance Threshold Window : 0
Distance Threshold Low : null
Distance Threshold High : null
ROI Width : 63815, 4096
ROI Center : 199
Signal Threshold : 1024 kcps
Sigma Threshold : 90 mm
On production units the sensor is protected by glass, with a 3d printed baffle to minimize cross-talk. I've validated that there's no effect from the hardware. The good/bad divide remains the same regardless of whether the glass or baffle is present. I've also validated supply rails are noise free and stable under operation. The "bad" sensors do not look dirty or damaged under the microscope.
I'll be implementing xtalk and offset calibration but I'd like to know if there are any other registers that I should be setting or adjusting? Or could it be that we have a bad batch of VL53L1X sensors?
I'm also not sure why many of the registers are returning errors? (My debug function marks any that do not return "VL53L1X_ERROR = 0" as "null")
Thanks in advance for your help.
