久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 激光測距VL53LX1 配合STM32F103T8U6測試成功 [打印本頁]

作者: shw7610    時間: 2020-7-3 17:10
標(biāo)題: 激光測距VL53LX1 配合STM32F103T8U6測試成功

激光測距VL53LX1 配合STM32F103T8U6測試成功
感謝論壇內(nèi)的一位網(wǎng)有人



#include "vl53l1x.h"
#include "common.h"
#include "usart.h"

VL53L1_Dev_t VL53L1_dev[2];        //device param, include I2C
//VL53L1_DeviceInfo_t VL53L1_dev_info[2];//device ID version info
uint8_t Ajusted[]={0,0};//adjusted sign, 0-not, 1-had
uint16_t Distance = 0;//保存測距數(shù)據(jù)
VL53L1_RangingMeasurementData_t VL53L1_data[2];//ranging result struct, distance, max distance,etc.

void vl531_delay_ms(uint16_t ms)
{
//    delay_us(ms);
    uint32_t cnt;
    uint32_t i;
    for(cnt=0; cnt<ms; cnt++)
    {
        for(i=0; i<1; i++);
    }
}

//VL53L1X mode param
//0:default, 1: high accuracy, 2: long distance, 3: high speed
mode_data Mode_data[]=
{
        {(FixPoint1616_t)(16384), //its uint32_t, uint16_.uint16_t, 0.25*65536
         (FixPoint1616_t)(1179648),         //18*65536
         33000,
         14,
         10},//default
               
        {(FixPoint1616_t)(16384),        //0.25*65536
         (FixPoint1616_t)(1179648),                //18*65536
         200000,
         14,
         10},//high accuracy
               
  {(FixPoint1616_t)(6554),                //0.1*65536
         (FixPoint1616_t)(3932160),                //60*65536
         33000,
         18,
         14},//long distance
       
  {(FixPoint1616_t)(16384),        //0.25*65536
         (FixPoint1616_t)(2097152),                //32*65536
         20000,
         14,
         10},//high speed
};

//config VL53L1X I2C addr
//dev: I2C param struct
//newaddr: device new I2C addr
VL53L1_Error VL53L1_addr_set(VL53L1_Dev_t *dev, uint8_t newaddr)
{
        uint16_t Id;
        VL53L1_Error Status = VL53L1_Error_NONE;
       
        if(newaddr == dev->I2cDevAddr) //if new addr == old addr, exit
                return VL53L1_Error_NONE;
       
        //try to access a reg with old addr(default 0x52)
        Status = VL53L1_RdWord(dev, VL53L1_IDENTIFICATION__MODEL_ID, &Id);
        if(Status!=VL53L1_Error_NONE)
                return Status;

        if(Id == 0xEACC)
        {
                //set new I2C addr
                Status = VL53L1_SetDeviceAddress(dev,newaddr);
                if(Status!=VL53L1_Error_NONE)
                        return Status;
               
                //update struct I2C addr
                dev->I2cDevAddr = newaddr;
                //check new I2C addr
                Status = VL53L1_RdWord(dev, VL53L1_IDENTIFICATION__MODEL_ID, &Id);
        }

        return Status;
}


VL53L1_Error VL53L1_reset(VL53L1_Dev_t *pDev)
{
        return VL53L1_init(pDev);
}

//init vl53l1x
//dev: I2C param struct       
//before call this func, set:
//    pDev->I2cDevAddr = DevAddr;        ---VL53L1X I2C addr (default 0x52 at power on)
//                 pDev->comms_type = 1;                //I2C comm mode
//                pDev->comms_speed_khz = 400;         //I2C bps
//if resetting device, func(pDev),DevAddr=0x52
VL53L1_Error VL53L1_init(VL53L1_Dev_t *pDev)
{
        VL53L1_Error Status = VL53L1_Error_NONE;
        VL53L1_Dev_t *pMyDevice = pDev;
        //uint8_t I2cAddr;
        pMyDevice->I2cDevAddr = 0x52;//I2C地址(上電默認(rèn)0x52)
        pMyDevice->comms_type = 1;           //I2C通信模式
        pMyDevice->comms_speed_khz = 400;    //I2C通信速率
        //I2cAddr=pMyDevice->I2cDevAddr;
       
//        VL53L1_i2c_init();//init I2C bus
        VL53l1_GPIO_Init();
        VL53L1_I2C_Init();
       
        XShut_Off;
        vl531_delay_ms(300);
        XShut_On;
        vl531_delay_ms(300);
       
        Status = VL53L1_WaitDeviceBooted(pMyDevice);
    if(Status!=VL53L1_Error_NONE)
        {
                printf("Wait device Boot failed!\r\n");
                return Status;
        }

  vl531_delay_ms(2);
  Status = VL53L1_addr_set(pMyDevice, 0x52);//set provious VL53L1X I2C addr
  if(Status!=VL53L1_Error_NONE)
  {
          printf("set addr failed!\r\n");
          return Status;
  }

        Status = VL53L1_DataInit(pMyDevice);//device init
        if(Status!=VL53L1_Error_NONE)
        {
                printf("datainit failed!\r\n");
                return Status;
        }

        vl531_delay_ms(2);
//--may be delete
        Status = VL53L1_StaticInit(pMyDevice);
        if(Status!=VL53L1_Error_NONE)
        {
                printf("static init failed!\r\n");
                return Status;
        }
         
/*        HAL_Delay(2);
        Status = VL53L1_PerformRefSpadManagement(pMyDevice);//perform ref SPAD management
        if(Status!=VL53L1_Error_NONE)
                return Status;
*/
#ifdef JGCS_001
    Status = VL53L1_SetDistanceMode(pMyDevice, VL53L1_DISTANCEMODE_SHORT);        //short,medium,long
        if(Status!=VL53L1_Error_NONE)
        {
                printf("set discance mode failed!\r\n");
                return Status;
        }
#else
        Status = VL53L1_SetDistanceMode(pMyDevice, VL53L1_DISTANCEMODE_LONG);        //short,medium,long
        if(Status!=VL53L1_Error_NONE)
        {
                printf("set discance mode failed!\r\n");
                return Status;
        }
#endif
        vl531_delay_ms(2);
        /*Status = VL53L1_SetInterMeasurementPeriodMilliSeconds(pMyDevice,500);  //設(shè)置測試時間間隔
        //Status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(pMyDevice,50000);
        if(Status!=VL53L1_Error_NONE)
        {
                printf("set time failed!\r\n");
                return Status;
        }
        vl531_delay_ms(2);
        Status = VL53L1_StartMeasurement(pMyDevice);
        if(Status!=VL53L1_Error_NONE)
        {
                printf("start measurement failed!\r\n");
                return Status;
        }*/
//--may be finished

       
        return Status;
}


//VL53L1X test mode config
//dev: device I2C param struct
//mode: 0:default, 1:high accuracy, 2:long distance

VL53L1_Error VL53L1_set_mode(VL53L1_Dev_t *dev, uint8_t mode)
{
        VL53L1_Error status = VL53L1_Error_NONE;
        //VL53L1_reset(dev);//reset vl53l1x (to avoid the distance result error due to frequently changing running mode)
        //status = VL53L1_StaticInit(dev);
         
        vl531_delay_ms(2);
        status = VL53L1_PerformRefSpadManagement(dev);//perform ref SPAD management
        if(status!=VL53L1_Error_NONE)
        {
                printf("refspad failed!\r\n");
                return status;
        }
        vl531_delay_ms(2);
        /*status = VL53L1_PerformOffsetSimpleCalibration(dev,140);
        if(status!=VL53L1_Error_NONE)
        {
                printf("offset calibration failed!\r\n");
                //return status;
        }
        vl531_delay_ms(2);
        status = VL53L1_SetXTalkCompensationEnable(dev,1);
        if(status!=VL53L1_Error_NONE)
        {
                printf("XTalk enable failed!\r\n");
                //return status;
        }
        vl531_delay_ms(2);
        status = VL53L1_PerformSingleTargetXTalkCalibration(dev,140);
        if(status!=VL53L1_Error_NONE)
        {
                printf("XTalk calibration failed!\r\n");
                //return status;
        }*/
#ifdef JGCS_001
    status = VL53L1_SetDistanceMode(dev, VL53L1_DISTANCEMODE_SHORT);        //short,medium,long
        if(status!=VL53L1_Error_NONE)
                return status;
#else
        status = VL53L1_SetDistanceMode(dev, VL53L1_DISTANCEMODE_LONG);        //short,medium,long
        if(status!=VL53L1_Error_NONE)
                return status;
#endif

        //HAL_Delay(2);
        vl531_delay_ms(30);
        status = VL53L1_SetLimitCheckEnable(dev,VL53L1_CHECKENABLE_SIGMA_FINAL_RANGE,1);//sigma--standard deviation, enable SIGMA limit check
        if(status!=VL53L1_Error_NONE)
                return status;
       
        //HAL_Delay(2);
        vl531_delay_ms(2);
        status = VL53L1_SetLimitCheckEnable(dev,VL53L1_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//signal--amplitude of the signal-
                                                                                                                                                                                                                                                                                                                                                                //-reflected. enable signal rate limit check
        if(status!=VL53L1_Error_NONE)
                return status;
       
        //HAL_Delay(2);
        vl531_delay_ms(2);
        status = VL53L1_SetLimitCheckValue(dev,VL53L1_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//set SIGMA limit
        if(status!=VL53L1_Error_NONE)
                return status;
       
        //HAL_Delay(2);
        vl531_delay_ms(2);
        status = VL53L1_SetLimitCheckValue(dev,VL53L1_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//set signal rate limit
        if(status!=VL53L1_Error_NONE)
                return status;
       
        //---maybe need, and add a item to Mode_data
        //HAL_Delay(2);
        //status = VL53L1_SetLimitCheckValue(dev,VL53L1_CHECKENABLE_RANGE_IGNORE_THRESHOLD,Mode_data[mode].ignoreThres);//set signal rate limit
        //if(status!=VL53L1_Error_NONE)
        //        return status;
       
        //HAL_Delay(2);
        //vl531_delay_ms(30);
        status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//set the max interval for a whole diatance test
        if(status!=VL53L1_Error_NONE)
                return status;

        //HAL_Delay(2);
        vl531_delay_ms(2);
        status = VL53L1_SetInterMeasurementPeriodMilliSeconds(dev, 100);    //SHW   500
        if(status!=VL53L1_Error_NONE)
        {
                printf("SetInterMeasurementPeriodMilliSeconds failed!\r\n");
                return status;
        }
        vl531_delay_ms(2);
        status = VL53L1_StartMeasurement(dev);
        if(status!=VL53L1_Error_NONE)
        {
                printf("start measurement failed!\r\n");
                return status;
        }
        /*status = VL53L1_SetInterMeasurementPeriodMilliSeconds(dev, 500);        //the delay between two ranging operations,0.5ms
//        if(status!=VL53L1_Error_NONE)
//                return status;*/
       
//        HAL_Delay(2);
//        status = VL53L1_SetVcselPulsePeriod(dev, VL53L1_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod);//set VCSEL pluse cycle
//        if(status!=VL53L1_Error_NONE)
//                return status;
       
//        HAL_Delay(2);
//        status = VL53L1_SetVcselPulsePeriod(dev, VL53L1_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod);//set VCSEL pluse cycle period
         
        return status;
}

//VL53L1X single ranging
//dev: device I2C param struct
//pdata: result struct
VL53L1_Error VL53L1_single_test(VL53L1_Dev_t *dev,VL53L1_RangingMeasurementData_t *pdata)
{
        VL53L1_Error Status = VL53L1_Error_NONE;
        u8 isDataReady = 0;
        /*Status = VL53L1_StartMeasurement(dev);
        if(Status != VL53L1_Error_NONE)
                return Status;*/
       
//        Status = VL53L1_poll_for_range_completion(dev, VL53L1_RANGE_COMPLETION_POLLING_TIMEOUT_MS);
        Status = VL53L1_GetMeasurementDataReady(dev,&isDataReady);
        //Status = VL53L1_WaitMeasurementDataReady(dev);
        if(Status != VL53L1_Error_NONE)
                return Status;
    if(1 == isDataReady)
        {
                Status = VL53L1_GetRangingMeasurementData(dev, pdata);
                Distance = pdata->RangeMilliMeter;
        }
        Status = VL53L1_ClearInterruptAndStartMeasurement(dev);
        return Status;
}

//        Distance_data = pdata->RangeMilliMeter;//output the final distance data

//start general test. repeatly. not used
//dev:device I2C param struct
//mode0:default, 1:high accuracy, 2:long distance
void VL53L1_general_start(VL53L1_Dev_t *dev,uint8_t mode)
{
        VL53L1_Error Status=VL53L1_Error_NONE;
        uint8_t i=0;
       
        while(VL53L1_set_mode(dev,mode)) //config test mode
        {
                i++;
                if(i==2)
                        return;
        }
       
        while(Status==VL53L1_Error_NONE)
        {
                Status = VL53L1_single_test(dev,&VL53L1_data[0]);//perform a test
//                Distance_data=VL53L1_data[0].RangeMilliMeter;
        }
        //HAL_Delay(50);
        vl531_delay_ms(50);
}


VL53L1X.zip

227.58 KB, 下載次數(shù): 52, 下載積分: 黑幣 -5


作者: 51hei團(tuán)團(tuán)    時間: 2020-7-3 17:18
好東東 能分享下 原理圖嗎?

作者: fengtong2018    時間: 2020-10-28 22:57
能否分享一下原理圖




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩在线高清 | 开操网| 欧美精品第三页 | 97精品国产| 国产日韩一区二区三免费高清 | 久久精品一区二 | 综合中文字幕 | 黄色电影在线免费观看 | 久久久毛片 | 日韩精品在线视频免费观看 | 中文字幕在线一区 | 日韩精品免费视频 | 日韩影音 | 久久一视频 | 成人在线看片 | 国产一区二区三区在线视频 | 久久久久国产精品午夜一区 | 久久一级大片 | 色噜噜狠狠色综合中国 | 中文日韩在线 | 欧美日韩在线一区二区三区 | 亚洲高清在线观看 | 一级毛片在线播放 | 97色免费视频 | 亚洲天堂精品一区 | 久久国产亚洲 | 日韩在线小视频 | 久久精品99| av中文字幕在线 | 欧美一区| 亚洲激精日韩激精欧美精品 | 欧美日韩精品区 | 91亚洲国产成人久久精品网站 | 中文字幕av第一页 | 国产成人精品一区二区三区四区 | 香蕉久久a毛片 | 国产黄a一级 | 国产在线看片 | 日韩成人| 久久久999免费视频 999久久久久久久久6666 | 午夜免费在线观看 |