找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5941|回复: 5
收起左侧

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

  [复制链接]
ID:689247 发表于 2021-11-29 13:23 | 显示全部楼层 |阅读模式
一、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, 下载次数: 166)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 ,正想测试这个。
回复

使用道具 举报

ID:623426 发表于 2023-10-19 12:33 | 显示全部楼层
ccnnzz315 发表于 2023-8-3 20:51
你弄好了吗?我想把它改到51单片机里,感觉好难

已经比官方平台的代码简单多了
回复

使用道具 举报

ID:461428 发表于 2023-11-14 19:59 | 显示全部楼层
遗憾,调试不过
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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