欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: VL53L0 STM32源碼下載 [打印本頁]

作者: slt2011    時間: 2019-1-25 10:01
標題: VL53L0 STM32源碼下載
(標準庫版本,適合MiniV3開發板)擴展實驗21 ATK-VL53L0X模塊實驗

單片機源程序如下:
  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_GPIOA,ENABLE);   //先使能外設IO PORTA時鐘
  137.        
  138.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                   // 端口配置
  139.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽輸出
  140.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO口速度為50MHz
  141.     GPIO_Init(GPIOA, &GPIO_InitStructure);                                   //根據設定參數初始化GPIOA

  142.         pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上電默認0x52)
  143.         pMyDevice->comms_type = 1;           //I2C通信模式
  144.         pMyDevice->comms_speed_khz = 400;    //I2C通信速率
  145.        
  146.         VL53L0X_i2c_init();//初始化IIC總線
  147.        
  148.         VL53L0X_Xshut=0;//失能VL53L0X
  149.         delay_ms(30);
  150.         VL53L0X_Xshut=1;//使能VL53L0X,讓傳感器處于工作
  151.         delay_ms(30);
  152.        
  153.     vl53l0x_Addr_set(pMyDevice,0x54);//設置VL53L0X傳感器I2C地址
  154.     if(Status!=VL53L0X_ERROR_NONE) goto error;
  155.         Status = VL53L0X_DataInit(pMyDevice);//設備初始化
  156.         if(Status!=VL53L0X_ERROR_NONE) goto error;
  157.         delay_ms(2);
  158.         Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//獲取設備ID信息
  159.     if(Status!=VL53L0X_ERROR_NONE) goto error;
  160.        
  161.         AT24CXX_Read(0,(u8*)&Vl53l0x_data,sizeof(_vl53l0x_adjust));//讀取24c02保存的校準數據,若已校準 Vl53l0x_data.adjustok==0xAA
  162.         if(Vl53l0x_data.adjustok==0xAA)//已校準
  163.           AjustOK=1;       
  164.         else //沒校準       
  165.           AjustOK=0;
  166.        
  167.         error:
  168.         if(Status!=VL53L0X_ERROR_NONE)
  169.         {
  170.                 print_pal_error(Status);//打印錯誤信息
  171.                 return Status;
  172.         }
  173.          
  174.         return Status;
  175. }

  176. //主菜單界面
  177. void vl53l0x_mtest_ui(void)
  178. {
  179.          POINT_COLOR=BLUE;//設置字體為藍色
  180.          LCD_Fill(30,170,300,300,WHITE);
  181.          LCD_ShowString(30,170,200,16,16,"KEY_UP: Calibration mode");//校準模式
  182.          LCD_ShowString(30,190,200,16,16,"KEY1:   General mode");    //普通測量模式
  183.          LCD_ShowString(30,210,200,16,16,"KEY0:   Interrupt mode");  //中斷測量模式
  184. }

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

  225. //----------以下函數為USMART調用------------//

  226. //獲取vl53l0x傳感器ID信息
  227. void vl53l0x_info(void)
  228. {
  229.         printf("\r\n-------vl53l0x傳感器設備信息-------\r\n\r\n");
  230.         printf("  Name:%s\r\n",vl53l0x_dev_info.Name);
  231.         printf("  Addr:0x%x\r\n",vl53l0x_dev.I2cDevAddr);
  232.         printf("  ProductId:%s\r\n",vl53l0x_dev_info.ProductId);
  233.         printf("  RevisionMajor:0x%x\r\n",vl53l0x_dev_info.ProductRevisionMajor);
  234.         printf("  RevisionMinor:0x%x\r\n",vl53l0x_dev_info.ProductRevisionMinor);
  235.         printf("\r\n-----------------------------------\r\n");
  236. }

  237. //獲取一次測量距離數據
  238. //mode模式配置 0:默認;1:高精度;2:長距離;3:高速
  239. void One_measurement(u8 mode)
  240. {
  241.         vl53l0x_set_mode(&vl53l0x_dev,mode);
  242.         VL53L0X_PerformSingleRangingMeasurement(&vl53l0x_dev,&vl53l0x_data);
  243.         printf("\r\n d: %4d mm.\r\n",vl53l0x_data.RangeMilliMeter);
  244.                
  245. }
復制代碼
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "key.h"  
  7. #include "24cxx.h"
  8. #include "myiic.h"
  9. #include "usmart.h"
  10. #include "vl53l0x.h"


  11.           
  12. int main(void)
  13. {
  14.          
  15.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組2
  16.         delay_init();                                       //延時函數初始化          
  17.         uart_init(115200);                                   //串口初始化為115200
  18.         usmart_dev.init(72);                           //初始化USMART       
  19.         LED_Init();                                                     //初始化與LED連接的硬件接口
  20.         LCD_Init();                                           //LCD初始化
  21.         KEY_Init();                                                   //按鍵初始化                        
  22.         AT24CXX_Init();                                           //IIC初始化
  23.         POINT_COLOR=RED;                               //設置字體為紅色
  24.         LCD_ShowString(30,50,200,16,16,"Mini STM32");       
  25.         LCD_ShowString(30,70,200,16,16,"Sensor VL53L0X TEST");       
  26.         LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  27.         LCD_ShowString(30,110,200,16,16,"2017/6/25");            
  28.         POINT_COLOR=BLUE;//設置字體為藍色
  29.         while(AT24CXX_Check())//檢測不到24c02
  30.         {
  31.                 LCD_ShowString(30,150,200,16,16,"24C02 Check Failed!");
  32.                 delay_ms(500);
  33.                 LCD_ShowString(30,150,200,16,16,"Please Check!      ");
  34.                 delay_ms(500);
  35.                 LED0=!LED0;//DS0閃爍
  36.         }
  37.         while(1)
  38.         {
  39.                 vl53l0x_test();//vl53l0x測試
  40.         }
  41. }
復制代碼


所有資料51hei提供下載:
(標準庫版本,適合MiniV3開發板)擴展實驗21 ATK-VL53L0X模塊實驗.7z (315.91 KB, 下載次數: 20)







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