找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14165|回复: 33
收起左侧

stm32 vl53l0x激光测距程序

  [复制链接]
ID:227475 发表于 2017-8-14 00:54 | 显示全部楼层 |阅读模式
}7IRKBG8(G1V5{R7HBP11BY.jpg
0.png

vl53l0x激光测距的stm32单片机源程序如下:
  1. #include "vl53l0.h"
  2. VL53L0X_Dev_t vl53l0x_dev;
  3. VL53L0X_DeviceInfo_t vl53l0x_dev_info;
  4. VL53L0X_RangingMeasurementData_t vl53l0x_data;
  5. VL53L0X_Error vl53l0x_status;

  6. /***************************************************************************************/

  7. void print_pal_error(VL53L0X_Error Status)
  8. {
  9.     char buf[VL53L0X_MAX_STRING_LENGTH];
  10.     VL53L0X_GetPalErrorString(Status, buf);  //得到错误码与字符串
  11.     printf("API Status: %i : %s\n", Status, buf);
  12. }

  13. void print_range_status(VL53L0X_RangingMeasurementData_t* pdata)
  14. {
  15.     char buf[VL53L0X_MAX_STRING_LENGTH];
  16.     uint8_t RangeStatus;
  17.     // New Range Status: data is valid when pdata->RangeStatus = 0
  18.     RangeStatus = pdata->RangeStatus;

  19.     VL53L0X_GetRangeStatusString(RangeStatus, buf);
  20.    // printf("Range Status: %i : %s\n", RangeStatus, buf);
  21. }

  22. VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *pdev, \
  23.                             VL53L0X_RangingMeasurementData_t *pdata)
  24. {
  25.     VL53L0X_Error status = VL53L0X_ERROR_NONE;
  26.    
  27.     if(vl53l0x_status != VL53L0X_ERROR_NONE)
  28.         return vl53l0x_status;

  29.     status = VL53L0X_PerformSingleRangingMeasurement(pdev, pdata);   //VL53L0X执行单一测量范围
  30.     if(status != VL53L0X_ERROR_NONE){
  31.        // printf("error:Call of VL53L0X_PerformSingleRangingMeasurement\n");
  32.         return status;
  33.     }
  34.     print_range_status(pdata);
  35.     printf("%icm\n\n", (pdata->RangeMilliMeter)/10);
  36.     return status;
  37. }


  38. VL53L0X_Error vl53l0x_measure_init(VL53L0X_Dev_t *pMyDevice)
  39. {
  40.     VL53L0X_Error Status = VL53L0X_ERROR_NONE;

  41.     //FixPoint1616_t LimitCheckCurrent;
  42.     uint32_t refSpadCount;
  43.     uint8_t isApertureSpads;
  44.     uint8_t VhvSettings;
  45.     uint8_t PhaseCal;
  46.     // Device Initialization
  47.     Status = VL53L0X_StaticInit(pMyDevice);   //基本设备初始化
  48.     if(Status != VL53L0X_ERROR_NONE){         //判断是否初始化成功 失败打印错误信息
  49.         printf ("Call of VL53L0X_StaticInit\n");
  50.         print_pal_error(Status);
  51.         return Status;
  52.     }
  53.     // Device Initialization
  54.     Status = VL53L0X_PerformRefCalibration(pMyDevice, &VhvSettings, &PhaseCal);    //执行参考校准
  55.     if(Status != VL53L0X_ERROR_NONE){        //判断是否校准成功
  56.         printf ("Call of VL53L0X_PerformRefCalibration\n");
  57.         print_pal_error(Status);
  58.         return Status;
  59.     }

  60.     // needed if a coverglass is used and no calibration has been performed
  61.     Status = VL53L0X_PerformRefSpadManagement(pMyDevice,&refSpadCount, &isApertureSpads);
  62.     if(Status != VL53L0X_ERROR_NONE){
  63.         printf ("Call of VL53L0X_PerformRefSpadManagement\n");
  64.         printf ("refSpadCount = %d, isApertureSpads = %d\n", refSpadCount, isApertureSpads);
  65.         print_pal_error(Status);
  66.         return Status;
  67.     }

  68.     // no need to do this when we use VL53L0X_PerformSingleRangingMeasurement  当我们使用VL53L0X_PerformSingleRangingMeasurement不需要
  69.     Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode 设置单一测量模式
  70.     if(Status != VL53L0X_ERROR_NONE){
  71.         printf ("Call of VL53L0X_SetDeviceMode\n");
  72.         print_pal_error(Status);
  73.         return Status;
  74.     }

  75.     // Enable/Disable Sigma and Signal check
  76.     if(Status == VL53L0X_ERROR_NONE){
  77.         Status = VL53L0X_SetLimitCheckEnable(pMyDevice,  //启用/禁用特定限制检查
  78.                         VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  79.     }
  80.     if(Status == VL53L0X_ERROR_NONE){
  81.         Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  82.                         VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  83.     }
  84.                                 
  85.     if(Status == VL53L0X_ERROR_NONE){
  86.         Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  87.                         VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
  88.                         (FixPoint1616_t)(0.25*65536));
  89.         }                        
  90.     if(Status == VL53L0X_ERROR_NONE){
  91.         Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  92.                         VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
  93.                         (FixPoint1616_t)(18*65536));                        
  94.     }
  95.     if(Status == VL53L0X_ERROR_NONE){
  96.         Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,   //设置微秒时间
  97.                         200000);
  98.     }
  99.     if(Status != VL53L0X_ERROR_NONE){
  100.         printf ("Sigma and Signal check error\n");
  101.         print_pal_error(Status);
  102.         return Status;
  103.     }
  104.     /*
  105.      *  Step  4 : Test ranging mode
  106.      */
  107.   /*  for(i=0;i<10;i++){
  108.             printf ("Call of VL53L0X_PerformSingleRangingMeasurement\n");
  109.             Status = VL53L0X_PerformSingleRangingMeasurement(pMyDevice,
  110.                             &vl53l0x_data);

  111.             print_pal_error(Status);
  112.             print_range_status(&vl53l0x_data);

  113.             VL53L0X_GetLimitCheckCurrent(pMyDevice,
  114.                             VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, &LimitCheckCurrent);

  115.             printf("RANGE IGNORE THRESHOLD: %f\n\n", (float)LimitCheckCurrent/65536.0);


  116.             if (Status != VL53L0X_ERROR_NONE) break;

  117.             printf("Measured distance: %i\n\n", vl53l0x_data.RangeMilliMeter);

  118.     }
  119. */
  120.     return Status;   //返回0
  121. }

  122. VL53L0X_Error vl53l0x_init(void)
  123. {
  124.     VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值赋值为0

  125.     VL53L0X_Dev_t *pMyDevice = &vl53l0x_dev;       //得到设备地址

  126.     pMyDevice->I2cDevAddr      = 0x52;            //iic地址
  127.     pMyDevice->comms_type      =  1;              //选择IIC还是SPI    iic=1;SPI=0
  128.     pMyDevice->comms_speed_khz =  400;            //iic速率
  129.    
  130.     VL53L0X_i2c_init();          //IIC配置   

  131.     Status = VL53L0X_DataInit(pMyDevice); // Data initialization  //VL53L0X_DataInit:一次设备的初始化,初始化成功返回0
  132.     if(Status != VL53L0X_ERROR_NONE){     //判断如果状态不为0   打印错误信息
  133.         print_pal_error(Status);
  134.         return Status;        //  返回错误值 可通过此值DEBUG查找错误位置
  135.     }

  136.     Status = VL53L0X_GetDeviceInfo(pMyDevice, &vl53l0x_dev_info);   //读取给定设备的设备信息
  137.     if(Status != VL53L0X_ERROR_NONE){
  138.         print_pal_error(Status);
  139.         return Status;
  140.     }
  141.     printf("VL53L0X_GetDeviceInfo:\n");
  142.     printf("Device Name : %s\n", vl53l0x_dev_info.Name);     //设备名
  143.     printf("Device Type : %s\n", vl53l0x_dev_info.Type);    //产品类型VL53L0X = 1, VL53L1 = 2
  144. ……………………

  145. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
vl53l0x_测距.rar (639.98 KB, 下载次数: 479)

评分

参与人数 5黑币 +69 收起 理由
xuesong7417 + 8 赞一个!
emmmmm + 5 很给力!
默认隐藏 + 1 很给力!我刚刚好需要,就拿来参考了
32818 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:223540 发表于 2017-8-16 16:09 | 显示全部楼层
感謝您的分享
回复

使用道具 举报

ID:290110 发表于 2018-3-10 17:04 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:297594 发表于 2018-3-26 23:09 | 显示全部楼层
感谢楼主分享 长见识啊 对得起这价格
回复

使用道具 举报

ID:72988 发表于 2018-3-27 13:06 | 显示全部楼层
感謝您的分享
回复

使用道具 举报

ID:314389 发表于 2018-4-23 12:59 | 显示全部楼层
感谢您的分享
回复

使用道具 举报

ID:119803 发表于 2018-4-25 15:50 | 显示全部楼层
谢谢分享 可惜要黑笔
回复

使用道具 举报

ID:345678 发表于 2018-6-21 15:00 | 显示全部楼层
guaishushu 发表于 2018-4-25 15:50
谢谢分享 可惜要黑笔

楼主使用的单片机的具体型号是多少呀,求告知
回复

使用道具 举报

ID:356817 发表于 2018-7-10 09:13 | 显示全部楼层
多谢楼主,很厉害
回复

使用道具 举报

ID:267607 发表于 2018-7-12 13:17 | 显示全部楼层
謝謝分享,樓主很棒
回复

使用道具 举报

ID:312675 发表于 2018-8-2 10:28 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:371971 发表于 2018-8-8 18:45 | 显示全部楼层
看完了有点不明所以
回复

使用道具 举报

ID:394398 发表于 2018-9-6 15:01 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:250090 发表于 2018-9-29 12:38 | 显示全部楼层
        很给力!我刚刚好需要,就拿来参考了
回复

使用道具 举报

ID:414444 发表于 2018-10-24 09:34 | 显示全部楼层
正在找呢,谢谢您
回复

使用道具 举报

ID:434041 发表于 2018-11-28 14:05 | 显示全部楼层
非常不错
回复

使用道具 举报

ID:439402 发表于 2018-12-4 17:07 | 显示全部楼层
终于找到了,感谢楼主
回复

使用道具 举报

ID:439402 发表于 2018-12-4 17:09 | 显示全部楼层
正在找呢,谢谢
回复

使用道具 举报

ID:282138 发表于 2018-12-11 10:47 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:455438 发表于 2018-12-28 16:27 | 显示全部楼层
感谢感谢!!
回复

使用道具 举报

ID:388992 发表于 2019-1-16 13:22 | 显示全部楼层
最近也在找这方面的资料,感谢楼主分享!
回复

使用道具 举报

ID:437392 发表于 2019-2-20 22:00 | 显示全部楼层
挺好,值得大家学习
回复

使用道具 举报

ID:45026 发表于 2019-2-24 19:52 | 显示全部楼层
非常好,很好的学习资料,多谢分享!
回复

使用道具 举报

ID:411805 发表于 2019-3-4 09:00 | 显示全部楼层
感谢感谢!
回复

使用道具 举报

ID:500798 发表于 2019-3-30 10:06 | 显示全部楼层
想请问一下楼主和各位已经下载的大神,这个只需要接好IO口就可以直接使用吗
回复

使用道具 举报

ID:6906 发表于 2019-3-30 10:48 | 显示全部楼层
这个测距的测量范围是多少?测量精度又是多少?
回复

使用道具 举报

ID:393856 发表于 2019-7-11 11:52 | 显示全部楼层
感谢UP主!得以借鉴一下。
回复

使用道具 举报

ID:597851 发表于 2019-8-8 16:43 | 显示全部楼层
啦啦啦,我要代码
回复

使用道具 举报

ID:510572 发表于 2019-8-8 23:33 | 显示全部楼层
想问问xshut和GPIO1怎么接,库的代码看不过来
回复

使用道具 举报

ID:485354 发表于 2019-8-19 09:30 | 显示全部楼层
感谢楼主的无私奉献
回复

使用道具 举报

ID:558527 发表于 2019-9-21 14:49 | 显示全部楼层
感谢楼主的无私奉献
回复

使用道具 举报

ID:630593 发表于 2019-10-28 18:49 | 显示全部楼层
很给力,正需要
回复

使用道具 举报

ID:697669 发表于 2020-3-29 20:19 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:741590 发表于 2020-4-30 11:31 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表