標(biāo)題: stm32 vl53l0x激光測距程序 [打印本頁]

作者: qq1968204868    時間: 2017-8-14 00:54
標(biāo)題: stm32 vl53l0x激光測距程序



vl53l0x激光測距的stm32單片機(jī)源程序如下:
  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執(zhí)行單一測量范圍
  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);   //基本設(shè)備初始化
  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);    //執(zhí)行參考校準(zhǔn)
  55.     if(Status != VL53L0X_ERROR_NONE){        //判斷是否校準(zhǔn)成功
  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  當(dāng)我們使用VL53L0X_PerformSingleRangingMeasurement不需要
  69.     Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode 設(shè)置單一測量模式
  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,   //設(shè)置微秒時間
  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;       //得到設(shè)備地址

  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:一次設(shè)備的初始化,初始化成功返回0
  132.     if(Status != VL53L0X_ERROR_NONE){     //判斷如果狀態(tài)不為0   打印錯誤信息
  133.         print_pal_error(Status);
  134.         return Status;        //  返回錯誤值 可通過此值DEBUG查找錯誤位置
  135.     }

  136.     Status = VL53L0X_GetDeviceInfo(pMyDevice, &vl53l0x_dev_info);   //讀取給定設(shè)備的設(shè)備信息
  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);     //設(shè)備名
  143.     printf("Device Type : %s\n", vl53l0x_dev_info.Type);    //產(chǎn)品類型VL53L0X = 1, VL53L1 = 2
  144. ……………………

  145. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
vl53l0x_測距.rar (639.98 KB, 下載次數(shù): 486)




作者: b0960580770    時間: 2017-8-16 16:09
感謝您的分享
作者: wangling0324    時間: 2018-3-10 17:04
感謝分享
作者: 3243075147    時間: 2018-3-26 23:09
感謝樓主分享 長見識啊 對得起這價格
作者: nhtwins    時間: 2018-3-27 13:06
感謝您的分享
作者: swwesweswe    時間: 2018-4-23 12:59
感謝您的分享
作者: guaishushu    時間: 2018-4-25 15:50
謝謝分享 可惜要黑筆
作者: 上理小青蛙    時間: 2018-6-21 15:00
guaishushu 發(fā)表于 2018-4-25 15:50
謝謝分享 可惜要黑筆

樓主使用的單片機(jī)的具體型號是多少呀,求告知
作者: 天啟233    時間: 2018-7-10 09:13
多謝樓主,很厲害
作者: a10642525    時間: 2018-7-12 13:17
謝謝分享,樓主很棒

作者: 不如吃酒去    時間: 2018-8-2 10:28
感謝分享
作者: mycnxp    時間: 2018-8-8 18:45
看完了有點(diǎn)不明所以

作者: wawa10061212    時間: 2018-9-6 15:01
謝謝分享
作者: wxh126    時間: 2018-9-29 12:38
        很給力!我剛剛好需要,就拿來參考了
作者: weiguangzhuo    時間: 2018-10-24 09:34
正在找呢,謝謝您
作者: 雷雷別跑    時間: 2018-11-28 14:05
非常不錯
作者: symbol2018    時間: 2018-12-4 17:07
終于找到了,感謝樓主
作者: symbol2018    時間: 2018-12-4 17:09
正在找呢,謝謝
作者: aikeaida    時間: 2018-12-11 10:47
感謝樓主
作者: iolklklkl    時間: 2018-12-28 16:27
感謝感謝!!
作者: Liqipeng0822    時間: 2019-1-16 13:22
最近也在找這方面的資料,感謝樓主分享!
作者: scj123    時間: 2019-2-20 22:00
挺好,值得大家學(xué)習(xí)
作者: eb900001    時間: 2019-2-24 19:52
非常好,很好的學(xué)習(xí)資料,多謝分享!
作者: fenho    時間: 2019-3-4 09:00
感謝感謝!
作者: Tiramisu_L    時間: 2019-3-30 10:06
想請問一下樓主和各位已經(jīng)下載的大神,這個只需要接好IO口就可以直接使用嗎
作者: marshallemon    時間: 2019-3-30 10:48
這個測距的測量范圍是多少?測量精度又是多少?
作者: 子量    時間: 2019-7-11 11:52
感謝UP主!得以借鑒一下。
作者: dick_ness    時間: 2019-8-8 16:43
啦啦啦,我要代碼
作者: Oliver--    時間: 2019-8-8 23:33
想問問xshut和GPIO1怎么接,庫的代碼看不過來

作者: chwncy    時間: 2019-8-19 09:30
感謝樓主的無私奉獻(xiàn)
作者: shszwqs    時間: 2019-9-21 14:49
感謝樓主的無私奉獻(xiàn)
作者: kidding9    時間: 2019-10-28 18:49
很給力,正需要
作者: w2333    時間: 2020-3-29 20:19
感謝分享
作者: 17671190889    時間: 2020-4-30 11:31
感謝分享




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1