你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103+VL53L0测距(一)

[复制链接]
STMCU小助手 发布时间:2022-12-7 16:03
本文记录了我使用STM32F103结合VL53L0测距模块的一个学习过程。
VL53L0是由ST公司最新推出的一款飞行时间测距+手势检测的微型模块,它应用非常广泛包括:激光测距、避障检测、一维手势识别等;接下来我们重点介绍它的激光测距功能。

一、模块的硬件连接


20191215095427730.jpg
20191215095607206.jpg

上图便是我所使用的测距模块GYVL53L0XV2,它预留了六个接口:
1、VIN:供电电压,可在3V~5V范围内进行供电,但如果自己进行电路搭建的话,则需要一个线性稳压电路,将输入电压稳定在2.8V进行芯片供电和芯片I/O端口的上拉,这个可以自己看它的数据手册;
2、GND:参考地;
3、SCL:I2C通信的时钟线;
4、SDA:I2C通信的数据线;
5、XSHUT:芯片的使能管脚,电平1代表有效,电平0代表无效;
6、GPIO1:芯片的中断管脚。

本文与STM32F103的连线如下:
VIN--------------->3.3V
GND------------->GND
SCL-------------->PB6
SDA-------------->PB7

其中XSHUT与GPIO1没有连接,由电路可知,未连接时它们均上拉为高电平,XSHUT一直为高则代表芯片始终有效工作,如果有需要也可以进行连接,用单片机控制。在这里我没有使用到,因此直接不连接就行。


二、程序代码
  1. #ifndef _VL53L0_H
  2. #define _VL53L0_H

  3. #define VL53L0X_REG_IDENTIFICATION_MODEL_ID         0xc0
  4. #define VL53L0X_REG_IDENTIFICATION_REVISION_ID      0xc2
  5. #define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD   0x50
  6. #define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x70
  7. #define VL53L0X_REG_SYSRANGE_START                  0x00
  8. #define VL53L0X_REG_RESULT_INTERRUPT_STATUS         0x13
  9. #define VL53L0X_REG_RESULT_RANGE_STATUS             0x14
  10. #define VL53L0X_Add 0x29
  11. #include "stm32f10x.h"
  12. #include "bsp_usart1.h"
  13. #include "bsp_i2c_gpio.h"

  14. u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf);
  15. u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf);
  16. u8 VL53L0X_Write_Byte(u8 reg,u8 data);
  17. u8 VL53L0X_Read_Byte(u8 reg);
  18. uint16_t bswap(u8 b[]);                                  
  19. uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg);       
  20. uint16_t makeuint16(int lsb, int msb);                 

  21. #endif

  22. #include "VL53L0.h"
  23. uint16_t bswap(u8 b[])
  24. {
  25.         uint16_t val = ((b[0]<< 8) & b[1]);
  26.         return val;
  27. }

  28. uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg)
  29. {
  30.         uint16_t vcsel_period_pclks = (vcsel_period_reg + 1) <<1;
  31.         return vcsel_period_pclks;
  32. }

  33. uint16_t makeuint16(int lsb, int msb)
  34. {
  35.     return ((msb & 0xFF) << 8) | (lsb & 0xFF);
  36. }

  37. u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  38. {
  39.         u8 i;
  40.     i2c_Start();
  41.         i2c_SendByte((addr<<1)|0);
  42.         if(i2c_WaitAck())
  43.         {
  44.                 i2c_Stop();                 
  45.                 return 1;               
  46.         }
  47.     i2c_SendByte(reg);
  48.     i2c_WaitAck();               
  49.         for(i=0;i<len;i++)
  50.         {
  51.                 i2c_SendByte(buf[i]);       
  52.                 if(i2c_WaitAck())               
  53.                 {
  54.                         i2c_Stop();         
  55.                         return 1;                 
  56.                 }               
  57.         }   
  58.     i2c_Stop();         
  59.         return 0;       
  60. }

  61. u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  62. {
  63.         i2c_Start();
  64.         i2c_SendByte((addr<<1)|0);
  65.         if(i2c_WaitAck())       
  66.                 i2c_Stop();                 
  67.                 return 1;               
  68.         }
  69.     i2c_SendByte(reg);       
  70.     i2c_WaitAck();               
  71.     i2c_Start();
  72.         i2c_SendByte((addr<<1)|1);       
  73.     i2c_WaitAck();               
  74.                
  75. while(len)
  76.         {
  77.                 if(len==1)
  78.                 {
  79.                         *buf=i2c_ReadByte();
  80.                         i2c_NAck();
  81.                 }
  82.                 else
  83.                 {
  84.                         *buf=i2c_ReadByte();       
  85.                         i2c_Ack();
  86.                 }
  87.                 len--;
  88.                 buf++;
  89.         }   
  90.     i2c_Stop();
  91.         return 0;       
  92. }

  93. //IIC写一个字节
  94. //reg:寄存器地址
  95. //data:数据
  96. //·返回值:0,代表正常
  97. //     其他,错误代码
  98. u8 VL53L0X_Write_Byte(u8 reg,u8 data)                                  
  99. {
  100.     i2c_Start();
  101.         i2c_SendByte((VL53L0X_Add<<1)|0);//发送器件地址+写命令
  102.         if(i2c_WaitAck())        //等待应答
  103.         {
  104.                 i2c_Stop();                 
  105.                 return 1;               
  106.         }
  107.     i2c_SendByte(reg);        //写寄存器地址
  108.     i2c_WaitAck();                //等待应答
  109.         i2c_SendByte(data);//发送数据
  110.         if(i2c_WaitAck())        //等待应答
  111.         {
  112.                 i2c_Stop();         
  113.                 return 1;                 
  114.         }                 
  115.     i2c_Stop();         
  116.         return 0;
  117. }
  118. //IIC读一个字节
  119. //reg:寄存器地址
  120. //返回值:读到的数据
  121. u8 VL53L0X_Read_Byte(u8 reg)
  122. {
  123.         u8 res;
  124.     i2c_Start();
  125.         i2c_SendByte(0x52);//发送器件地址+写命令       
  126.         i2c_WaitAck();                //等待应答
  127.     i2c_SendByte(reg);        //写寄存器地址
  128.     i2c_WaitAck();                //等待应答
  129.     i2c_Start();
  130.         i2c_SendByte(0x53 );//发送器件地址+读命令
  131.     i2c_WaitAck();
  132. i2c_SendByte(reg);    //写寄存器地址
  133.         res=i2c_ReadByte();   //读取数据,发送nACK
  134.     i2c_Stop();                        //产生一个停止条件
  135.         return res;               
  136. }

  137. main.c:
  138. #include "stm32f10x.h"
  139. #include "bsp_usart1.h"
  140. #include "bsp_i2c_gpio.h"
  141. #include "VL53L0.h"

  142. uint8_t Rxflag=0;
  143. uint8_t ucTemp;

  144. int main(void)
  145. {       
  146.        
  147.         u8 val = 0;
  148.   u8 gbuf[16];
  149.         u8 DeviceRangeStatusInternal;
  150.         u8 tp=0;
  151.        
  152.         uint32_t cnt = 0;
  153.         uint16_t count[3];
  154.        
  155.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  156.         USARTx_Config();
  157.         NVIC_Configuration();
  158.         InitSysTick();
  159.          bsp_InitI2C();
  160.         while(1)
  161.         {
  162.        
  163.           VL53L0X_Write_Byte(VL53L0X_REG_SYSRANGE_START, 0x01);
  164.           
  165.                  while(cnt < 100)
  166.                  {
  167.                                 delay_ms(10);
  168.                                 val = VL53L0X_Read_Byte(VL53L0X_REG_RESULT_RANGE_STATUS);
  169.                                 if( val & 0x01) break;
  170.                                 cnt++;
  171.                  }

  172.                  if( val & 0x01)
  173.                                 printf("\r\n readey \r\n");
  174.                  else
  175.                                 printf("\r\n not readey \r\n");
  176.      VL53L0X_Read_Len(VL53L0X_Add, 0x14 , 12, gbuf);
  177.                        
  178.                  count[0] = makeuint16(gbuf[7], gbuf[6]);
  179.                  count[1] = makeuint16(gbuf[9], gbuf[8]);
  180.                  count[2] = makeuint16(gbuf[11], gbuf[10]);
  181.                  DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);

  182.                  printf("\r\n ambient count = %4d signal count = %4d distance = %4d status = %d ",count[0],count[1],count[2],DeviceRangeStatusInternal);

  183.                 delay_ms(1000);
  184.                  
  185.        
  186.         }
  187. }

复制代码

————————————————
版权声明:TangPeng_HanMO


收藏 评论0 发布时间:2022-12-7 16:03

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版