完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们在我们的应用程序中使用 VL53l1X 来检测人员离开和进入,我们从我的一个分销商那里得到了 5 个 vl53l1x 分线板用于原型制作。
在轮询/连续模式下使用它时,人们可以毫无问题地计算编程工作,但是为了功率优化,我们想使用中断方法,计数递增和递减应该在有中断时发生,其余时间主控制器和其他事情处于睡眠模式。
//事件回调 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个回答
|
|
这是一件很难的事。
中断模式将节省一些 MCU 电源,但不会节省传感器中的任何电源。 传感器在运行时使用大约 20mA 的电流。大部分功率用于为激光器供电。 一个范围通常需要大约 20 毫秒,如果您每秒测量 10 次,您将使用 20mA * 0.020 秒 * 10 次运行。 它将使用此电源、中断或轮询。 您只能通过减少时序预算或每秒测距的次数来节省电量。 在自主模式下,传感器将非常愉快地运行并仅在超过您设置的阈值时生成中断。 所以你的 MCU 可以睡着,只有在收到中断时才醒来。 但是如果你为了省电而减少测距次数,我猜你会错过路过的人。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2632 浏览 1 评论
3208 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1783 浏览 1 评论
3607 浏览 6 评论
5987 浏览 21 评论
939浏览 4评论
1315浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
582浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1302浏览 3评论
1357浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:02 , Processed in 0.740093 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号