ST意法半导体
直播中

vinww特烦恼

8年用户 1136经验值
擅长:存储技术
私信 关注
[问答]

请教大神怎样使用VL53l1X来检测人员离开和进入呢?

我们在我们的应用程序中使用 VL53l1X 来检测人员离开和进入,我们从我的一个分销商那里得到了 5 个 vl53l1x 分线板用于原型制作。
在轮询/连续模式下使用它时,人们可以毫无问题地计算编程工作,但是为了功率优化,我们想使用中断方法,计数递增和递减应该在有中断时发生,其余时间主控制器和其他事情处于睡眠模式。

  • 从 -> en.STSW-IMG010.zip 获取代码
  • 轮询方法在这里工作正常
  • 根据我的应用程序使用 ROI、时间预算,一切正常
  • 修改了中断方法的给定代码,我们得到了中断,但大多数时候我们得到了错误的路径和错误的计数。
这是代码...
//事件回调
void interrupt_handler(nrf_drv_gpiote_pin_t 引脚,nrf_gpiote_polarity_t 动作)
{
   nrf_drv_gpiote_in_event_disable(INTERRUPT_PIN);
   事件=真;
   printf("事件​​发生n");
}

//主要代码
int 主要(无效)
{
  uint8_t 字节数据,传感器状态=0;
  uint16_t 字数据;
  uint16_t 距离,信号;
  uint8_t 范围状态;
  uint8_t 数据就绪;
  uint8_t int极性;
  int Ppl计数器;
  int center[2] = {FRONT_ZONE_CENTER, BACK_ZONE_CENTER}; /* 这些是 2 个 4*16 区域的 spad 中心 */
  //int 区域 = 0;

  gpio_init();
   
  printf("rnTWI 传感器示例开始。n");
  twi_init();
  detect_slave_device();

  // 那些基本的 I2C 读函数可以用来检查你自己的 I2C 函数 */
  status = VL53L1_RdByte(dev, 0x010F, &byteData);
  printf("VL53L1X Model_ID: %Xn", byteData);
  status = VL53L1_RdByte(dev, 0x0110, &byteData);
  printf("VL53L1X Module_Type: %Xn", byteData);
  status = VL53L1_RdWord(dev, 0x010F, &wordData);
  printf("VL53L1X: %Xn", wordData);
  while (sensorState == 0) {
   status = VL53L1X_BootState(dev, &sensorState);
   nrf_delay_ms(2);
  }
  printf("芯片启动n");
  
  status = VL53L1X_SensorInit(dev);
  状态 += VL53L1X_SetDistanceMode(dev, DISTANCE_MODE); /* 1=短,2=长 */
  status += VL53L1X_SettimingBudgetInMs(dev, TIMING_BUDGET); /* 以毫秒为单位的可能值 [15, 20, 50, 100, 200, 500] */
  status += VL53L1X_SetInterMeasurementInMs(dev, TIMING_BUDGET);
  status += VL53L1X_SetROI(dev, ROWS_OF_Spads, 16); /* 最小投资回报率 4,4 */
   
  如果(状态!= 0){
   printf("设备的初始化或配置n");
   返回(-1);
  }

VL53L1X_SetInterruptPolarity(dev, 0);
  VL53L1X_SetDistanceThreshold(dev,50,1000,3,0);
  VL53L1X_GetInterruptPolarity(dev, &intPolarity);
  printf("中断模式: %dn", intPolarity);

  printf("开始统计个人资料:%s...n", PROFILE_STRING);
   
  status = VL53L1X_StartRanging(dev);

  而(1)
  {

如果(事件==真){
    status += VL53L1X_GetRangeStatus(dev, &RangeStatus);
    状态 += VL53L1X_GetDistance(dev, &Distance);
    status += VL53L1X_GetSignalPerSpad(dev, &Signal);
    //事件=假;
    状态 += VL53L1X_ClearInterrupt(dev);

    如果(状态!= 0){
     printf("操作设备出错n");
     返回(-1);
    }

    status = VL53L1X_SetROICenter(dev, center[Zone]);
    如果(状态!= 0){
     printf("更改 ROI 中心时出错n");
     返回(-1);
    }

    如果((RangeStatus == 0)||(RangeStatus == 4)||(RangeStatus == 7)){
     if (Distance <= MIN_DISTANCE) // wraparound case 见常量定义处的解释
      距离 = MAX_DISTANCE + MIN_DISTANCE;
    }
    else // 严重错误情况
     距离 = MAX_DISTANCE;

    PplCounter = ProcessPeopleCountingData(距离、区域、范围状态);
    区域++;
    区域 = 区域 %2;
}
  }
}

当有入口或出口或错误路径时,使 event = false 和nrf_drv_gpiote_in_event_enable(INTERRUPT_PIN) 。
请向我们提供中断方法的 VL53L1X API。

回帖(1)

贾埃罗

2022-12-26 14:26:57
这是一件很难的事。
中断模式将节省一些 MCU 电源,但不会节省传感器中的任何电源。
传感器在运行时使用大约 20mA 的电流。大部分功率用于为激光器供电。
一个范围通常需要大约 20 毫秒,如果您每秒测量 10 次,您将使用 20mA * 0.020 秒 * 10 次运行。
它将使用此电源、中断或轮询。
您只能通过减少时序预算或每秒测距的次数来节省电量。
在自主模式下,传感器将非常愉快地运行并仅在超过您设置的阈值时生成中断。
所以你的 MCU 可以睡着,只有在收到中断时才醒来。
但是如果你为了省电而减少测距次数,我猜你会错过路过的人。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分