找回密码
 立即注册

QQ登录

只需一步,快速开始

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

VL53L0 STM32源码下载

[复制链接]
跳转到指定楼层
楼主
ID:105836 发表于 2019-1-25 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(标准库版本,适合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)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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