你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

VL53L0X在超出测距范围(>2M)时,返回20mm和8190mm两种结果

[复制链接]
work0379@163.co 提问时间:2018-3-10 21:23 /



参考下面代码进行测距,在物体较远>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[7], gbuf[6]);
  uint16_t scnt = makeuint16(gbuf[9], gbuf[8]);
  uint16_t dist = makeuint16(gbuf[11], gbuf[10]);
  byte DeviceRangeStatusInternal = ((gbuf[0] & 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);
}


收藏 1 评论6 发布时间:2018-3-10 21:23

举报

6个回答
butterflyspring 回答时间:2018-3-12 15:16:19
这是什么呀?我们那个测距sensor?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

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的
  1. int main(void)
  2. {
  3.         WDTCTL = WDTPW | WDTHOLD;        // stop watchdog timer
  4.         P1DIR |= BIT0;
  5.     TA0_Init();
  6.     UCA0_Init();
  7.     UCB0_Init();
  8.     TA0CCR0 += 6000;
  9.     __bis_SR_register(LPM0_bits | GIE);
  10.     UART_Print("\n");
  11.     TA0CCR0 += 1200;
  12.     __bis_SR_register(LPM0_bits | GIE);
  13.     sprintf(Buffer, "Revision ID = %d\n", VL53L0X_RX(0xC0));
  14.     UART_Print(Buffer);
  15.     TA0CCR0 += 1200;
  16.     __bis_SR_register(LPM0_bits | GIE);
  17.     sprintf(Buffer, "Device ID = %d\n", VL53L0X_RX(0xC2));
  18.     UART_Print(Buffer);
  19.     TA0CCR0 += 1200;
  20.     __bis_SR_register(LPM0_bits | GIE);
  21.     sprintf(Buffer, "PRE_RANGE_CONFIG_VCSEL_PERIOD = %d\n", VL53L0X_RX(0x50));
  22.     UART_Print(Buffer);
  23.     TA0CCR0 += 1200;
  24.     __bis_SR_register(LPM0_bits | GIE);
  25.     sprintf(Buffer, "FINAL_RANGE_CONFIG_VCSEL_PERIOD = %d\n", VL53L0X_RX(0x70));
  26.     UART_Print(Buffer);
  27.     TA0CCR0 += 1200;
  28.     __bis_SR_register(LPM0_bits | GIE);
  29.     while(1)
  30.     {
  31.         VL53L0X_TX(0x00,0x01);
  32.         while(!(VL53L0X_RX(0x14) & 0x01));
  33.         VL53L0X_Result = VL53L0X_RX16(0x1E);
  34.         if(VL53L0X_Result == 20){
  35.             UART_Print("Distance < 20 mm\n");
  36.             P1OUT |= BIT0;
  37.         }
  38.         else if(VL53L0X_Result > 2000){
  39.             UART_Print("Distance > 2000 mm\n");
  40.             P1OUT |= BIT0;
  41.         }
  42.         else{
  43.             sprintf(Buffer,"Distance = %d mm\n", VL53L0X_Result);
  44.             UART_Print(Buffer);
  45.             P1OUT &= ~BIT0;
  46.         }
  47.         TA0CCR0 += 6000;
  48.         __bis_SR_register(LPM0_bits | GIE);
  49.     }
  50.         return 0;
  51. }
复制代码

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

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蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版