找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12676|回复: 27
打印 上一主题 下一主题
收起左侧

vl53l0x激光测距stm32库函数程序源码

  [复制链接]
跳转到指定楼层
楼主
ID:413306 发表于 2018-10-21 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
vl53l0x stm32程序
  1. #include "vl53l0x_gen.h"

  2. VL53L0X_RangingMeasurementData_t vl53l0x_data;//测距测量结构体
  3. vu16 Distance_data=0;//保存测距数据

  4. //VL53L0X 测量模式配置
  5. //dev:设备I2C参数结构体
  6. //mode: 0:默认;1:高精度;2:长距离;3:高速
  7. VL53L0X_Error vl53l0x_set_mode(VL53L0X_Dev_t *dev,u8 mode)
  8. {
  9.        
  10.          VL53L0X_Error status = VL53L0X_ERROR_NONE;
  11.          uint8_t VhvSettings;
  12.          uint8_t PhaseCal;
  13.          uint32_t refSpadCount;
  14.          uint8_t isApertureSpads;
  15.        
  16.          vl53l0x_reset(dev);//复位vl53l0x(频繁切换工作模式容易导致采集距离数据不准,需加上这一代码)
  17.          status = VL53L0X_StaticInit(dev);

  18.      if(AjustOK!=0)//已校准好了,写入校准值
  19.      {
  20.             status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount,Vl53l0x_data.isApertureSpads);//设定Spads校准值
  21.         if(status!=VL53L0X_ERROR_NONE) goto error;       
  22.         delay_ms(2);                 
  23.             status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings,Vl53l0x_data.PhaseCal);//设定Ref校准值
  24.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  25.                  delay_ms(2);
  26.             status=VL53L0X_SetOffsetCalibrationDataMicroMeter(dev,Vl53l0x_data.OffsetMicroMeter);//设定偏移校准值
  27.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  28.                  delay_ms(2);
  29.                 status=VL53L0X_SetXTalkCompensationRateMegaCps(dev,Vl53l0x_data.XTalkCompensationRateMegaCps);//设定串扰校准值
  30.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  31.          delay_ms(2);                 
  32.                  
  33.      }
  34.          else
  35.          {
  36.                 status = VL53L0X_PerformRefCalibration(dev, &VhvSettings, &PhaseCal);//Ref参考校准
  37.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  38.                 delay_ms(2);
  39.                 status = VL53L0X_PerformRefSpadManagement(dev, &refSpadCount, &isApertureSpads);//执行参考SPAD管理
  40.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  41.         delay_ms(2);                          
  42.          }
  43.          status = VL53L0X_SetDeviceMode(dev,VL53L0X_DEVICEMODE_SINGLE_RANGING);//使能单次测量模式
  44.          if(status!=VL53L0X_ERROR_NONE) goto error;
  45.          delay_ms(2);
  46.          status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,1);//使能SIGMA范围检查
  47.          if(status!=VL53L0X_ERROR_NONE) goto error;
  48.          delay_ms(2);
  49.          status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//使能信号速率范围检查
  50.          if(status!=VL53L0X_ERROR_NONE) goto error;
  51.          delay_ms(2);
  52.          status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//设定SIGMA范围
  53.          if(status!=VL53L0X_ERROR_NONE) goto error;
  54.          delay_ms(2);
  55.          status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//设定信号速率范围范围
  56.          if(status!=VL53L0X_ERROR_NONE) goto error;
  57.          delay_ms(2);
  58.          status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//设定完整测距最长时间
  59.          if(status!=VL53L0X_ERROR_NONE) goto error;
  60.          delay_ms(2);
  61.          status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod);//设定VCSEL脉冲周期
  62.          if(status!=VL53L0X_ERROR_NONE) goto error;
  63.          delay_ms(2);
  64.          status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod);//设定VCSEL脉冲周期范围
  65.          
  66.          error://错误信息
  67.          if(status!=VL53L0X_ERROR_NONE)
  68.          {
  69.                 print_pal_error(status);
  70.                 LCD_Fill(30,140+20,300,300,WHITE);
  71.                 return status;
  72.          }
  73.          return status;
  74.        
  75. }       

  76. //VL53L0X 单次距离测量函数
  77. //dev:设备I2C参数结构体
  78. //pdata:保存测量数据结构体
  79. VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *dev,VL53L0X_RangingMeasurementData_t *pdata,char *buf)
  80. {

  81.         VL53L0X_Error status = VL53L0X_ERROR_NONE;
  82.         uint8_t RangeStatus;
  83.        
  84.         status = VL53L0X_PerformSingleRangingMeasurement(dev, pdata);//执行单次测距并获取测距测量数据
  85.         if(status !=VL53L0X_ERROR_NONE) return status;
  86.    
  87.         RangeStatus = pdata->RangeStatus;//获取当前测量状态
  88.     memset(buf,0x00,VL53L0X_MAX_STRING_LENGTH);
  89.         VL53L0X_GetRangeStatusString(RangeStatus,buf);//根据测量状态读取状态字符串
  90.        
  91.         Distance_data = pdata->RangeMilliMeter;//保存最近一次测距测量数据
  92.        
  93.     return status;
  94. }


  95. //启动普通测量
  96. //dev:设备I2C参数结构体
  97. //mode模式配置 0:默认;1:高精度;2:长距离
  98. void vl53l0x_general_start(VL53L0X_Dev_t *dev,u8 mode)
  99. {
  100.         static char buf[VL53L0X_MAX_STRING_LENGTH];//测试模式字符串字符缓冲区
  101.         VL53L0X_Error Status=VL53L0X_ERROR_NONE;//工作状态
  102.         u8 key=0;
  103.         u8 i=0;
  104.        
  105.         LED0=1;
  106.         mode_string(mode,buf);//显示当前配置的模式
  107.         while(vl53l0x_set_mode(dev,mode))//配置精度模式
  108.         {
  109.                 LCD_ShowString(30,140+40,200,16,16,"Mode Set Error!!!");
  110.                 delay_ms(500);
  111.                 LCD_ShowString(30,140+40,200,16,16,"                 ");
  112.                 delay_ms(500);
  113.                 i++;
  114.                 if(i==2) return;
  115.        
  116.         }
  117.         LCD_Fill(30,140+20,300,300,WHITE);
  118.         LCD_ShowString(30,140+30,200,16,16,"KEY_UP: Exit the test             ");               
  119.         LCD_ShowString(30,140+50,200,16,16,"Mode:        ");
  120.         LCD_ShowString(80,140+50,200,16,16,(u8*)buf);
  121.         LCD_ShowString(30,140+70,200,16,16,"State:");//显示测量状态         
  122.         LCD_ShowString(30,140+90,200,16,16,"Distance:    0 mm");//显示测量距离
  123.         while(1)
  124.         {
  125.                  key = KEY_Scan(0);
  126.                  if(key == WKUP_PRES)
  127.                  {
  128.                          LED1=1;
  129.                          break;//返回上一菜单
  130.                          
  131.                  }
  132.                  if(Status==VL53L0X_ERROR_NONE)
  133.                  {
  134.                                 Status = vl53l0x_start_single_test(dev,&vl53l0x_data,buf);//执行一次测量
  135.                                 LCD_ShowString(85,140+70,200,16,16,(u8*)buf);
  136.                                 LCD_ShowxNum(110,140+90,Distance_data,4,16,0);
  137.                                 //printf("State;%i , %s\r\n",vl53l0x_data.RangeStatus,buf);//打印测量状态       
  138.                                 printf("d: %4imm\r\n",Distance_data);//打印测量距离
  139.                  }
  140.                  i++;
  141.                  if(i==5)
  142.                  {
  143.                          i=0;
  144.                          LED1=!LED1;       
  145.                  }
  146.          delay_ms(50);       
  147.                
  148.         }       
  149.        
  150. }

  151. //vl53l0x普通测量模式UI
  152. void general_ui(void)
  153. {
  154.         LCD_Fill(30,140+20,300,300,WHITE);
  155.         POINT_COLOR=RED;        //设置字体为红色
  156.         LCD_ShowString(30,140+30,300,16,16,"General Mode                  ");
  157.         LCD_ShowString(30,140+55,300,16,16,"KEY1: Switch working mode    ");
  158.         POINT_COLOR=BLUE;       //设置字体为蓝色
  159.         LCD_ShowString(30,140+75,300,16,16, "KEY_UP: Return menu    ");
  160.         LCD_ShowString(30,140+95,300,16,16, "KEY0:   Default        ");
  161.        
  162. }

  163. //vl53l0x普通测量模式测试
  164. //dev:设备I2C参数结构体
  165. void vl53l0x_general_test(VL53L0X_Dev_t *dev)
  166. {
  167.         u8 key=0;
  168.         u8 i=0;
  169.         u8 mode=0;
  170.         LED1=1;
  171.         general_ui();//显示普通测量模式UI
  172.        
  173.         while(1)
  174.         {       

  175.                 key = KEY_Scan(0);
  176.                
  177.                 if(key==WKUP_PRES)        break;//返回主菜单        
  178.                
  179.                 else if(key==KEY1_PRES)//选择工作模式
  180.                 {
  181.              mode++;
  182.                          if(mode==4) mode=0;
  183.                          switch(mode)
  184.                          {
  185.                                  case Default_Mode:  LCD_ShowString(95,140+95,300,16,16, "Default        "); break;//默认
  186.                                  case HIGH_ACCURACY: LCD_ShowString(95,140+95,300,16,16, "High Accuracy  "); break;//高精度
  187.                                  case LONG_RANGE:    LCD_ShowString(95,140+95,300,16,16, "Long Range     "); break;//长距离
  188.                                  case HIGH_SPEED:    LCD_ShowString(95,140+95,300,16,16, "High Speed     "); break;//高速
  189.                          }
  190.                 }       
  191.                 else if(key==KEY0_PRES)//启动测量
  192.                 {
  193.                         vl53l0x_general_start(dev,mode);
  194.                 general_ui();
  195.                         mode=0;
  196.                 }                       
  197.                 i++;
  198.                 if(i==5)
  199.                 {
  200.                         i=0;
  201.                         LED0=!LED0;
  202.                 }
  203.                 delay_ms(50);

  204.         }
  205.        
  206. }
复制代码
  1. #include "vl53l0x_it.h"


  2. //上下限距离值 单位:mm
  3. #define Thresh_Low  60
  4. #define Thresh_High 150

  5. //中断模式参数结构体
  6. typedef struct
  7. {
  8.      const int VL53L0X_Mode;//模式
  9.          uint32_t ThreshLow;    //下限值
  10.          uint32_t ThreshHigh;   //上限值
  11. }AlrmMode_t;

  12. AlrmMode_t AlarmModes ={
  13.        
  14.      VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT,// value < thresh_low OR value > thresh_high
  15.          Thresh_Low<<16,
  16.          Thresh_High<<16
  17. };

  18. //中断配置初始化
  19. static void exti_init(void)
  20. {
  21.         GPIO_InitTypeDef GPIO_InitStructure;
  22.         EXTI_InitTypeDef EXTI_InitStructure;
  23.         NVIC_InitTypeDef NVIC_InitStructure;
  24.        
  25.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
  26.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
  27.        
  28.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  30.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  31.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
  32.         EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  33.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  34.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  35.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  36.         EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  37.        
  38.     NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                            //使能按键WK_UP所在的外部中断通道
  39.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  40.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                    //子优先级3
  41.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                    //使能外部中断通道
  42.           NVIC_Init(&NVIC_InitStructure);
  43.        
  44. }

  45. //警报标志位 alarm_flag
  46. //1:有警报
  47. //0:无
  48. u8 alarm_flag=0;

  49. //外部中断服务函数
  50. void EXTI4_IRQHandler(void)
  51. {
  52.         alarm_flag=1;//标志
  53.         EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位
  54. }

  55. extern uint8_t AjustOK;
  56. extern mode_data Mode_data[];

  57. //vl53l0x中断测量模式测试
  58. //dev:设备I2C参数结构体
  59. //mode: 0:默认;1:高精度;2:长距离;3:高速
  60. void vl53l0x_interrupt_start(VL53L0X_Dev_t *dev,uint8_t mode)
  61. {
  62.          uint8_t VhvSettings;
  63.          uint8_t PhaseCal;
  64.          uint32_t refSpadCount;
  65.          uint8_t isApertureSpads;
  66.          VL53L0X_RangingMeasurementData_t RangingMeasurementData;
  67.          static char buf[VL53L0X_MAX_STRING_LENGTH];//测试模式字符串字符缓冲区
  68.          VL53L0X_Error status=VL53L0X_ERROR_NONE;//工作状态
  69.          u8 key;

  70.          exti_init();//中断初始化
  71.          LED0=1;
  72.          mode_string(mode,buf);//显示当前配置的模式
  73.          LCD_Fill(30,170,300,300,WHITE);
  74.      POINT_COLOR=RED;        //设置字体为红色
  75.          LCD_ShowString(30,140+30,300,16,16,"Interrupt Mode             ");
  76.          POINT_COLOR=BLUE;       //设置字体为蓝色
  77.          LCD_ShowString(30,140+50,200,16,16,"KEY_UP: Exit the test       ");
  78.          LCD_ShowString(30,140+70,200,16,16,"Mode:        ");
  79.          LCD_ShowString(80,140+70,200,16,16,(u8*)buf);
  80.      sprintf((char*)buf,"Thresh Low:  %d mm ",Thresh_Low);       
  81.          LCD_ShowString(30,140+90,300,16,16,(u8*)buf);
  82.          sprintf((char*)buf,"Thresh High: %d mm",Thresh_High);       
  83.          LCD_ShowString(30,140+110,300,16,16,(u8*)buf);
  84.      LCD_ShowString(30,140+130,300,16,16,"Now value:     mm");
  85.          
  86.      vl53l0x_reset(dev);//复位vl53l0x(频繁切换工作模式容易导致采集距离数据不准,需加上这一代码)
  87.          status = VL53L0X_StaticInit(dev);
  88.          if(status!=VL53L0X_ERROR_NONE) goto error;

  89.          if(AjustOK!=0)//已校准好了,写入校准值
  90.          {
  91.                 status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount,Vl53l0x_data.isApertureSpads);//设定Spads校准值
  92.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  93.         delay_ms(2);                 
  94.                 status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings,Vl53l0x_data.PhaseCal);//设定Ref校准值
  95.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  96.                 delay_ms(2);
  97.                 status=VL53L0X_SetOffsetCalibrationDataMicroMeter(dev,Vl53l0x_data.OffsetMicroMeter);//设定偏移校准值
  98.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  99.                 delay_ms(2);
  100.                 status=VL53L0X_SetXTalkCompensationRateMegaCps(dev,Vl53l0x_data.XTalkCompensationRateMegaCps);//设定串扰校准值
  101.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  102.          }else
  103.          {
  104.                  status = VL53L0X_PerformRefCalibration(dev, &VhvSettings, &PhaseCal);//Ref参考校准
  105.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  106.                 delay_ms(2);
  107.                 status = VL53L0X_PerformRefSpadManagement(dev, &refSpadCount, &isApertureSpads);//执行参考SPAD管理
  108.                 if(status!=VL53L0X_ERROR_NONE) goto error;
  109.         delay_ms(2);                 
  110.          }
  111.          status = VL53L0X_SetDeviceMode(dev,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING);//使能连续测量模式
  112.          if(status!=VL53L0X_ERROR_NONE) goto error;
  113.          delay_ms(2);
  114.          status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(dev,Mode_data[mode].timingBudget);//设置内部周期测量时间
  115.          if(status!=VL53L0X_ERROR_NONE) goto error;
  116.          delay_ms(2);
  117.          status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,1);//使能SIGMA范围检查
  118.          if(status!=VL53L0X_ERROR_NONE) goto error;
  119.          delay_ms(2);
  120.          status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//使能信号速率范围检查
  121.          if(status!=VL53L0X_ERROR_NONE) goto error;
  122.          delay_ms(2);
  123.          status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//设定SIGMA范围
  124.          if(status!=VL53L0X_ERROR_NONE) goto error;
  125.          delay_ms(2);
  126.          status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//设定信号速率范围范围
  127.          if(status!=VL53L0X_ERROR_NONE) goto error;
  128.          delay_ms(2);
  129.          status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//设定完整测距最长时间
  130.          if(status!=VL53L0X_ERROR_NONE) goto error;
  131.          delay_ms(2);
  132.          status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod);//设定VCSEL脉冲周期
  133.          if(status!=VL53L0X_ERROR_NONE) goto error;
  134.          delay_ms(2);
  135.          status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod);//设定VCSEL脉冲周期范围
  136.          if(status!=VL53L0X_ERROR_NONE) goto error;
  137.          delay_ms(2);
  138.          status = VL53L0X_StopMeasurement(dev);//停止测量
  139.          if(status!=VL53L0X_ERROR_NONE) goto error;
  140.          delay_ms(2);
  141.          status = VL53L0X_SetInterruptThresholds(dev,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,AlarmModes.ThreshLow, AlarmModes.ThreshHigh);//设定触发中断上、下限值
  142.          if(status!=VL53L0X_ERROR_NONE) goto error;
  143.          delay_ms(2);
  144.          status = VL53L0X_SetGpioConfig(dev,0,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,AlarmModes.VL53L0X_Mode,VL53L0X_INTERRUPTPOLARITY_LOW);//设定触发中断模式 下降沿
  145.          if(status!=VL53L0X_ERROR_NONE) goto error;
  146.          delay_ms(2);
  147.          status = VL53L0X_ClearInterruptMask(dev,0);//清除VL53L0X中断标志位
  148.          
  149.          error://错误信息
  150.          if(status!=VL53L0X_ERROR_NONE)
  151.          {
  152.                 print_pal_error(status);
  153.                 return ;
  154.          }

  155.          alarm_flag = 0;
  156.          VL53L0X_StartMeasurement(dev);//启动测量
  157.          while(1)
  158.          {   
  159.                 key = KEY_Scan(0);
  160.                 if(key==WKUP_PRES)
  161.                 {
  162.                         VL53L0X_ClearInterruptMask(dev,0);//清除VL53L0X中断标志位
  163.                         status = VL53L0X_StopMeasurement(dev); //停止测量
  164.                         LED1=1;
  165.                         break;//返回上一菜单
  166.                 }                       
  167.                 if(alarm_flag==1)//触发中断
  168.                 {
  169.                         alarm_flag=0;
  170.                         VL53L0X_GetRangingMeasurementData(dev,&RangingMeasurementData);//获取测量距离,并且显示距离
  171.                         printf("d: %3d mm\r\n",RangingMeasurementData.RangeMilliMeter);
  172.                         LCD_ShowxNum(110,140+130,RangingMeasurementData.RangeMilliMeter,4,16,0);
  173.                         delay_ms(70);
  174.                         VL53L0X_ClearInterruptMask(dev,0);//清除VL53L0X中断标志位
  175.                        
  176.                 }
  177.                 delay_ms(30);
  178.                 LED1=!LED1;

  179.          }
  180.                
  181. }

  182. //vl53l0x中断测量模式UI
  183. void interrupt_ui(void)
  184. {
  185.         LCD_Fill(30,140+20,300,300,WHITE);
  186.         POINT_COLOR=RED;        //设置字体为红色
  187.         LCD_ShowString(30,140+30,300,16,16,"Interrupt Mode                  ");
  188.         LCD_ShowString(30,140+55,300,16,16,"KEY1: Switch working mode    ");
  189.         POINT_COLOR=BLUE;       //设置字体为蓝色
  190.         LCD_ShowString(30,140+75,300,16,16, "KEY_UP: Return menu    ");
  191.         LCD_ShowString(30,140+95,300,16,16, "KEY0:   Default        ");
  192.        
  193. }

  194. //vl53l0x中断测量模式测试
  195. //dev:设备I2C参数结构体
  196. void vl53l0x_interrupt_test(VL53L0X_Dev_t *dev)
  197. {
  198.         u8 key=0;
  199.         u8 i=0;
  200.         u8 mode=0;
  201.         LED1=1;
  202.         interrupt_ui();//显示中断测量模式UI
  203.        
  204.         while(1)
  205.         {
  206.                 key = KEY_Scan(0);
  207.                
  208.                 if(key==WKUP_PRES)        break;//返回主菜单        
  209.                
  210.                 else if(key==KEY1_PRES)//选择工作模式
  211.                 {
  212.              mode++;
  213.                          if(mode==4) mode=0;
  214.                        
  215.                          switch(mode)
  216.                          {
  217.                                  case Default_Mode:  LCD_ShowString(95,140+95,300,16,16, "Default        "); break;//默认
  218.                                  case HIGH_ACCURACY: LCD_ShowString(95,140+95,300,16,16, "High Accuracy  "); break;//高精度
  219.                                  case LONG_RANGE:    LCD_ShowString(95,140+95,300,16,16, "Long Range     "); break;//长距离
  220.                                  case HIGH_SPEED:    LCD_ShowString(95,140+95,300,16,16, "High Speed     "); break;//高速
  221.                          }
  222.                 }       
  223.                 else if(key==KEY0_PRES)//启动测量
  224.                 {
  225.                         vl53l0x_interrupt_start(dev,mode);
  226.                 interrupt_ui();
  227.                         mode=0;
  228.                 }                       
  229.                 i++;
  230.                 if(i==5)
  231.                 {
  232.                         i=0;
  233.                         LED0=!LED0;
  234.                 }
  235.                 delay_ms(50);
  236.         }
  237.        
  238. }
复制代码


  1. #include "vl53l0x.h"

  2. VL53L0X_Dev_t vl53l0x_dev;//设备I2C数据参数
  3. VL53L0X_DeviceInfo_t vl53l0x_dev_info;//设备ID版本信息
  4. uint8_t AjustOK=0;//校准标志位

  5. //VL53L0X各精度模式参数
  6. //0:默认;1:高精度;2:长距离;3:高速
  7. mode_data Mode_data[]=
  8. {
  9.     {(FixPoint1616_t)(0.25*65536),
  10.          (FixPoint1616_t)(18*65536),
  11.          33000,
  12.          14,
  13.          10},//默认
  14.                
  15.         {(FixPoint1616_t)(0.25*65536) ,
  16.          (FixPoint1616_t)(18*65536),
  17.          200000,
  18.          14,
  19.          10},//高精度
  20.                
  21.     {(FixPoint1616_t)(0.1*65536) ,
  22.          (FixPoint1616_t)(60*65536),
  23.          33000,
  24.          18,
  25.          14},//长距离
  26.        
  27.     {(FixPoint1616_t)(0.25*65536) ,
  28.          (FixPoint1616_t)(32*65536),
  29.          20000,
  30.          14,
  31.          10},//高速
  32.                
  33. };

  34. //API错误信息打印
  35. //Status:详情看VL53L0X_Error参数的定义
  36. void print_pal_error(VL53L0X_Error Status)
  37. {
  38.        
  39.         char buf[VL53L0X_MAX_STRING_LENGTH];
  40.        
  41.         VL53L0X_GetPalErrorString(Status,buf);//根据Status状态获取错误信息字符串
  42.        
  43.     printf("API Status: %i : %s\r\n",Status, buf);//打印状态和错误信息
  44.        
  45. }

  46. //模式字符串显示
  47. //mode:0-默认;1-高精度;2-长距离;3-高速
  48. void mode_string(u8 mode,char *buf)
  49. {
  50.         switch(mode)
  51.         {
  52.                 case Default_Mode: strcpy(buf,"Default");        break;
  53.                 case HIGH_ACCURACY: strcpy(buf,"High Accuracy"); break;
  54.                 case LONG_RANGE: strcpy(buf,"Long Range");       break;
  55.                 case HIGH_SPEED: strcpy(buf,"High Speed");       break;
  56.         }

  57. }

  58. //配置VL53L0X设备I2C地址
  59. //dev:设备I2C参数结构体
  60. //newaddr:设备新I2C地址
  61. VL53L0X_Error vl53l0x_Addr_set(VL53L0X_Dev_t *dev,uint8_t newaddr)
  62. {
  63.         uint16_t Id;
  64.         uint8_t FinalAddress;
  65.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  66.         u8 sta=0x00;
  67.        
  68.         FinalAddress = newaddr;
  69.        
  70.         if(FinalAddress==dev->I2cDevAddr)//新设备I2C地址与旧地址一致,直接退出
  71.                 return VL53L0X_ERROR_NONE;
  72.         //在进行第一个寄存器访问之前设置I2C标准模式(400Khz)
  73.         Status = VL53L0X_WrByte(dev,0x88,0x00);
  74.         if(Status!=VL53L0X_ERROR_NONE)
  75.         {
  76.                 sta=0x01;//设置I2C标准模式出错
  77.                 goto set_error;
  78.         }
  79.         //尝试使用默认的0x52地址读取一个寄存器
  80.         Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
  81.         if(Status!=VL53L0X_ERROR_NONE)
  82.         {
  83.                 sta=0x02;//读取寄存器出错
  84.                 goto set_error;
  85.         }
  86.         if(Id == 0xEEAA)
  87.         {
  88.                 //设置设备新的I2C地址
  89.                 Status = VL53L0X_SetDeviceAddress(dev,FinalAddress);
  90.                 if(Status!=VL53L0X_ERROR_NONE)
  91.                 {
  92.                         sta=0x03;//设置I2C地址出错
  93.                         goto set_error;
  94.                 }
  95.                 //修改参数结构体的I2C地址
  96.                 dev->I2cDevAddr = FinalAddress;
  97.                 //检查新的I2C地址读写是否正常
  98.                 Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
  99.                 if(Status!=VL53L0X_ERROR_NONE)
  100.                 {
  101.                         sta=0x04;//新I2C地址读写出错
  102.                         goto set_error;
  103.                 }       
  104.         }
  105.         set_error:
  106.         if(Status!=VL53L0X_ERROR_NONE)
  107.         {
  108.                 print_pal_error(Status);//打印错误信息
  109.         }
  110.         if(sta!=0)
  111.           printf("sta:0x%x\r\n",sta);
  112.         return Status;
  113. }

  114. //vl53l0x复位函数
  115. //dev:设备I2C参数结构体
  116. void vl53l0x_reset(VL53L0X_Dev_t *dev)
  117. {
  118.         uint8_t addr;
  119.         addr = dev->I2cDevAddr;//保存设备原I2C地址
  120.     VL53L0X_Xshut=0;//失能VL53L0X
  121.         delay_ms(30);
  122.         VL53L0X_Xshut=1;//使能VL53L0X,让传感器处于工作(I2C地址会恢复默认0X52)
  123.         delay_ms(30);       
  124.         dev->I2cDevAddr=0x52;
  125.         vl53l0x_Addr_set(dev,addr);//设置VL53L0X传感器原来上电前原I2C地址
  126.         VL53L0X_DataInit(dev);       
  127. }

  128. //初始化vl53l0x
  129. //dev:设备I2C参数结构体
  130. VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev)
  131. {
  132.         GPIO_InitTypeDef  GPIO_InitStructure;
  133.         VL53L0X_Error Status = VL53L0X_ERROR_NONE;
  134.         VL53L0X_Dev_t *pMyDevice = dev;
  135.        
  136.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //使能AFIO时钟
  137.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //先使能外设IO PORTA时钟
  138.        
  139.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                   //端口配置
  140.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出
  141.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO口速度为50MHz
  142.     GPIO_Init(GPIOA, &GPIO_InitStructure);                                   //根据设定参数初始化GPIOA

  143.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!!
  144.                
  145.         pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上电默认0x52)
  146.         pMyDevice->comms_type = 1;           //I2C通信模式
  147.         pMyDevice->comms_speed_khz = 400;    //I2C通信速率
  148.        
  149.         VL53L0X_i2c_init();//初始化IIC总线
  150.        
  151.         VL53L0X_Xshut=0;//失能VL53L0X
  152.         delay_ms(30);
  153.         VL53L0X_Xshut=1;//使能VL53L0X,让传感器处于工作
  154.         delay_ms(30);
  155.        
  156.     vl53l0x_Addr_set(pMyDevice,0x54);//设置VL53L0X传感器I2C地址
  157.     if(Status!=VL53L0X_ERROR_NONE) goto error;
  158.         Status = VL53L0X_DataInit(pMyDevice);//设备初始化
  159.         if(Status!=VL53L0X_ERROR_NONE) goto error;
  160.         delay_ms(2);
  161.         Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//获取设备ID信息
  162.     if(Status!=VL53L0X_ERROR_NONE) goto error;
  163.        
  164.         AT24CXX_Read(0,(u8*)&Vl53l0x_data,sizeof(_vl53l0x_adjust));//读取24c02保存的校准数据,若已校准 Vl53l0x_data.adjustok==0xAA
  165.         if(Vl53l0x_data.adjustok==0xAA)//已校准
  166.           AjustOK=1;       
  167.         else //没校准       
  168.           AjustOK=0;
  169.        
  170.         error:
  171.         if(Status!=VL53L0X_ERROR_NONE)
  172.         {
  173.                 print_pal_error(Status);//打印错误信息
  174.                 return Status;
  175.         }
  176.          
  177.         return Status;
  178. }

  179. //主菜单界面
  180. void vl53l0x_mtest_ui(void)
  181. {
  182.          POINT_COLOR=BLUE;//设置字体为蓝色
  183.          LCD_Fill(30,170,300,300,WHITE);
  184.          LCD_ShowString(30,170,200,16,16,"KEY_UP: Calibration mode");//校准模式
  185.          LCD_ShowString(30,190,200,16,16,"KEY1:   General mode");    //普通测量模式
  186.          LCD_ShowString(30,210,200,16,16,"KEY0:   Interrupt mode");  //中断测量模式
  187. }

  188. //VL53L0X主测试程序
  189. void vl53l0x_test(void)
  190. {   
  191.          u8 i=0;
  192.          u8 key=0;
  193.          while(vl53l0x_init(&vl53l0x_dev))//vl53l0x初始化
  194.          {
  195.                 LCD_ShowString(30,140,200,16,16,"VL53L0X Error!!!");
  196.             delay_ms(500);
  197.                 LCD_ShowString(30,140,200,16,16,"                ");
  198.                 delay_ms(500);
  199.                 LED0=!LED0;//DS0闪烁
  200.          }
  201.          printf("VL53L0X OK\r\n");
  202.          LCD_ShowString(30,140,200,16,16,"VL53L0X OK");
  203.          vl53l0x_mtest_ui();//主菜单显示
  204.          while(1)
  205.          {
  206.                  
  207.                  key = KEY_Scan(0);
  208.                  if(key)
  209.                  {
  210.                           switch(key)
  211.                           {
  212.                                   case WKUP_PRES:  vl53l0x_calibration_test(&vl53l0x_dev);           break;//校准模式
  213.                                   case KEY1_PRES:  vl53l0x_general_test(&vl53l0x_dev);               break;//普通测量模式
  214.                                   case KEY0_PRES:  vl53l0x_interrupt_test(&vl53l0x_dev);             break;//中断测量模式  
  215.                           }
  216.                           vl53l0x_mtest_ui();
  217.                  }
  218.                  i++;
  219.                  if(i==5)
  220.                  {
  221.                          i=0;
  222.                          LED0=!LED0;
  223.                  }
  224.                  delay_ms(50);
  225.                  
  226.          }
  227. }

  228. //----------以下函数为USMART调用------------//

  229. //获取vl53l0x传感器ID信息
  230. void vl53l0x_info(void)
  231. {
  232.         printf("\r\n-------vl53l0x传感器设备信息-------\r\n\r\n");
  233.         printf("  Name:%s\r\n",vl53l0x_dev_info.Name);
  234.         printf("  Addr:0x%x\r\n",vl53l0x_dev.I2cDevAddr);
  235.         printf("  ProductId:%s\r\n",vl53l0x_dev_info.ProductId);
  236.         printf("  RevisionMajor:0x%x\r\n",vl53l0x_dev_info.ProductRevisionMajor);
  237.         printf("  RevisionMinor:0x%x\r\n",vl53l0x_dev_info.ProductRevisionMinor);
  238.         printf("\r\n-----------------------------------\r\n");
  239. }

  240. //获取一次测量距离数据
  241. //mode模式配置 0:默认;1:高精度;2:长距离;3:高速
  242. void One_measurement(u8 mode)
  243. {
  244.         vl53l0x_set_mode(&vl53l0x_dev,mode);
  245.         VL53L0X_PerformSingleRangingMeasurement(&vl53l0x_dev,&vl53l0x_data);
  246.         printf("\r\n d: %4d mm.\r\n",vl53l0x_data.RangeMilliMeter);
  247.                
  248. }
复制代码

全部资料51hei下载地址:
(标准库版本,适合战舰V3 STM32开发板)扩展实验21 ATK-VL53L0X模块实验.rar (497.84 KB, 下载次数: 346)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:282266 发表于 2019-1-30 21:51 | 只看该作者
赞啊 方便了。多谢楼主
回复

使用道具 举报

板凳
ID:393991 发表于 2019-3-27 14:56 | 只看该作者
赞啊  多谢楼主
回复

使用道具 举报

地板
ID:67537 发表于 2019-4-28 17:39 | 只看该作者
这个测试距离是多少
回复

使用道具 举报

5#
ID:288090 发表于 2019-5-11 23:02 | 只看该作者
多谢楼主
回复

使用道具 举报

6#
ID:506805 发表于 2019-6-5 10:24 | 只看该作者
学习了。thx
回复

使用道具 举报

7#
ID:248814 发表于 2019-6-6 08:34 | 只看该作者
yyhhgg 发表于 2019-4-28 17:39
这个测试距离是多少

2.5m内吧
回复

使用道具 举报

8#
ID:568187 发表于 2019-6-20 18:15 | 只看该作者
多谢楼主
回复

使用道具 举报

9#
ID:561383 发表于 2019-6-25 11:01 | 只看该作者
你好,有没有硬件部分的电路图看看呢
回复

使用道具 举报

10#
ID:585332 发表于 2019-7-16 19:30 | 只看该作者
谢谢,下载来学习。
回复

使用道具 举报

11#
ID:585332 发表于 2019-7-16 19:30 | 只看该作者
可是这里没有说硬件上怎么接线
回复

使用道具 举报

12#
ID:298802 发表于 2019-8-7 16:41 | 只看该作者
感谢楼主
回复

使用道具 举报

13#
ID:511461 发表于 2019-8-8 10:59 | 只看该作者
适合战舰的?
回复

使用道具 举报

14#
ID:216959 发表于 2019-8-21 09:49 | 只看该作者
赞啊  多谢楼主
回复

使用道具 举报

15#
ID:602256 发表于 2019-8-21 10:35 | 只看该作者
飞秒测试 预制三种发射增益 对应三种距离范围 这个例程真标准 多谢楼主
回复

使用道具 举报

16#
ID:334968 发表于 2019-9-2 13:39 | 只看该作者
很不错的资料!值得学习!
回复

使用道具 举报

17#
ID:216667 发表于 2019-9-8 11:03 | 只看该作者
谢谢!给你个大大
回复

使用道具 举报

18#
ID:593927 发表于 2020-2-14 13:41 | 只看该作者
成功下载,感谢楼主。
回复

使用道具 举报

19#
ID:16031 发表于 2020-2-14 18:18 | 只看该作者
下载这个工程,学习一下
回复

使用道具 举报

20#
ID:68875 发表于 2020-2-14 22:04 | 只看该作者
多谢楼主
回复

使用道具 举报

21#
ID:538733 发表于 2020-3-24 11:46 | 只看该作者
很好的资料。值得学习。
回复

使用道具 举报

22#
ID:538733 发表于 2020-3-24 11:47 | 只看该作者
有空可以研究一下。太好了
回复

使用道具 举报

23#
ID:747116 发表于 2020-5-8 18:21 | 只看该作者
mark,有空研究下,多谢分享。
回复

使用道具 举报

24#
ID:367242 发表于 2020-6-3 08:03 | 只看该作者
谢谢分享
回复

使用道具 举报

25#
ID:868171 发表于 2021-3-30 14:47 | 只看该作者
现在ST的缺货,可以试一下国产VI5300,完美兼容替换XL53L0X、XL53L1X、VL53L3X系列,需要可百度,VL53L0X兼容
回复

使用道具 举报

26#
ID:910441 发表于 2021-4-22 18:07 | 只看该作者
回复

使用道具 举报

27#
ID:896590 发表于 2023-11-16 22:24 | 只看该作者
收藏了,感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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