[资料干货]

基于STM32 VL53L0激光测距 精度高于1cm

[复制链接]
504|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,满足项目要求。
48325f164d8c1338c.png 219255f164d944c1f5.png
u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
        u8 i;
        i2c_Start();
        i2c_SendByte((addr<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
        if(i2c_WaitAck())        //µÈ´ýÓ¦´ð
        {
                i2c_Stop();                 
                return 1;               
        }
        i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        for(i=0;i<len;i++)
        {
                i2c_SendByte(buf[i]);        //·¢ËÍÊý¾Ý
                if(i2c_WaitAck())                //µÈ´ýACK
                {
                        i2c_Stop();         
                        return 1;                 
                }               
        }   
        i2c_Stop();         
        return 0;       
}
u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
        i2c_Start();
        i2c_SendByte((addr<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
        if(i2c_WaitAck())        //µÈ´ýÓ¦´ð
        {
                i2c_Stop();                 
                return 1;               
        }
        i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        i2c_Start();
        i2c_SendByte((addr<<1)|1);//·¢ËÍÆ÷¼þµØÖ·+¶ÁÃüÁî       
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        while(len)
        {
                if(len==1)*buf=i2c_ReadByte(0);//¶ÁÊý¾Ý,·¢ËÍnACK
                else *buf=i2c_ReadByte(1);                //¶ÁÊý¾Ý,·¢ËÍACK  
                len--;
                buf++;
        }   
        i2c_Stop();        //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
        return 0;       
}
u8 VL53L0X_Write_Byte(u8 reg,u8 data)                                  
{
        i2c_Start();
        i2c_SendByte((VL53L0X_Add<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
        if(i2c_WaitAck())        //µÈ´ýÓ¦´ð
        {
                i2c_Stop();                 
                return 1;               
        }
        i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        i2c_SendByte(data);//·¢ËÍÊý¾Ý
        if(i2c_WaitAck())        //µÈ´ýACK
        {
                i2c_Stop();         
                return 1;                 
        }                 
        i2c_Stop();         
        return 0;
}
u8 VL53L0X_Read_Byte(u8 reg)
{
        u8 res;
        i2c_Start();
        i2c_SendByte(0x52);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî       
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        i2c_SendByte(reg);        //д¼Ä´æÆ÷µØÖ·
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        i2c_Start();
        i2c_SendByte(0x53 );//·¢ËÍÆ÷¼þµØÖ·+¶ÁÃüÁî       
        i2c_WaitAck();                //µÈ´ýÓ¦´ð
        res=i2c_ReadByte(0);//¶ÁÈ¡Êý¾Ý,·¢ËÍnACK
        i2c_Stop();                        //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
        return res;               
}
int main(void)
{       
        int i,j;
        u8 val = 0;
  u8 gbuf[16];
        u8 DeviceRangeStatusInternal;

        uint32_t cnt = 0;
        uint16_t count[3];
       
        GPIO_Config();

        i2c_CfgGpio();
        while (1)
        {
                VL53L0X_Write_Byte(VL53L0X_REG_SYSRANGE_START, 0x01);

                while(cnt < 100)
                {
                        val = VL53L0X_Read_Byte(VL53L0X_REG_RESULT_RANGE_STATUS);
                        if( val & 0x01) break;
                        cnt++;
                }

               
                VL53L0X_Read_Len(VL53L0X_Add, 0x14 , 12, gbuf);

                count[0] = makeuint16(gbuf[7], gbuf[6]);
                count[1] = makeuint16(gbuf[9], gbuf[8]);
                count[2] = makeuint16(gbuf[11], gbuf[10]);
                DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);
                i++;
                if(i>256)i=0;
                temp[i]=count[2];
                Range=0;
                for(j=0;j<256;j++)
                {
                        Range=Range+temp[j];
                }
                Range_avg=Range/256;
               
        }
}



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

35

主题

57

帖子

4

粉丝