work0379@163.co 发表于 2018-3-10 21:23:24

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);
}


butterflyspring 发表于 2018-3-12 15:16:19

这是什么呀?我们那个测距sensor?

work0379@163.co 发表于 2018-3-12 17:19:42

butterflyspring 发表于 2018-3-12 15:16
这是什么呀?我们那个测距sensor?

是的,VL53L0X测距sensor,物体距离特别远的时候,多次测距,会返回20mm和8190mm两种结果,个人理解是超出测距范围应该稳定的返回8190

xmstudio 发表于 2018-3-12 23:28:04

这个东西的芯片手册上面没有任何寄存器的信息,上一代产品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;
}

work0379@163.co 发表于 2018-3-13 09:48:38

谢谢,您使用的时候,在距离大于2米的时候,会不会出现返回20mm呢?

work0379@163.co 发表于 2018-3-13 09:49:11

xmstudio 发表于 2018-3-12 23:28
这个东西的芯片手册上面没有任何寄存器的信息,上一代产品VL6180X好歹还开放了一部分寄存器给用户。我调这 ...


谢谢,您使用的时候,在距离大于2米的时候,会不会出现返回20mm呢?

work0379@163.co 发表于 2018-4-23 17:10:16

已解决,不用这种直接读取寄存器的方式,通过调用官方的API,按照API example的流程进行校准等设置,测量结果稳定并且可达到2米左右
页: [1]
查看完整版本: VL53L0X在超出测距范围(>2M)时,返回20mm和8190mm两种结果