|
vl53l0x stm32程序
- #include "vl53l0x_gen.h"
- VL53L0X_RangingMeasurementData_t vl53l0x_data;//測距測量結(jié)構(gòu)體
- vu16 Distance_data=0;//保存測距數(shù)據(jù)
- //VL53L0X 測量模式配置
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- //mode: 0:默認(rèn);1:高精度;2:長距離;3:高速
- VL53L0X_Error vl53l0x_set_mode(VL53L0X_Dev_t *dev,u8 mode)
- {
-
- VL53L0X_Error status = VL53L0X_ERROR_NONE;
- uint8_t VhvSettings;
- uint8_t PhaseCal;
- uint32_t refSpadCount;
- uint8_t isApertureSpads;
-
- vl53l0x_reset(dev);//復(fù)位vl53l0x(頻繁切換工作模式容易導(dǎo)致采集距離數(shù)據(jù)不準(zhǔn),需加上這一代碼)
- status = VL53L0X_StaticInit(dev);
- if(AjustOK!=0)//已校準(zhǔn)好了,寫入校準(zhǔn)值
- {
- status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount,Vl53l0x_data.isApertureSpads);//設(shè)定Spads校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings,Vl53l0x_data.PhaseCal);//設(shè)定Ref校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status=VL53L0X_SetOffsetCalibrationDataMicroMeter(dev,Vl53l0x_data.OffsetMicroMeter);//設(shè)定偏移校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status=VL53L0X_SetXTalkCompensationRateMegaCps(dev,Vl53l0x_data.XTalkCompensationRateMegaCps);//設(shè)定串?dāng)_校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
-
- }
- else
- {
- status = VL53L0X_PerformRefCalibration(dev, &VhvSettings, &PhaseCal);//Ref參考校準(zhǔn)
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_PerformRefSpadManagement(dev, &refSpadCount, &isApertureSpads);//執(zhí)行參考SPAD管理
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- }
- status = VL53L0X_SetDeviceMode(dev,VL53L0X_DEVICEMODE_SINGLE_RANGING);//使能單次測量模式
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,1);//使能SIGMA范圍檢查
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//使能信號速率范圍檢查
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//設(shè)定SIGMA范圍
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//設(shè)定信號速率范圍范圍
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//設(shè)定完整測距最長時(shí)間
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod);//設(shè)定VCSEL脈沖周期
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod);//設(shè)定VCSEL脈沖周期范圍
-
- error://錯(cuò)誤信息
- if(status!=VL53L0X_ERROR_NONE)
- {
- print_pal_error(status);
- LCD_Fill(30,140+20,300,300,WHITE);
- return status;
- }
- return status;
-
- }
- //VL53L0X 單次距離測量函數(shù)
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- //pdata:保存測量數(shù)據(jù)結(jié)構(gòu)體
- VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *dev,VL53L0X_RangingMeasurementData_t *pdata,char *buf)
- {
- VL53L0X_Error status = VL53L0X_ERROR_NONE;
- uint8_t RangeStatus;
-
- status = VL53L0X_PerformSingleRangingMeasurement(dev, pdata);//執(zhí)行單次測距并獲取測距測量數(shù)據(jù)
- if(status !=VL53L0X_ERROR_NONE) return status;
-
- RangeStatus = pdata->RangeStatus;//獲取當(dāng)前測量狀態(tài)
- memset(buf,0x00,VL53L0X_MAX_STRING_LENGTH);
- VL53L0X_GetRangeStatusString(RangeStatus,buf);//根據(jù)測量狀態(tài)讀取狀態(tài)字符串
-
- Distance_data = pdata->RangeMilliMeter;//保存最近一次測距測量數(shù)據(jù)
-
- return status;
- }
- //啟動(dòng)普通測量
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- //mode模式配置 0:默認(rèn);1:高精度;2:長距離
- void vl53l0x_general_start(VL53L0X_Dev_t *dev,u8 mode)
- {
- static char buf[VL53L0X_MAX_STRING_LENGTH];//測試模式字符串字符緩沖區(qū)
- VL53L0X_Error Status=VL53L0X_ERROR_NONE;//工作狀態(tài)
- u8 key=0;
- u8 i=0;
-
- LED0=1;
- mode_string(mode,buf);//顯示當(dāng)前配置的模式
- while(vl53l0x_set_mode(dev,mode))//配置精度模式
- {
- LCD_ShowString(30,140+40,200,16,16,"Mode Set Error!!!");
- delay_ms(500);
- LCD_ShowString(30,140+40,200,16,16," ");
- delay_ms(500);
- i++;
- if(i==2) return;
-
- }
- LCD_Fill(30,140+20,300,300,WHITE);
- LCD_ShowString(30,140+30,200,16,16,"KEY_UP: Exit the test ");
- LCD_ShowString(30,140+50,200,16,16,"Mode: ");
- LCD_ShowString(80,140+50,200,16,16,(u8*)buf);
- LCD_ShowString(30,140+70,200,16,16,"State:");//顯示測量狀態(tài)
- LCD_ShowString(30,140+90,200,16,16,"Distance: 0 mm");//顯示測量距離
- while(1)
- {
- key = KEY_Scan(0);
- if(key == WKUP_PRES)
- {
- LED1=1;
- break;//返回上一菜單
-
- }
- if(Status==VL53L0X_ERROR_NONE)
- {
- Status = vl53l0x_start_single_test(dev,&vl53l0x_data,buf);//執(zhí)行一次測量
- LCD_ShowString(85,140+70,200,16,16,(u8*)buf);
- LCD_ShowxNum(110,140+90,Distance_data,4,16,0);
- //printf("State;%i , %s\r\n",vl53l0x_data.RangeStatus,buf);//打印測量狀態(tài)
- printf("d: %4imm\r\n",Distance_data);//打印測量距離
- }
- i++;
- if(i==5)
- {
- i=0;
- LED1=!LED1;
- }
- delay_ms(50);
-
- }
-
- }
- //vl53l0x普通測量模式UI
- void general_ui(void)
- {
- LCD_Fill(30,140+20,300,300,WHITE);
- POINT_COLOR=RED; //設(shè)置字體為紅色
- LCD_ShowString(30,140+30,300,16,16,"General Mode ");
- LCD_ShowString(30,140+55,300,16,16,"KEY1: Switch working mode ");
- POINT_COLOR=BLUE; //設(shè)置字體為藍(lán)色
- LCD_ShowString(30,140+75,300,16,16, "KEY_UP: Return menu ");
- LCD_ShowString(30,140+95,300,16,16, "KEY0: Default ");
-
- }
- //vl53l0x普通測量模式測試
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- void vl53l0x_general_test(VL53L0X_Dev_t *dev)
- {
- u8 key=0;
- u8 i=0;
- u8 mode=0;
- LED1=1;
- general_ui();//顯示普通測量模式UI
-
- while(1)
- {
- key = KEY_Scan(0);
-
- if(key==WKUP_PRES) break;//返回主菜單
-
- else if(key==KEY1_PRES)//選擇工作模式
- {
- mode++;
- if(mode==4) mode=0;
- switch(mode)
- {
- case Default_Mode: LCD_ShowString(95,140+95,300,16,16, "Default "); break;//默認(rèn)
- case HIGH_ACCURACY: LCD_ShowString(95,140+95,300,16,16, "High Accuracy "); break;//高精度
- case LONG_RANGE: LCD_ShowString(95,140+95,300,16,16, "Long Range "); break;//長距離
- case HIGH_SPEED: LCD_ShowString(95,140+95,300,16,16, "High Speed "); break;//高速
- }
- }
- else if(key==KEY0_PRES)//啟動(dòng)測量
- {
- vl53l0x_general_start(dev,mode);
- general_ui();
- mode=0;
- }
- i++;
- if(i==5)
- {
- i=0;
- LED0=!LED0;
- }
- delay_ms(50);
- }
-
- }
復(fù)制代碼- #include "vl53l0x_it.h"
- //上下限距離值 單位:mm
- #define Thresh_Low 60
- #define Thresh_High 150
- //中斷模式參數(shù)結(jié)構(gòu)體
- typedef struct
- {
- const int VL53L0X_Mode;//模式
- uint32_t ThreshLow; //下限值
- uint32_t ThreshHigh; //上限值
- }AlrmMode_t;
- AlrmMode_t AlarmModes ={
-
- VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT,// value < thresh_low OR value > thresh_high
- Thresh_Low<<16,
- Thresh_High<<16
- };
- //中斷配置初始化
- static void exti_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復(fù)用功能時(shí)鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
- EXTI_InitStructure.EXTI_Line = EXTI_Line4;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿觸發(fā)
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按鍵WK_UP所在的外部中斷通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級2,
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優(yōu)先級3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
- NVIC_Init(&NVIC_InitStructure);
-
- }
- //警報(bào)標(biāo)志位 alarm_flag
- //1:有警報(bào)
- //0:無
- u8 alarm_flag=0;
- //外部中斷服務(wù)函數(shù)
- void EXTI4_IRQHandler(void)
- {
- alarm_flag=1;//標(biāo)志
- EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中斷標(biāo)志位
- }
- extern uint8_t AjustOK;
- extern mode_data Mode_data[];
- //vl53l0x中斷測量模式測試
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- //mode: 0:默認(rèn);1:高精度;2:長距離;3:高速
- void vl53l0x_interrupt_start(VL53L0X_Dev_t *dev,uint8_t mode)
- {
- uint8_t VhvSettings;
- uint8_t PhaseCal;
- uint32_t refSpadCount;
- uint8_t isApertureSpads;
- VL53L0X_RangingMeasurementData_t RangingMeasurementData;
- static char buf[VL53L0X_MAX_STRING_LENGTH];//測試模式字符串字符緩沖區(qū)
- VL53L0X_Error status=VL53L0X_ERROR_NONE;//工作狀態(tài)
- u8 key;
- exti_init();//中斷初始化
- LED0=1;
- mode_string(mode,buf);//顯示當(dāng)前配置的模式
- LCD_Fill(30,170,300,300,WHITE);
- POINT_COLOR=RED; //設(shè)置字體為紅色
- LCD_ShowString(30,140+30,300,16,16,"Interrupt Mode ");
- POINT_COLOR=BLUE; //設(shè)置字體為藍(lán)色
- LCD_ShowString(30,140+50,200,16,16,"KEY_UP: Exit the test ");
- LCD_ShowString(30,140+70,200,16,16,"Mode: ");
- LCD_ShowString(80,140+70,200,16,16,(u8*)buf);
- sprintf((char*)buf,"Thresh Low: %d mm ",Thresh_Low);
- LCD_ShowString(30,140+90,300,16,16,(u8*)buf);
- sprintf((char*)buf,"Thresh High: %d mm",Thresh_High);
- LCD_ShowString(30,140+110,300,16,16,(u8*)buf);
- LCD_ShowString(30,140+130,300,16,16,"Now value: mm");
-
- vl53l0x_reset(dev);//復(fù)位vl53l0x(頻繁切換工作模式容易導(dǎo)致采集距離數(shù)據(jù)不準(zhǔn),需加上這一代碼)
- status = VL53L0X_StaticInit(dev);
- if(status!=VL53L0X_ERROR_NONE) goto error;
- if(AjustOK!=0)//已校準(zhǔn)好了,寫入校準(zhǔn)值
- {
- status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount,Vl53l0x_data.isApertureSpads);//設(shè)定Spads校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings,Vl53l0x_data.PhaseCal);//設(shè)定Ref校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status=VL53L0X_SetOffsetCalibrationDataMicroMeter(dev,Vl53l0x_data.OffsetMicroMeter);//設(shè)定偏移校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status=VL53L0X_SetXTalkCompensationRateMegaCps(dev,Vl53l0x_data.XTalkCompensationRateMegaCps);//設(shè)定串?dāng)_校準(zhǔn)值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- }else
- {
- status = VL53L0X_PerformRefCalibration(dev, &VhvSettings, &PhaseCal);//Ref參考校準(zhǔn)
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_PerformRefSpadManagement(dev, &refSpadCount, &isApertureSpads);//執(zhí)行參考SPAD管理
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- }
- status = VL53L0X_SetDeviceMode(dev,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING);//使能連續(xù)測量模式
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(dev,Mode_data[mode].timingBudget);//設(shè)置內(nèi)部周期測量時(shí)間
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,1);//使能SIGMA范圍檢查
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//使能信號速率范圍檢查
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//設(shè)定SIGMA范圍
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//設(shè)定信號速率范圍范圍
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//設(shè)定完整測距最長時(shí)間
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod);//設(shè)定VCSEL脈沖周期
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod);//設(shè)定VCSEL脈沖周期范圍
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_StopMeasurement(dev);//停止測量
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetInterruptThresholds(dev,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,AlarmModes.ThreshLow, AlarmModes.ThreshHigh);//設(shè)定觸發(fā)中斷上、下限值
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_SetGpioConfig(dev,0,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,AlarmModes.VL53L0X_Mode,VL53L0X_INTERRUPTPOLARITY_LOW);//設(shè)定觸發(fā)中斷模式 下降沿
- if(status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- status = VL53L0X_ClearInterruptMask(dev,0);//清除VL53L0X中斷標(biāo)志位
-
- error://錯(cuò)誤信息
- if(status!=VL53L0X_ERROR_NONE)
- {
- print_pal_error(status);
- return ;
- }
- alarm_flag = 0;
- VL53L0X_StartMeasurement(dev);//啟動(dòng)測量
- while(1)
- {
- key = KEY_Scan(0);
- if(key==WKUP_PRES)
- {
- VL53L0X_ClearInterruptMask(dev,0);//清除VL53L0X中斷標(biāo)志位
- status = VL53L0X_StopMeasurement(dev); //停止測量
- LED1=1;
- break;//返回上一菜單
- }
- if(alarm_flag==1)//觸發(fā)中斷
- {
- alarm_flag=0;
- VL53L0X_GetRangingMeasurementData(dev,&RangingMeasurementData);//獲取測量距離,并且顯示距離
- printf("d: %3d mm\r\n",RangingMeasurementData.RangeMilliMeter);
- LCD_ShowxNum(110,140+130,RangingMeasurementData.RangeMilliMeter,4,16,0);
- delay_ms(70);
- VL53L0X_ClearInterruptMask(dev,0);//清除VL53L0X中斷標(biāo)志位
-
- }
- delay_ms(30);
- LED1=!LED1;
- }
-
- }
- //vl53l0x中斷測量模式UI
- void interrupt_ui(void)
- {
- LCD_Fill(30,140+20,300,300,WHITE);
- POINT_COLOR=RED; //設(shè)置字體為紅色
- LCD_ShowString(30,140+30,300,16,16,"Interrupt Mode ");
- LCD_ShowString(30,140+55,300,16,16,"KEY1: Switch working mode ");
- POINT_COLOR=BLUE; //設(shè)置字體為藍(lán)色
- LCD_ShowString(30,140+75,300,16,16, "KEY_UP: Return menu ");
- LCD_ShowString(30,140+95,300,16,16, "KEY0: Default ");
-
- }
- //vl53l0x中斷測量模式測試
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- void vl53l0x_interrupt_test(VL53L0X_Dev_t *dev)
- {
- u8 key=0;
- u8 i=0;
- u8 mode=0;
- LED1=1;
- interrupt_ui();//顯示中斷測量模式UI
-
- while(1)
- {
- key = KEY_Scan(0);
-
- if(key==WKUP_PRES) break;//返回主菜單
-
- else if(key==KEY1_PRES)//選擇工作模式
- {
- mode++;
- if(mode==4) mode=0;
-
- switch(mode)
- {
- case Default_Mode: LCD_ShowString(95,140+95,300,16,16, "Default "); break;//默認(rèn)
- case HIGH_ACCURACY: LCD_ShowString(95,140+95,300,16,16, "High Accuracy "); break;//高精度
- case LONG_RANGE: LCD_ShowString(95,140+95,300,16,16, "Long Range "); break;//長距離
- case HIGH_SPEED: LCD_ShowString(95,140+95,300,16,16, "High Speed "); break;//高速
- }
- }
- else if(key==KEY0_PRES)//啟動(dòng)測量
- {
- vl53l0x_interrupt_start(dev,mode);
- interrupt_ui();
- mode=0;
- }
- i++;
- if(i==5)
- {
- i=0;
- LED0=!LED0;
- }
- delay_ms(50);
- }
-
- }
復(fù)制代碼
- #include "vl53l0x.h"
- VL53L0X_Dev_t vl53l0x_dev;//設(shè)備I2C數(shù)據(jù)參數(shù)
- VL53L0X_DeviceInfo_t vl53l0x_dev_info;//設(shè)備ID版本信息
- uint8_t AjustOK=0;//校準(zhǔn)標(biāo)志位
- //VL53L0X各精度模式參數(shù)
- //0:默認(rèn);1:高精度;2:長距離;3:高速
- mode_data Mode_data[]=
- {
- {(FixPoint1616_t)(0.25*65536),
- (FixPoint1616_t)(18*65536),
- 33000,
- 14,
- 10},//默認(rèn)
-
- {(FixPoint1616_t)(0.25*65536) ,
- (FixPoint1616_t)(18*65536),
- 200000,
- 14,
- 10},//高精度
-
- {(FixPoint1616_t)(0.1*65536) ,
- (FixPoint1616_t)(60*65536),
- 33000,
- 18,
- 14},//長距離
-
- {(FixPoint1616_t)(0.25*65536) ,
- (FixPoint1616_t)(32*65536),
- 20000,
- 14,
- 10},//高速
-
- };
- //API錯(cuò)誤信息打印
- //Status:詳情看VL53L0X_Error參數(shù)的定義
- void print_pal_error(VL53L0X_Error Status)
- {
-
- char buf[VL53L0X_MAX_STRING_LENGTH];
-
- VL53L0X_GetPalErrorString(Status,buf);//根據(jù)Status狀態(tài)獲取錯(cuò)誤信息字符串
-
- printf("API Status: %i : %s\r\n",Status, buf);//打印狀態(tài)和錯(cuò)誤信息
-
- }
- //模式字符串顯示
- //mode:0-默認(rèn);1-高精度;2-長距離;3-高速
- void mode_string(u8 mode,char *buf)
- {
- switch(mode)
- {
- case Default_Mode: strcpy(buf,"Default"); break;
- case HIGH_ACCURACY: strcpy(buf,"High Accuracy"); break;
- case LONG_RANGE: strcpy(buf,"Long Range"); break;
- case HIGH_SPEED: strcpy(buf,"High Speed"); break;
- }
- }
- //配置VL53L0X設(shè)備I2C地址
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- //newaddr:設(shè)備新I2C地址
- VL53L0X_Error vl53l0x_Addr_set(VL53L0X_Dev_t *dev,uint8_t newaddr)
- {
- uint16_t Id;
- uint8_t FinalAddress;
- VL53L0X_Error Status = VL53L0X_ERROR_NONE;
- u8 sta=0x00;
-
- FinalAddress = newaddr;
-
- if(FinalAddress==dev->I2cDevAddr)//新設(shè)備I2C地址與舊地址一致,直接退出
- return VL53L0X_ERROR_NONE;
- //在進(jìn)行第一個(gè)寄存器訪問之前設(shè)置I2C標(biāo)準(zhǔn)模式(400Khz)
- Status = VL53L0X_WrByte(dev,0x88,0x00);
- if(Status!=VL53L0X_ERROR_NONE)
- {
- sta=0x01;//設(shè)置I2C標(biāo)準(zhǔn)模式出錯(cuò)
- goto set_error;
- }
- //嘗試使用默認(rèn)的0x52地址讀取一個(gè)寄存器
- Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
- if(Status!=VL53L0X_ERROR_NONE)
- {
- sta=0x02;//讀取寄存器出錯(cuò)
- goto set_error;
- }
- if(Id == 0xEEAA)
- {
- //設(shè)置設(shè)備新的I2C地址
- Status = VL53L0X_SetDeviceAddress(dev,FinalAddress);
- if(Status!=VL53L0X_ERROR_NONE)
- {
- sta=0x03;//設(shè)置I2C地址出錯(cuò)
- goto set_error;
- }
- //修改參數(shù)結(jié)構(gòu)體的I2C地址
- dev->I2cDevAddr = FinalAddress;
- //檢查新的I2C地址讀寫是否正常
- Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
- if(Status!=VL53L0X_ERROR_NONE)
- {
- sta=0x04;//新I2C地址讀寫出錯(cuò)
- goto set_error;
- }
- }
- set_error:
- if(Status!=VL53L0X_ERROR_NONE)
- {
- print_pal_error(Status);//打印錯(cuò)誤信息
- }
- if(sta!=0)
- printf("sta:0x%x\r\n",sta);
- return Status;
- }
- //vl53l0x復(fù)位函數(shù)
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- void vl53l0x_reset(VL53L0X_Dev_t *dev)
- {
- uint8_t addr;
- addr = dev->I2cDevAddr;//保存設(shè)備原I2C地址
- VL53L0X_Xshut=0;//失能VL53L0X
- delay_ms(30);
- VL53L0X_Xshut=1;//使能VL53L0X,讓傳感器處于工作(I2C地址會(huì)恢復(fù)默認(rèn)0X52)
- delay_ms(30);
- dev->I2cDevAddr=0x52;
- vl53l0x_Addr_set(dev,addr);//設(shè)置VL53L0X傳感器原來上電前原I2C地址
- VL53L0X_DataInit(dev);
- }
- //初始化vl53l0x
- //dev:設(shè)備I2C參數(shù)結(jié)構(gòu)體
- VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- VL53L0X_Error Status = VL53L0X_ERROR_NONE;
- VL53L0X_Dev_t *pMyDevice = dev;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能AFIO時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //先使能外設(shè)IO PORTA時(shí)鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOA
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,從而PA15可以做普通IO使用,否則PA15不能做普通IO!!!
-
- pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上電默認(rèn)0x52)
- pMyDevice->comms_type = 1; //I2C通信模式
- pMyDevice->comms_speed_khz = 400; //I2C通信速率
-
- VL53L0X_i2c_init();//初始化IIC總線
-
- VL53L0X_Xshut=0;//失能VL53L0X
- delay_ms(30);
- VL53L0X_Xshut=1;//使能VL53L0X,讓傳感器處于工作
- delay_ms(30);
-
- vl53l0x_Addr_set(pMyDevice,0x54);//設(shè)置VL53L0X傳感器I2C地址
- if(Status!=VL53L0X_ERROR_NONE) goto error;
- Status = VL53L0X_DataInit(pMyDevice);//設(shè)備初始化
- if(Status!=VL53L0X_ERROR_NONE) goto error;
- delay_ms(2);
- Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//獲取設(shè)備ID信息
- if(Status!=VL53L0X_ERROR_NONE) goto error;
-
- AT24CXX_Read(0,(u8*)&Vl53l0x_data,sizeof(_vl53l0x_adjust));//讀取24c02保存的校準(zhǔn)數(shù)據(jù),若已校準(zhǔn) Vl53l0x_data.adjustok==0xAA
- if(Vl53l0x_data.adjustok==0xAA)//已校準(zhǔn)
- AjustOK=1;
- else //沒校準(zhǔn)
- AjustOK=0;
-
- error:
- if(Status!=VL53L0X_ERROR_NONE)
- {
- print_pal_error(Status);//打印錯(cuò)誤信息
- return Status;
- }
-
- return Status;
- }
- //主菜單界面
- void vl53l0x_mtest_ui(void)
- {
- POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
- LCD_Fill(30,170,300,300,WHITE);
- LCD_ShowString(30,170,200,16,16,"KEY_UP: Calibration mode");//校準(zhǔn)模式
- LCD_ShowString(30,190,200,16,16,"KEY1: General mode"); //普通測量模式
- LCD_ShowString(30,210,200,16,16,"KEY0: Interrupt mode"); //中斷測量模式
- }
- //VL53L0X主測試程序
- void vl53l0x_test(void)
- {
- u8 i=0;
- u8 key=0;
- while(vl53l0x_init(&vl53l0x_dev))//vl53l0x初始化
- {
- LCD_ShowString(30,140,200,16,16,"VL53L0X Error!!!");
- delay_ms(500);
- LCD_ShowString(30,140,200,16,16," ");
- delay_ms(500);
- LED0=!LED0;//DS0閃爍
- }
- printf("VL53L0X OK\r\n");
- LCD_ShowString(30,140,200,16,16,"VL53L0X OK");
- vl53l0x_mtest_ui();//主菜單顯示
- while(1)
- {
-
- key = KEY_Scan(0);
- if(key)
- {
- switch(key)
- {
- case WKUP_PRES: vl53l0x_calibration_test(&vl53l0x_dev); break;//校準(zhǔn)模式
- case KEY1_PRES: vl53l0x_general_test(&vl53l0x_dev); break;//普通測量模式
- case KEY0_PRES: vl53l0x_interrupt_test(&vl53l0x_dev); break;//中斷測量模式
- }
- vl53l0x_mtest_ui();
- }
- i++;
- if(i==5)
- {
- i=0;
- LED0=!LED0;
- }
- delay_ms(50);
-
- }
- }
- //----------以下函數(shù)為USMART調(diào)用------------//
- //獲取vl53l0x傳感器ID信息
- void vl53l0x_info(void)
- {
- printf("\r\n-------vl53l0x傳感器設(shè)備信息-------\r\n\r\n");
- printf(" Name:%s\r\n",vl53l0x_dev_info.Name);
- printf(" Addr:0x%x\r\n",vl53l0x_dev.I2cDevAddr);
- printf(" ProductId:%s\r\n",vl53l0x_dev_info.ProductId);
- printf(" RevisionMajor:0x%x\r\n",vl53l0x_dev_info.ProductRevisionMajor);
- printf(" RevisionMinor:0x%x\r\n",vl53l0x_dev_info.ProductRevisionMinor);
- printf("\r\n-----------------------------------\r\n");
- }
- //獲取一次測量距離數(shù)據(jù)
- //mode模式配置 0:默認(rèn);1:高精度;2:長距離;3:高速
- void One_measurement(u8 mode)
- {
- vl53l0x_set_mode(&vl53l0x_dev,mode);
- VL53L0X_PerformSingleRangingMeasurement(&vl53l0x_dev,&vl53l0x_data);
- printf("\r\n d: %4d mm.\r\n",vl53l0x_data.RangeMilliMeter);
-
- }
復(fù)制代碼
全部資料51hei下載地址:
(標(biāo)準(zhǔn)庫版本,適合戰(zhàn)艦V3 STM32開發(fā)板)擴(kuò)展實(shí)驗(yàn)21 ATK-VL53L0X模塊實(shí)驗(yàn).rar
(497.84 KB, 下載次數(shù): 355)
2018-10-21 21:59 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|