我们在我们的应用程序中使用 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_Set
timingBudgetInMs(dev, TIMING_BUDGET); /* 以毫秒为单位的可能值 [15, 20, 50, 100, 200, 500] */
status += VL53L1X_SetInterMeasurementInMs(dev, TIMING_BUDGET);
status += VL53L1X_SetROI(dev, ROWS_OF_S
pads, 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。