VL53L0X在超出测距范围(>2M)时,返回20mm和8190mm两种结果
参考下面代码进行测距,在物体较远>2M时,返回的状态不稳定
会返回DeviceRangeStatusInternal = 9 距离=8190mm和 DeviceRangeStatusInternal= 8,距离=20mm两种状态
请问有人遇到这种问题吗,谢谢
void test() {
byte val1 = read_byte_data_at(VL53L0X_REG_IDENTIFICATION_REVISION_ID);
Serial.print("Revision ID: "); Serial.println(val1);
val1 = read_byte_data_at(VL53L0X_REG_IDENTIFICATION_MODEL_ID);
Serial.print("Device ID: "); Serial.println(val1);
val1 = read_byte_data_at(VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD);
Serial.print("PRE_RANGE_CONFIG_VCSEL_PERIOD="); Serial.println(val1);
Serial.print(" decode: "); Serial.println(VL53L0X_decode_vcsel_period(val1));
val1 = read_byte_data_at(VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD);
Serial.print("FINAL_RANGE_CONFIG_VCSEL_PERIOD="); Serial.println(val1);
Serial.print(" decode: "); Serial.println(VL53L0X_decode_vcsel_period(val1));
write_byte_data_at(VL53L0X_REG_SYSRANGE_START, 0x01);
byte val = 0;
int cnt = 0;
while (cnt < 100) { // 1 second waiting time max
delay(10);
val = read_byte_data_at(VL53L0X_REG_RESULT_RANGE_STATUS);
if (val & 0x01) break;
cnt++;
}
if (val & 0x01) Serial.println("ready"); else Serial.println("not ready");
read_block_data_at(0x14, 12);
uint16_t acnt = makeuint16(gbuf, gbuf);
uint16_t scnt = makeuint16(gbuf, gbuf);
uint16_t dist = makeuint16(gbuf, gbuf);
byte DeviceRangeStatusInternal = ((gbuf & 0x78) >> 3);
Serial.print("ambient count: "); Serial.println(acnt);
Serial.print("signal count: ");Serial.println(scnt);
Serial.print("distance "); Serial.println(dist);
Serial.print("status: "); Serial.println(DeviceRangeStatusInternal);
}
这是什么呀?我们那个测距sensor? butterflyspring 发表于 2018-3-12 15:16
这是什么呀?我们那个测距sensor?
是的,VL53L0X测距sensor,物体距离特别远的时候,多次测距,会返回20mm和8190mm两种结果,个人理解是超出测距范围应该稳定的返回8190 这个东西的芯片手册上面没有任何寄存器的信息,上一代产品VL6180X好歹还开放了一部分寄存器给用户。我调这个的时候还是从淘宝上找的代码移植过来的,贴一下我的main函数吧,希望有参考价值
这个是别的单片机的代码,不是STM32的
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P1DIR |= BIT0;
TA0_Init();
UCA0_Init();
UCB0_Init();
TA0CCR0 += 6000;
__bis_SR_register(LPM0_bits | GIE);
UART_Print("\n");
TA0CCR0 += 1200;
__bis_SR_register(LPM0_bits | GIE);
sprintf(Buffer, "Revision ID = %d\n", VL53L0X_RX(0xC0));
UART_Print(Buffer);
TA0CCR0 += 1200;
__bis_SR_register(LPM0_bits | GIE);
sprintf(Buffer, "Device ID = %d\n", VL53L0X_RX(0xC2));
UART_Print(Buffer);
TA0CCR0 += 1200;
__bis_SR_register(LPM0_bits | GIE);
sprintf(Buffer, "PRE_RANGE_CONFIG_VCSEL_PERIOD = %d\n", VL53L0X_RX(0x50));
UART_Print(Buffer);
TA0CCR0 += 1200;
__bis_SR_register(LPM0_bits | GIE);
sprintf(Buffer, "FINAL_RANGE_CONFIG_VCSEL_PERIOD = %d\n", VL53L0X_RX(0x70));
UART_Print(Buffer);
TA0CCR0 += 1200;
__bis_SR_register(LPM0_bits | GIE);
while(1)
{
VL53L0X_TX(0x00,0x01);
while(!(VL53L0X_RX(0x14) & 0x01));
VL53L0X_Result = VL53L0X_RX16(0x1E);
if(VL53L0X_Result == 20){
UART_Print("Distance < 20 mm\n");
P1OUT |= BIT0;
}
else if(VL53L0X_Result > 2000){
UART_Print("Distance > 2000 mm\n");
P1OUT |= BIT0;
}
else{
sprintf(Buffer,"Distance = %d mm\n", VL53L0X_Result);
UART_Print(Buffer);
P1OUT &= ~BIT0;
}
TA0CCR0 += 6000;
__bis_SR_register(LPM0_bits | GIE);
}
return 0;
} 谢谢,您使用的时候,在距离大于2米的时候,会不会出现返回20mm呢? xmstudio 发表于 2018-3-12 23:28
这个东西的芯片手册上面没有任何寄存器的信息,上一代产品VL6180X好歹还开放了一部分寄存器给用户。我调这 ...
谢谢,您使用的时候,在距离大于2米的时候,会不会出现返回20mm呢? 已解决,不用这种直接读取寄存器的方式,通过调用官方的API,按照API example的流程进行校准等设置,测量结果稳定并且可达到2米左右
页:
[1]