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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14445|回復: 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, 下載次數: 355)

評分

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

查看全部評分

回復

使用道具 舉報

ID:282266 發表于 2019-1-30 21:51 | 顯示全部樓層
贊啊 方便了。多謝樓主
回復

使用道具 舉報

ID:393991 發表于 2019-3-27 14:56 | 顯示全部樓層
贊啊  多謝樓主
回復

使用道具 舉報

ID:67537 發表于 2019-4-28 17:39 | 顯示全部樓層
這個測試距離是多少
回復

使用道具 舉報

ID:288090 發表于 2019-5-11 23:02 | 顯示全部樓層
多謝樓主
回復

使用道具 舉報

ID:506805 發表于 2019-6-5 10:24 | 顯示全部樓層
學習了。thx
回復

使用道具 舉報

ID:248814 發表于 2019-6-6 08:34 | 顯示全部樓層
yyhhgg 發表于 2019-4-28 17:39
這個測試距離是多少

2.5m內吧
回復

使用道具 舉報

ID:568187 發表于 2019-6-20 18:15 | 顯示全部樓層
多謝樓主
回復

使用道具 舉報

ID:561383 發表于 2019-6-25 11:01 | 顯示全部樓層
你好,有沒有硬件部分的電路圖看看呢
回復

使用道具 舉報

ID:585332 發表于 2019-7-16 19:30 | 顯示全部樓層
謝謝,下載來學習。
回復

使用道具 舉報

ID:585332 發表于 2019-7-16 19:30 | 顯示全部樓層
可是這里沒有說硬件上怎么接線
回復

使用道具 舉報

ID:298802 發表于 2019-8-7 16:41 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:511461 發表于 2019-8-8 10:59 | 顯示全部樓層
適合戰艦的?
回復

使用道具 舉報

ID:216959 發表于 2019-8-21 09:49 | 顯示全部樓層
贊啊  多謝樓主
回復

使用道具 舉報

ID:602256 發表于 2019-8-21 10:35 | 顯示全部樓層
飛秒測試 預制三種發射增益 對應三種距離范圍 這個例程真標準 多謝樓主
回復

使用道具 舉報

ID:334968 發表于 2019-9-2 13:39 | 顯示全部樓層
很不錯的資料!值得學習!
回復

使用道具 舉報

ID:216667 發表于 2019-9-8 11:03 | 顯示全部樓層
謝謝!給你個大大
回復

使用道具 舉報

ID:593927 發表于 2020-2-14 13:41 | 顯示全部樓層
成功下載,感謝樓主。
回復

使用道具 舉報

ID:16031 發表于 2020-2-14 18:18 | 顯示全部樓層
下載這個工程,學習一下
回復

使用道具 舉報

ID:68875 發表于 2020-2-14 22:04 | 顯示全部樓層
多謝樓主
回復

使用道具 舉報

ID:538733 發表于 2020-3-24 11:46 | 顯示全部樓層
很好的資料。值得學習。
回復

使用道具 舉報

ID:538733 發表于 2020-3-24 11:47 | 顯示全部樓層
有空可以研究一下。太好了
回復

使用道具 舉報

ID:747116 發表于 2020-5-8 18:21 | 顯示全部樓層
mark,有空研究下,多謝分享。
回復

使用道具 舉報

ID:367242 發表于 2020-6-3 08:03 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:868171 發表于 2021-3-30 14:47 | 顯示全部樓層
現在ST的缺貨,可以試一下國產VI5300,完美兼容替換XL53L0X、XL53L1X、VL53L3X系列,需要可百度,VL53L0X兼容
回復

使用道具 舉報

ID:910441 發表于 2021-4-22 18:07 | 顯示全部樓層
回復

使用道具 舉報

ID:896590 發表于 2023-11-16 22:24 | 顯示全部樓層
收藏了,感謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年人免费网站 | 亚洲最大成人综合 | 青青草网站在线观看 | 九九热精品视频在线观看 | 久久亚洲国产精品 | 日韩av在线中文字幕 | 懂色中文一区二区三区在线视频 | 久久亚洲精品国产精品紫薇 | 91精品国产欧美一区二区 | 成人中文字幕在线观看 | 国产精品国产精品国产专区不卡 | 国产精品综合 | 91五月天| 一区二区三区视频在线 | 色本道| 国产精品自拍视频网站 | 97久久精品午夜一区二区 | 亚洲成av人片在线观看无码 | 精区3d动漫一品二品精区 | 亚洲综合无码一区二区 | 国产欧美在线 | 成人免费观看男女羞羞视频 | 欧美专区在线观看 | 免费观看黄网站 | 国产日韩精品一区 | www4虎 | 久久婷婷色| 亚洲狠狠爱| www.97zyz.com| 天天想天天干 | 最新中文字幕在线播放 | 久久久成人精品 | 视频一区二区中文字幕 | 视频二区国产 | 国产精品精品视频一区二区三区 | 国产伦精品一区二区三区视频金莲 | 天天色官网 | 老司机久久 | 91av视频在线 | 精品久久一区 | 久久久久久久久久久高潮一区二区 |