[资料干货] 基于STM32 VL53L0激光测距 精度高于1cm

[复制链接]
804|0
 楼主| 感动 发表于 2020-7-21 10:06 | 显示全部楼层 |阅读模式
这两年来,AI技术的迅猛发展,无人驾驶汽车热度疯狂,智能产品的不断涌现,图像识别、语音识别、神经网络感知等人工智能正处于难得的发展机遇期,人工智能和实体经济融合进一步深化,智能化产品也源源不断地涌现。产品智能化就需要大脑主控芯片和各种各样的sensor,ST现有推出一款TOF激光测距sensoor VL53L0,高精度测距,可以用于机器人、四轴飞行器、扫地机、手机等。

.VL53L0功耗低、体积小,正常工作模式下功耗仅20mW,待机功耗只有5µA。封装尺寸为2.4mm x 4.4mm x 1mm,业界目前体积最小的同类产品,距离测量精度高,测量距离最长可达2米。

在这里和大家分享原理图PCB及关键程序,实测精度高于1cm,满足项目要求。

  1. u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  2. {
  3.         u8 i;
  4.         i2c_Start();
  5.         i2c_SendByte((addr<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
  6.         if(i2c_WaitAck())        //µÈ´ýÓ¦´ð
  7.         {
  8.                 i2c_Stop();                 
  9.                 return 1;               
  10.         }
  11.         i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
  12.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  13.         for(i=0;i<len;i++)
  14.         {
  15.                 i2c_SendByte(buf[i]);        //·¢ËÍÊý¾Ý
  16.                 if(i2c_WaitAck())                //µÈ´ýACK
  17.                 {
  18.                         i2c_Stop();         
  19.                         return 1;                 
  20.                 }               
  21.         }   
  22.         i2c_Stop();         
  23.         return 0;       
  24. }
  25. u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  26. {
  27.         i2c_Start();
  28.         i2c_SendByte((addr<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
  29.         if(i2c_WaitAck())        //µÈ´ýÓ¦´ð
  30.         {
  31.                 i2c_Stop();                 
  32.                 return 1;               
  33.         }
  34.         i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
  35.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  36.         i2c_Start();
  37.         i2c_SendByte((addr<<1)|1);//·¢ËÍÆ÷¼þµØÖ·+¶ÁÃüÁî       
  38.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  39.         while(len)
  40.         {
  41.                 if(len==1)*buf=i2c_ReadByte(0);//¶ÁÊý¾Ý,·¢ËÍnACK
  42.                 else *buf=i2c_ReadByte(1);                //¶ÁÊý¾Ý,·¢ËÍACK  
  43.                 len--;
  44.                 buf++;
  45.         }   
  46.         i2c_Stop();        //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
  47.         return 0;       
  48. }
  49. u8 VL53L0X_Write_Byte(u8 reg,u8 data)                                  
  50. {
  51.         i2c_Start();
  52.         i2c_SendByte((VL53L0X_Add<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
  53.         if(i2c_WaitAck())        //µÈ´ýÓ¦´ð
  54.         {
  55.                 i2c_Stop();                 
  56.                 return 1;               
  57.         }
  58.         i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
  59.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  60.         i2c_SendByte(data);//·¢ËÍÊý¾Ý
  61.         if(i2c_WaitAck())        //µÈ´ýACK
  62.         {
  63.                 i2c_Stop();         
  64.                 return 1;                 
  65.         }                 
  66.         i2c_Stop();         
  67.         return 0;
  68. }
  69. u8 VL53L0X_Read_Byte(u8 reg)
  70. {
  71.         u8 res;
  72.         i2c_Start();
  73.         i2c_SendByte(0x52);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
  74.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  75.         i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
  76.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  77.         i2c_Start();
  78.         i2c_SendByte(0x53 );//·¢ËÍÆ÷¼þµØÖ·+¶ÁÃüÁî       
  79.         i2c_WaitAck();                //µÈ´ýÓ¦´ð
  80.         res=i2c_ReadByte(0);//¶ÁÈ¡Êý¾Ý,·¢ËÍnACK
  81.         i2c_Stop();                        //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
  82.         return res;               
  83. }
  84. int main(void)
  85. {       
  86.         int i,j;
  87.         u8 val = 0;
  88.   u8 gbuf[16];
  89.         u8 DeviceRangeStatusInternal;

  90.         uint32_t cnt = 0;
  91.         uint16_t count[3];
  92.        
  93.         GPIO_Config();

  94.         i2c_CfgGpio();
  95.         while (1)
  96.         {
  97.                 VL53L0X_Write_Byte(VL53L0X_REG_SYSRANGE_START, 0x01);

  98.                 while(cnt < 100)
  99.                 {
  100.                         val = VL53L0X_Read_Byte(VL53L0X_REG_RESULT_RANGE_STATUS);
  101.                         if( val & 0x01) break;
  102.                         cnt++;
  103.                 }

  104.                
  105.                 VL53L0X_Read_Len(VL53L0X_Add, 0x14 , 12, gbuf);

  106.                 count[0] = makeuint16(gbuf[7], gbuf[6]);
  107.                 count[1] = makeuint16(gbuf[9], gbuf[8]);
  108.                 count[2] = makeuint16(gbuf[11], gbuf[10]);
  109.                 DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);
  110.                 i++;
  111.                 if(i>256)i=0;
  112.                 temp[i]=count[2];
  113.                 Range=0;
  114.                 for(j=0;j<256;j++)
  115.                 {
  116.                         Range=Range+temp[j];
  117.                 }
  118.                 Range_avg=Range/256;
  119.                
  120.         }
  121. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

个人签名:关注我的博客https://blog.csdn.net/gd1984812 淘宝店 https://shop570248211.taobao.

35

主题

57

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部