欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
VL53L0 STM32源碼下載
[打印本頁]
作者:
slt2011
時間:
2019-1-25 10:01
標題:
VL53L0 STM32源碼下載
(標準庫版本,適合MiniV3開發板)擴展實驗21 ATK-VL53L0X模塊實驗
單片機源程序如下:
#include "vl53l0x.h"
VL53L0X_Dev_t vl53l0x_dev;//設備I2C數據參數
VL53L0X_DeviceInfo_t vl53l0x_dev_info;//設備ID版本信息
uint8_t AjustOK=0;//校準標志位
//VL53L0X各測量模式參數
//0:默認;1:高精度;2:長距離;3:高速
mode_data Mode_data[]=
{
{(FixPoint1616_t)(0.25*65536),
(FixPoint1616_t)(18*65536),
33000,
14,
10},//默認
{(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錯誤信息打印
//Status:詳情看VL53L0X_Error參數的定義
void print_pal_error(VL53L0X_Error Status)
{
char buf[VL53L0X_MAX_STRING_LENGTH];
VL53L0X_GetPalErrorString(Status,buf);//根據Status狀態獲取錯誤信息字符串
printf("API Status: %i : %s\r\n",Status, buf);//打印狀態和錯誤信息
}
//模式字符串顯示
//mode:0-默認;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設備I2C地址
//dev:設備I2C參數結構體
//newaddr:設備新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)//新設備I2C地址與舊地址一致,直接退出
return VL53L0X_ERROR_NONE;
//在進行第一個寄存器訪問之前設置I2C標準模式(400Khz)
Status = VL53L0X_WrByte(dev,0x88,0x00);
if(Status!=VL53L0X_ERROR_NONE)
{
sta=0x01;//設置I2C標準模式出錯
goto set_error;
}
//嘗試使用默認的0x52地址讀取一個寄存器
Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
if(Status!=VL53L0X_ERROR_NONE)
{
sta=0x02;//讀取寄存器出錯
goto set_error;
}
if(Id == 0xEEAA)
{
//設置設備新的I2C地址
Status = VL53L0X_SetDeviceAddress(dev,FinalAddress);
if(Status!=VL53L0X_ERROR_NONE)
{
sta=0x03;//設置I2C地址出錯
goto set_error;
}
//修改參數結構體的I2C地址
dev->I2cDevAddr = FinalAddress;
//檢查新的I2C地址讀寫是否正常
Status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Id);
if(Status!=VL53L0X_ERROR_NONE)
{
sta=0x04;//新I2C地址讀寫出錯
goto set_error;
}
}
set_error:
if(Status!=VL53L0X_ERROR_NONE)
{
print_pal_error(Status);//打印錯誤信息
}
if(sta!=0)
printf("sta:0x%x\r\n",sta);
return Status;
}
//vl53l0x復位函數
//dev:設備I2C參數結構體
void vl53l0x_reset(VL53L0X_Dev_t *dev)
{
uint8_t addr;
addr = dev->I2cDevAddr;//保存設備原I2C地址
VL53L0X_Xshut=0;//失能VL53L0X
delay_ms(30);
VL53L0X_Xshut=1;//使能VL53L0X,讓傳感器處于工作(I2C地址會恢復默認0X52)
delay_ms(30);
dev->I2cDevAddr=0x52;
vl53l0x_Addr_set(dev,addr);//設置VL53L0X傳感器原來上電前原I2C地址
VL53L0X_DataInit(dev);
}
//初始化vl53l0x
//dev:設備I2C參數結構體
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_GPIOA,ENABLE); //先使能外設IO PORTA時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化GPIOA
pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上電默認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);//設置VL53L0X傳感器I2C地址
if(Status!=VL53L0X_ERROR_NONE) goto error;
Status = VL53L0X_DataInit(pMyDevice);//設備初始化
if(Status!=VL53L0X_ERROR_NONE) goto error;
delay_ms(2);
Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//獲取設備ID信息
if(Status!=VL53L0X_ERROR_NONE) goto error;
AT24CXX_Read(0,(u8*)&Vl53l0x_data,sizeof(_vl53l0x_adjust));//讀取24c02保存的校準數據,若已校準 Vl53l0x_data.adjustok==0xAA
if(Vl53l0x_data.adjustok==0xAA)//已校準
AjustOK=1;
else //沒校準
AjustOK=0;
error:
if(Status!=VL53L0X_ERROR_NONE)
{
print_pal_error(Status);//打印錯誤信息
return Status;
}
return Status;
}
//主菜單界面
void vl53l0x_mtest_ui(void)
{
POINT_COLOR=BLUE;//設置字體為藍色
LCD_Fill(30,170,300,300,WHITE);
LCD_ShowString(30,170,200,16,16,"KEY_UP: Calibration mode");//校準模式
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;//校準模式
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);
}
}
//----------以下函數為USMART調用------------//
//獲取vl53l0x傳感器ID信息
void vl53l0x_info(void)
{
printf("\r\n-------vl53l0x傳感器設備信息-------\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");
}
//獲取一次測量距離數據
//mode模式配置 0:默認;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);
}
復制代碼
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "24cxx.h"
#include "myiic.h"
#include "usmart.h"
#include "vl53l0x.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組2
delay_init(); //延時函數初始化
uart_init(115200); //串口初始化為115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化與LED連接的硬件接口
LCD_Init(); //LCD初始化
KEY_Init(); //按鍵初始化
AT24CXX_Init(); //IIC初始化
POINT_COLOR=RED; //設置字體為紅色
LCD_ShowString(30,50,200,16,16,"Mini STM32");
LCD_ShowString(30,70,200,16,16,"Sensor VL53L0X TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2017/6/25");
POINT_COLOR=BLUE;//設置字體為藍色
while(AT24CXX_Check())//檢測不到24c02
{
LCD_ShowString(30,150,200,16,16,"24C02 Check Failed!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0閃爍
}
while(1)
{
vl53l0x_test();//vl53l0x測試
}
}
復制代碼
所有資料51hei提供下載:
(標準庫版本,適合MiniV3開發板)擴展實驗21 ATK-VL53L0X模塊實驗.7z
(315.91 KB, 下載次數: 20)
2019-1-25 14:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1