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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版