久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7524|回復: 5
打印 上一主題 下一主題
收起左側

STM32多路VL53L0激光測距程序(含校準)CPU小白

  [復制鏈接]
跳轉到指定樓層
樓主
一、XL53L0簡介激光測距,有效距離2米,多種測距模式(單次,連續,時間間隔),多種工作模式(默認,快速,高精度,長距離)。
二、XL53L0硬件介紹

如下圖:
除去供電引腳剩余的引腳作用分別如下
1.SDA,SCL兩腳為I2C通信引腳,兩個引腳上拉。
2.GPIO為中斷引腳,數據測完向外部發射一脈沖,不用時上拉。
3.XSHUT類似復位引腳,低電平有效,不用時上拉。


STM32單片機源程序如下:
  1. #include "main.h"

  2. int main(void)
  3. {
  4.         Led_Init();                                                //led引腳初始化
  5.         Adc_Init();
  6.         SystemInit();                                        //初始化
  7.         Systick_Init();                                        //滴答時鐘初始化
  8.         Uart1_Init(9600);                                //串口初始化
  9.         
  10.         USB_Port_Set(0);                                //斷開usb
  11.         Delay_Ms(20);                                        //延時
  12.         USB_Port_Set(1);                                //連接USB
  13.         Set_USBClock();                                        //使能USB時鐘
  14.         USB_Interrupts_Config();                //USB中斷配置
  15.         USB_Init();                                                //USB初始化
  16.         
  17.         Host_Value_Init();                                //主機參數初始化
  18.         vl53l0x_Init();                                 //VL53L0初始化
  19.         vl53l0x_Calibration_Init();                //VL53L0設備參數設置

  20.         while(1)
  21.         {               
  22.                         Vl53l0x_Get_Distance(3);                                //獲取高度數據        
  23.                         Get_Adc_Average(5);                                                //獲取角度值                        
  24.                         Dispose_Usb_Data();                                                //處理USB的數據                                
  25.         }
  26. }
復制代碼
  1. #include "vl53l0.h"

  2. VL53L0X_Dev_t vl53l0x_dev0;
  3. VL53L0X_Dev_t vl53l0x_dev1;
  4. VL53L0X_Dev_t vl53l0x_dev2;
  5. VL53L0X_Dev_t vl53l0x_dev3;

  6. VL53L0X_DeviceInfo_t vl53l0x_dev_info;
  7. VL53L0X_RangingMeasurementData_t vl53l0x_data;
  8. VL53L0X_Error vl53l0x_status;


  9. void print_pal_error(VL53L0X_Error Status)
  10. {
  11.     char buf[VL53L0X_MAX_STRING_LENGTH];
  12.     VL53L0X_GetPalErrorString(Status, buf);  //得到錯誤碼與字符串
  13.     printf("API Status: %i : %s\n", Status, buf);
  14. }

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

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

  24. uint16_t vl53l0x_start_single_test(VL53L0X_Dev_t *pdev,
  25.                             VL53L0X_RangingMeasurementData_t *pdata)
  26. {
  27.         int i=0,sum=0;
  28.     VL53L0X_Error status = VL53L0X_ERROR_NONE;
  29.    
  30.     if(vl53l0x_status != VL53L0X_ERROR_NONE)
  31.         return vl53l0x_status;

  32.     status = VL53L0X_PerformSingleRangingMeasurement(pdev, pdata);   //VL53L0X執行單一測量范圍
  33.     if(status != VL53L0X_ERROR_NONE){
  34.         printf("error:Call of VL53L0X_PerformSingleRangingMeasurement\n");
  35.         return status;
  36.     }

  37.         for(i=0;i<5;i++)
  38.                 sum+=pdata->RangeMilliMeter;
  39.         pdata->RangeMilliMeter=sum/5;
  40.        
  41.     return pdata->RangeMilliMeter;
  42. }

  43. /******************************************************************
  44. 函數功能:配置VL53L0X設備I2C地址
  45. 入口參數:dev:設備I2C參數結構體
  46.                   newaddr:設備新I2C地址
  47. 返 回 值:錯誤狀態
  48. ******************************************************************/
  49. VL53L0X_Error vl53l0x_Addr_set(VL53L0X_Dev_t *dev,uint8_t newaddr)
  50. {
  51.         uint16_t Id;
  52.         uint8_t FinalAddress;
  53.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  54.         u8 sta=0x00;
  55.        
  56.         FinalAddress = newaddr;
  57.        
  58.         if(FinalAddress==dev->I2cDevAddr)//新設備I2C地址與舊地址一致,直接退出
  59.                 return VL53L0X_ERROR_NONE;
  60.         //在進行第一個寄存器訪問之前設置I2C標準模式(400Khz)
  61.         Status = VL53L0X_WrByte(dev,0x88,0x00);
  62.         if(Status!=VL53L0X_ERROR_NONE)
  63.         {
  64.                 sta=0x01;//設置I2C標準模式出錯
  65.                 goto set_error;
  66.         }
  67.         //嘗試使用默認的0x52地址讀取一個寄存器
  68.         Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
  69.         if(Status!=VL53L0X_ERROR_NONE)
  70.         {
  71.                 sta=0x02;//讀取寄存器出錯
  72.                 goto set_error;
  73.         }
  74.         if(Id == 0xEEAA)
  75.         {
  76.                 //設置設備新的I2C地址
  77.                 Status = VL53L0X_SetDeviceAddress(dev,FinalAddress);
  78.                 if(Status!=VL53L0X_ERROR_NONE)
  79.                 {
  80.                         sta=0x03;//設置I2C地址出錯
  81.                         goto set_error;
  82.                 }
  83.                
  84.                 //修改參數結構體的I2C地址
  85.                 dev->I2cDevAddr = FinalAddress;
  86.                 //檢查新的I2C地址讀寫是否正常
  87.                 Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
  88.                 if(Status!=VL53L0X_ERROR_NONE)
  89.                 {
  90.                         sta=0x04;//新I2C地址讀寫出錯
  91.                         goto set_error;
  92.                 }       
  93.         }
  94.         set_error:
  95.         if(Status!=VL53L0X_ERROR_NONE)
  96.         {
  97.                 print_pal_error(Status);//打印錯誤信息
  98.         }
  99.         if(sta!=0)
  100.           printf("sta:0x%x\r\n",sta);
  101.         return Status;
  102. }



  103. /******************************************************************
  104. 函數功能:VL53L0初始化
  105. 入口參數:VL53L0X_Dev_t *pMyDevice ,u8 vl53l0_x_id
  106.                         設備結構體                                        設備ID
  107. 返 回 值:錯誤狀態
  108. ******************************************************************/
  109. VL53L0X_Error vl53l0x_InitX(VL53L0X_Dev_t *pMyDevice ,u8 vl53l0_x_id)
  110. {
  111.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值賦值為0
  112.        
  113.         pMyDevice->I2cDevAddr      = 0x52;           //iic地址  0x52是默認地址,要初始化必須先寫0x52,才能初始化,之后再通過軟件修改
  114.     pMyDevice->comms_type      = 1;              //選擇IIC還是SPI    iic=1;SPI=0
  115.     pMyDevice->comms_speed_khz = 400;            //iic速率          
  116.        
  117.         //正點原子的VL53L0用戶手冊上寫明了再次使能時地址會恢復為0x52,所以只能使能一次,設置好地址即可,這里是核心
  118.         switch(vl53l0_x_id)
  119.         {
  120.                 case 0:  
  121.                    I2C_X0_HIGH();  
  122.                   Delay_Ms(1);
  123.                    vl53l0x_Addr_set(pMyDevice,0x54);//設置第一個VL53L0X傳感器I2C地址
  124.                    break;
  125.                 case 1:                       
  126.                I2C_X1_HIGH();
  127.                   Delay_Ms(1);
  128.                    vl53l0x_Addr_set(pMyDevice,0x56);//設置第二個VL53L0X傳感器I2C地址
  129.                    break;
  130.                 case 2:  
  131.                         I2C_X2_HIGH();  
  132.                    Delay_Ms(1);
  133.                     vl53l0x_Addr_set(pMyDevice,0x58);
  134.                         break;
  135.                 case 3:  
  136.                         I2C_X3_HIGH();  
  137.                    Delay_Ms(1);
  138.                     vl53l0x_Addr_set(pMyDevice,0x5a);
  139.                         break;
  140.           }
  141.        
  142.     Status = VL53L0X_DataInit(pMyDevice);                                 //設備的初始化,賦默認值
  143.     if(Status != VL53L0X_ERROR_NONE){                                     //判斷如果狀態不為0   打印錯誤信息
  144.         print_pal_error(Status);
  145.         return Status;                                                                //返回錯誤值 可通過此值DEBUG查找錯誤位置
  146.     }

  147.     Status = VL53L0X_GetDeviceInfo(pMyDevice, &vl53l0x_dev_info);   //讀取給定設備的設備信息
  148.     if(Status != VL53L0X_ERROR_NONE){
  149.         print_pal_error(Status);
  150.         return Status;
  151.     }
  152.         /*
  153.     printf("VL53L0X_GetDeviceInfo:\n");
  154.     printf("Device Name : %s\n", vl53l0x_dev_info.Name);             //設備名
  155.     printf("Device Type : %s\n", vl53l0x_dev_info.Type);            //產品類型VL53L0X = 1, VL53L1 = 2
  156.     printf("Device ID : %s\n", vl53l0x_dev_info.ProductId);           // 設備ID
  157.     printf("ProductRevisionMajor : %d\n", vl53l0x_dev_info.ProductRevisionMajor);
  158.     printf("ProductRevisionMinor : %d\n", vl53l0x_dev_info.ProductRevisionMinor);

  159.     if ((vl53l0x_dev_info.ProductRevisionMajor != 1) && (vl53l0x_dev_info.ProductRevisionMinor != 1)){
  160.         printf("Error expected cut 1.1 but found cut %d.%d\n",
  161.         vl53l0x_dev_info.ProductRevisionMajor, vl53l0x_dev_info.ProductRevisionMinor);
  162.         Status = VL53L0X_ERROR_NOT_SUPPORTED;
  163.         print_pal_error(Status);
  164.         return Status;
  165.     }        */
  166.        
  167.         // Device Initialization
  168.     Status = VL53L0X_StaticInit(pMyDevice);   //基本設備初始化
  169.     if(Status != VL53L0X_ERROR_NONE){         //判斷是否初始化成功 失敗打印錯誤信息
  170.         printf ("Call of VL53L0X_StaticInit\n");
  171.         print_pal_error(Status);
  172.         return Status;
  173.     }
  174.         return Status;
  175. }


  176. /******************************************************************
  177. 函數功能:sPANS參考校準
  178. 入口參數:VL53L0X_Dev_t *pMyDevice ,Device_Message *pDev
  179.                         設備結構體                                        設備信息
  180. 返 回 值:錯誤狀態
  181. ******************************************************************/
  182. VL53L0X_Error PerformRefSpad_CalibrationX(VL53L0X_Dev_t *pMyDevice,Device_Message *pDev)
  183. {
  184.         uint32_t refSpadCount;
  185.     uint8_t isApertureSpads;
  186.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;           //執行sPANS參考校準
  187.     Status = VL53L0X_PerformRefSpadManagement(pMyDevice,&refSpadCount, &isApertureSpads);
  188.     if(Status != VL53L0X_ERROR_NONE){
  189.         printf ("Call of VL53L0X_PerformRefSpadManagement\n");
  190.         printf ("refSpadCount = %d, isApertureSpads = %d\n", refSpadCount, isApertureSpads);
  191.         print_pal_error(Status);
  192.         return Status;
  193.     }
  194.         pDev->refSpadCount = refSpadCount;
  195.         pDev->isApertureSpads = isApertureSpads;
  196.         return Status;
  197. }

  198. /******************************************************************
  199. 函數功能:Ref校準
  200. 入口參數:VL53L0X_Dev_t *pMyDevice ,Device_Message *pDev
  201.                         設備結構體                                        設備信息
  202. 返 回 值:錯誤狀態
  203. ******************************************************************/
  204. VL53L0X_Error PerformRef_CalibrationX(VL53L0X_Dev_t *pMyDevice,Device_Message *pDev)
  205. {
  206.         uint8_t VhvSettings;
  207.     uint8_t PhaseCal;
  208.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   
  209.         // Device Initialization                                                   //執行溫度參考校準
  210.     Status = VL53L0X_PerformRefCalibration(pMyDevice, &VhvSettings,&PhaseCal);   
  211.     if(Status != VL53L0X_ERROR_NONE){               
  212.         printf ("Call of VL53L0X_PerformRefCalibration\n");
  213.         print_pal_error(Status);
  214.         return Status;
  215.     }
  216.         pDev->VhvSettings = VhvSettings;                                //更新結構體
  217.         pDev->PhaseCal = PhaseCal;
  218.         return Status;
  219. }

  220. /******************************************************************
  221. 函數功能:Offset校準
  222. 入口參數:VL53L0X_Dev_t *pMyDevice ,Device_Message *pDev
  223.                         設備結構體                                        設備信息
  224. 返 回 值:錯誤狀態
  225. ******************************************************************/
  226. VL53L0X_Error Offset_CalibrationX(VL53L0X_Dev_t *pMyDevice,Device_Message *pDev)
  227. {
  228.         int32_t OffsetMicroMeter;
  229.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值賦值為0
  230.         Status=VL53L0X_PerformOffsetCalibration(pMyDevice,100<<16,&OffsetMicroMeter);   //偏移校準,把白色物體放在100mm處進行,輸出偏移校準值
  231.        
  232.         if(Status != VL53L0X_ERROR_NONE)
  233.         {
  234.                 print_pal_error(Status);
  235.                 return Status;
  236.         }
  237.         pDev->OffsetMicroMeter = OffsetMicroMeter;
  238.         return Status;
  239. }

  240. /******************************************************************
  241. 函數功能:XTalk校準
  242. 入口參數:VL53L0X_Dev_t *pMyDevice ,u8 vl53l0_x_id
  243.                         設備結構體                                        設備ID
  244. 返 回 值:錯誤狀態
  245. ******************************************************************/
  246. VL53L0X_Error XTalk_CalibrationX(VL53L0X_Dev_t *pMyDevice,Device_Message *pDev)
  247. {
  248.         FixPoint1616_t XTalkCompensation;
  249.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值賦值為0
  250.         Status=VL53L0X_PerformXTalkCalibration(pMyDevice,250<<16,&XTalkCompensation);   //偏移校準,把白色物體放在100mm處進行,輸出偏移校準值
  251.         if(Status != VL53L0X_ERROR_NONE)
  252.         {
  253.                 print_pal_error(Status);
  254.                 return Status;
  255.         }
  256.         pDev->XTalkCompensation = XTalkCompensation;

  257.         return Status;

  258. }
  259. //校準參數設置
  260. VL53L0X_Error vl53l0x_Set_InitX(VL53L0X_Dev_t *pMyDevice,Device_Message *pDev)
  261. {
  262.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  263.        
  264.         //SPAD校準參數設置
  265.         Status = VL53L0X_SetReferenceSpads(pMyDevice,pDev->refSpadCount,pDev->isApertureSpads);   
  266.         if(Status!=VL53L0X_ERROR_NONE) { return Status; }       
  267.        
  268.         //溫度校準參數設置
  269.         Status = VL53L0X_SetRefCalibration(pMyDevice,pDev->VhvSettings,pDev->PhaseCal);   
  270.         if(Status!=VL53L0X_ERROR_NONE) { return Status; }

  271.         //偏移校準參數設置
  272.         Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(pMyDevice,pDev->OffsetMicroMeter);   
  273.         if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  274.        
  275.         //蓋玻片校準參數設置
  276.         Status = VL53L0X_SetXTalkCompensationRateMegaCps(pMyDevice,pDev->XTalkCompensation);   
  277.         if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  278.        
  279.         //使能串擾校準
  280.         Status = VL53L0X_SetXTalkCompensationEnable(pMyDevice,ENABLE);                          
  281.         if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  282.         return Status;
  283. }

  284. VL53L0X_Error vl53l0x_Set_ModeX(VL53L0X_Dev_t *pMyDevice)
  285. {
  286.         // no need to do this when we use VL53L0X_PerformSingleRangingMeasurement
  287.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  288.         Status = VL53L0X_SetDeviceMode(pMyDevice, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode 設置單一測量模式
  289.     if(Status != VL53L0X_ERROR_NONE){
  290.         printf ("Call of VL53L0X_SetDeviceMode\n");
  291.         print_pal_error(Status);
  292.         return Status;
  293.     }
  294.     // Enable/Disable Sigma and Signal check
  295.     if(Status == VL53L0X_ERROR_NONE){Status = VL53L0X_SetLimitCheckEnable(pMyDevice,  //啟用/禁用特定限制檢查
  296.                         VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
  297.     }
  298.     if(Status == VL53L0X_ERROR_NONE){Status = VL53L0X_SetLimitCheckEnable(pMyDevice,
  299.                         VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
  300.     }                               
  301.     if(Status == VL53L0X_ERROR_NONE){ Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  302.                         VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
  303.                         (FixPoint1616_t)(0.25*65536));
  304.         }                       
  305.     if(Status == VL53L0X_ERROR_NONE){ Status = VL53L0X_SetLimitCheckValue(pMyDevice,
  306.                         VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
  307.                         (FixPoint1616_t)(18*65536));                       
  308.     }
  309.     if(Status == VL53L0X_ERROR_NONE){  Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,   //設置微秒時間
  310.                         200000);
  311.     }
  312.     if(Status != VL53L0X_ERROR_NONE){
  313.         printf ("Sigma and Signal check error\n");
  314.         print_pal_error(Status);
  315.         return Status;
  316.     }
  317.     return Status;   //返回0
  318. }

  319. /******************************************************************
  320. 函數功能:設備初始化·
  321. 入口參數:無
  322. 返 回 值:錯誤參數
  323. ******************************************************************/
  324. VL53L0X_Error vl53l0x_Init(void)
  325. {
  326.     VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值賦值為0

  327.         //初始化一定按照這個順序執行,否則不成功
  328.         VL53L0X_i2c_init();
  329.         vl53l0x_InitX(&vl53l0x_dev0,0);
  330.         vl53l0x_InitX(&vl53l0x_dev1,1);
  331.         vl53l0x_InitX(&vl53l0x_dev2,2);
  332.         vl53l0x_InitX(&vl53l0x_dev3,3);
  333.           
  334.     return Status;           //返回0
  335. }

  336. /******************************************************************
  337. 函數功能:參數賦值程序
  338. 入口參數:無
  339. 返 回 值:錯誤參數
  340. ******************************************************************/
  341. VL53L0X_Error vl53l0x_Set_Init(void)
  342. {
  343.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值賦值為0
  344.        
  345.         vl53l0x_Set_InitX(&vl53l0x_dev0,&Device0_Calibration_Message);
  346.         vl53l0x_Set_InitX(&vl53l0x_dev1,&Device1_Calibration_Message);
  347.         vl53l0x_Set_InitX(&vl53l0x_dev2,&Device2_Calibration_Message);
  348.         vl53l0x_Set_InitX(&vl53l0x_dev3,&Device3_Calibration_Message);
  349.         if(Status != VL53L0X_ERROR_NONE)
  350.         {
  351.                 print_pal_error(Status);
  352.                 return Status;
  353.         }
  354.         return Status;
  355. }

  356. /******************************************************************
  357. 函數功能:設置模式
  358. 入口參數:無
  359. 返 回 值:錯誤參數
  360. ******************************************************************/
  361. VL53L0X_Error vl53l0x_Set_Mode(void)
  362. {
  363.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  364.         Status = vl53l0x_Set_ModeX(&vl53l0x_dev0);
  365.         Status = vl53l0x_Set_ModeX(&vl53l0x_dev1);
  366.         Status = vl53l0x_Set_ModeX(&vl53l0x_dev2);
  367.         Status = vl53l0x_Set_ModeX(&vl53l0x_dev3);
  368.        
  369.         if(Status != VL53L0X_ERROR_NONE){
  370.         printf ("Call of VL53L0X_SetDeviceMode\n");
  371.         print_pal_error(Status);
  372.         return Status;
  373.     }
  374.         return Status;
  375. }

  376. /******************************************************************
  377. 函數功能:校準程序
  378. 入口參數:無
  379. 返 回 值:錯誤參數
  380. ******************************************************************/
  381. VL53L0X_Error vl53l0x_Calibration_Init(void)
  382. {
  383.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  384.         if(Host_Configuration.calibration_marker == 0xaa)
  385.         {
  386.                
  387.                 Status = vl53l0x_Set_Init();
  388.                 USB_USART_SendData(Host_Configuration.calibration_marker);                                        //設備數據設定
  389.         }
  390.         else
  391.         {        usb_printf("等待偏移校準!");
  392.                 while(1){Dispose_Usb_Data();
  393.                 if(Host_Configuration.calibration_marker == 0x0a){break;}};                                        //等待偏移校準
  394.                 Status = PerformRefSpad_Calibration();
  395.                 if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  396.                 Status = PerformRef_Calibration();
  397.                 if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  398.                 Status = Offset_Calibration();
  399.                 if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  400.                 usb_printf("等待載玻片校準!");
  401.                 while(1){Dispose_Usb_Data();
  402.                 if(Host_Configuration.calibration_marker == 0xaa){break;}};                                        //等待載玻片校準
  403.                 Status = XTalk_Calibration();
  404.                 if(Status!=VL53L0X_ERROR_NONE) { return Status; }
  405.                 usb_printf("校準成功!");
  406.                 Save_Device_Data_To_Flash(&Device0_Calibration_Message,0);                                        //保存校準后參數
  407.                 Save_Device_Data_To_Flash(&Device1_Calibration_Message,1);
  408.                 Save_Device_Data_To_Flash(&Device2_Calibration_Message,2);
  409.                 Save_Device_Data_To_Flash(&Device3_Calibration_Message,3);
  410.         }
  411.         vl53l0x_Set_Mode();
  412.         usb_printf("設備啟動!");
  413.         return Status;
  414. }

  415. //SPAD校準程序
  416. VL53L0X_Error PerformRefSpad_Calibration(void)
  417. {
  418.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   
  419.         //SPAD校準
  420.         PerformRefSpad_CalibrationX(&vl53l0x_dev0,&Device0_Calibration_Message);
  421.         PerformRefSpad_CalibrationX(&vl53l0x_dev1,&Device1_Calibration_Message);
  422.         PerformRefSpad_CalibrationX(&vl53l0x_dev2,&Device2_Calibration_Message);
  423.         PerformRefSpad_CalibrationX(&vl53l0x_dev3,&Device3_Calibration_Message);
  424.         if(Status != VL53L0X_ERROR_NONE)
  425.         {
  426.                 print_pal_error(Status);
  427.                 return Status;
  428.         }
  429.         return Status;
  430. }

  431. //溫度校準程序
  432. VL53L0X_Error PerformRef_Calibration(void)
  433. {
  434.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   
  435.         //溫度校準
  436.         PerformRef_CalibrationX(&vl53l0x_dev0,&Device0_Calibration_Message);
  437.         PerformRef_CalibrationX(&vl53l0x_dev1,&Device1_Calibration_Message);
  438.         PerformRef_CalibrationX(&vl53l0x_dev2,&Device2_Calibration_Message);
  439.         PerformRef_CalibrationX(&vl53l0x_dev3,&Device3_Calibration_Message);
  440.         if(Status != VL53L0X_ERROR_NONE)
  441.         {
  442.                 print_pal_error(Status);
  443.                 return Status;
  444.         }
  445.         return Status;
  446. }

  447. //偏移校準程序       
  448. VL53L0X_Error Offset_Calibration(void)
  449. {
  450.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;   //初始值賦值為0
  451.         //偏移校準
  452.         Offset_CalibrationX(&vl53l0x_dev0,&Device0_Calibration_Message);
  453.         Offset_CalibrationX(&vl53l0x_dev1,&Device1_Calibration_Message);
  454.         Offset_CalibrationX(&vl53l0x_dev2,&Device2_Calibration_Message);
  455.         Offset_CalibrationX(&vl53l0x_dev3,&Device3_Calibration_Message);
  456.         if(Status != VL53L0X_ERROR_NONE)
  457.         {
  458.                 print_pal_error(Status);
  459.                 return Status;
  460.         }
  461.         return Status;
  462. }

  463. //串擾校準程序
  464. VL53L0X_Error XTalk_Calibration(void)
  465. {
  466.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;  
  467.          //串擾校準
  468.         XTalk_CalibrationX(&vl53l0x_dev0,&Device0_Calibration_Message);
  469.         XTalk_CalibrationX(&vl53l0x_dev1,&Device1_Calibration_Message);
  470.         XTalk_CalibrationX(&vl53l0x_dev2,&Device2_Calibration_Message);
  471.         XTalk_CalibrationX(&vl53l0x_dev3,&Device3_Calibration_Message);
  472.        
  473.         if(Status != VL53L0X_ERROR_NONE)
  474.         {
  475.                 print_pal_error(Status);
  476.                 return Status;
  477.         }
  478.         return Status;
  479. }

  480. /******************************************************************
  481. 函數功能:獲取四個傳感器測量的高度
  482. 入口參數:times        :濾波次數
  483. 返 回 值:無
  484. ******************************************************************/
  485. void Vl53l0x_Get_Distance(u8 times)                                                                                                                                //times不易過大為好
  486. {
  487.         static u8 m=0;
  488.        
  489.         Data_Mover(vl5310_1_value_filter,LEFT,times);
  490.         Data_Mover(vl5310_2_value_filter,LEFT,times);
  491.         Data_Mover(vl5310_3_value_filter,LEFT,times);
  492.         Data_Mover(vl5310_4_value_filter,LEFT,times);
  493.        
  494.         for(;m<times;m++)                                                                                                                                                        //讀取距離數據
  495.         {
  496.                 vl5310_1_value_filter[m]= vl53l0x_start_single_test(&vl53l0x_dev0, &vl53l0x_data);        
  497.                 vl5310_2_value_filter[m]= vl53l0x_start_single_test(&vl53l0x_dev1, &vl53l0x_data);        
  498.                 vl5310_3_value_filter[m]= vl53l0x_start_single_test(&vl53l0x_dev2, &vl53l0x_data);        
  499.                 vl5310_4_value_filter[m]= vl53l0x_start_single_test(&vl53l0x_dev3, &vl53l0x_data);       
  500.         }
  501.         m--;                //下次執行此函數時只用讀取一次即可                                                                                                                                                                       
  502.         Send_Information.first_vl53l0_value = Buf_Add(vl5310_1_value_filter,times)/times;                                        //更新傳感器的值
  503.         Send_Information.second_vl53l0_value= Buf_Add(vl5310_2_value_filter,times)/times;
  504.         Send_Information.third_vl53l0_value        = Buf_Add(vl5310_3_value_filter,times)/times;
  505.         Send_Information.fourth_vl53l0_value= Buf_Add(vl5310_4_value_filter,times)/times;
  506. }
  507.        
復制代碼


Keil代碼下載:
四傳感器測距代碼.7z (283.24 KB, 下載次數: 176)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:760548 發表于 2023-6-29 13:08 | 只看該作者
謝謝,正想測試這個。
回復

使用道具 舉報

板凳
ID:853896 發表于 2023-8-3 20:51 | 只看該作者
gdchczd 發表于 2023-6-29 13:08
謝謝,正想測試這個。

你弄好了嗎?我想把它改到51單片機里,感覺好難
回復

使用道具 舉報

地板
ID:748535 發表于 2023-8-14 20:00 | 只看該作者
買了vl6180 和53 ,正想測試這個。
回復

使用道具 舉報

5#
ID:623426 發表于 2023-10-19 12:33 | 只看該作者
ccnnzz315 發表于 2023-8-3 20:51
你弄好了嗎?我想把它改到51單片機里,感覺好難

已經比官方平臺的代碼簡單多了
回復

使用道具 舉報

6#
ID:461428 發表于 2023-11-14 19:59 | 只看該作者
遺憾,調試不過
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡视频在线播放 | 99草免费视频 | 亚洲第一网站 | 黄色一级电影免费观看 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 理论片午午伦夜理片影院 | 国产精品不卡一区二区三区 | 亚洲中午字幕 | 91麻豆精品国产91久久久更新资源速度超快 | 久久精品免费 | 黄色av网站在线观看 | 国产精品久久久久久久免费观看 | 极品电影院 | 国产伦精品一区二区 | 亚洲美女视频 | 精品国产乱码久久久久久影片 | 蜜桃黄网 | 亚洲成人免费在线观看 | 中文字幕 在线观看 | 久久久久久成人 | 黄色一级视频 | 激情一区 | 欧美一区二区久久 | 国产精品99久久久久久宅男 | 国产一级在线 | 久久久久久久久久久久久久久久久久久久 | 国产农村一级片 | 国产乱码精品一品二品 | 91新视频| 国产激情偷乱视频一区二区三区 | 国产91av视频| 日韩三级电影一区二区 | 精品无码久久久久久国产 | 91精品国产综合久久久久久丝袜 | 国产在线视频一区二区董小宛性色 | 亚洲一区二区av | 91精品国产91久久久久久丝袜 | 亚洲福利电影网 | 黄色av免费网站 | 国产精品毛片一区二区三区 | 久久精品黄色 |