stm32+LTR-390UV使用教程含源碼 (csdn首發源碼),本人大四學生,考研已上岸,畢設做的全向輪小車,這個是環境檢測部分LTR-390UV使用教程
文章目錄
目錄
文章目錄
前言
一、硬件準備與連接
二、數據手冊
1.初始化
初始化源碼:
數據讀取
源碼:
參數計算:
源碼:
總體代碼:小伙伴直接移植即可
IIC驅動程序,軟件IIC:
驅動代碼:
這里注意只能開啟一種模式,開啟光照模式就不能開啟紫外線模式,數據手冊里面有。
調試:
前言
描述特性LTR-390UV-01是一個集成的低壓I2C環境光傳感器(ALS)和紫外光傳感器(UVS)在一個微型2x2mm的無鉛表面貼裝封裝。IPC接口支持標準模式100khz或快速模式400khz通信;1.8V邏輯兼容該傳感器將光強度轉換為能夠直接I2C接口的數字輸出信號。它在寬動態范圍內提供線性ALS響應,非常適合高環境亮度下的應用。環境光/紫外線(UVS)技術在一個超小型2x2mm chippled封裝非常低的功耗與睡眠模式的能力工作電壓范圍:1.7V ~ 3.6V工作溫度范圍:-40℃~ +85℃傳感器具有可編程中斷,具有響應事件的滯后,從而消除了輪詢傳感器讀取的需要,從而提高了系統效率。這種CMOS設計和工廠設置的一次性修剪能力確保最小的傳感器到傳感器的變化,便于最終客戶的可制造性。內置溫度補償電路可編程中斷功能的ALS, UVS與上下閾值符合RoHS和無鹵標準uv / ALS特性13 ~ 20位有效分辨率寬動態范圍1:18萬,線性響應接近人眼的光譜反應應用程序識別環境光線中的紫外線指數可以幫助人們有效地保護自己免受曬傷、癌癥或眼睛損傷。自動抑制50Hz/60Hz燈光閃爍控制移動、計算和消費設備中顯示面板的亮度和顏色。
一、硬件準備與連接
-
硬件清單
-
STM32開發板(如STM32F103C8T6、STM32L4等支持I2C接口的型號)
-
LTR-390UV傳感器模塊(支持I2C通信)
-
杜邦線、上拉電阻(4.7kΩ,若模塊未集成)
-
-
引腳連接
LTR-390UV的I2C接口通常為:-
SDA:連接STM32的I2C數據線(如PB7或PB9)
-
SCL:連接STM32的I2C時鐘線(如PB6或PB8)
-
VCC:3.3V電源
-
GND:共地
-
ADDR:地址選擇引腳(懸空或接地,默認I2C地址為0x53)
注意:若I2C總線未集成上拉電阻,需在SDA和SCL線添加外部4.7kΩ上拉電阻至3.3V78。
-
二、數據手冊
1.初始化
這個是模式選擇寄存器
這個是速率配置寄存器
這個是增益配置寄存器
初始化流程自己翻譯看
初始化源碼:
#define LTR390_ADDR 0x53 // 7位I2C地址
#define LTR390_PART_ID 0xB2 // 器件ID值// 寄存器地址
#define LTR390_MAIN_CTRL 0x00
#define LTR390_MEAS_RATE 0x04
#define LTR390_GAIN 0x05
#define LTR390_PART_ID_REG 0x06
#define LTR390_MAIN_STATUS 0x07
#define LTR390_ALS_DATA_0 0x0D
#define LTR390_ALS_DATA_1 0x0E
#define LTR390_ALS_DATA_2 0x0F
#define LTR390_UVS_DATA_0 0x10
#define LTR390_UVS_DATA_1 0x11
#define LTR390_UVS_DATA_2 0x12// 工作模式
typedef enum {LTR390_MODE_ALS = 0, // 環境光模式LTR390_MODE_UVS = 1 // 紫外線模式
} LTR390_Mode;// 分辨率設置
typedef enum {LTR390_RES_20BIT = 0x00, // 400msLTR390_RES_19BIT = 0x10, // 200msLTR390_RES_18BIT = 0x20, // 100ms (默認)LTR390_RES_17BIT = 0x30,LTR390_RES_16BIT = 0x40,LTR390_RES_13BIT = 0x50
} LTR390_Resolution;// 增益設置
typedef enum {LTR390_GAIN_1 = 0x00,LTR390_GAIN_3 = 0x01, // 默認LTR390_GAIN_6 = 0x02,LTR390_GAIN_9 = 0x03,LTR390_GAIN_18 = 0x04
} LTR390_Gain;// 初始化傳感器
uint8_t LTR390_Init(LTR390_Mode mode, LTR390_Resolution res, LTR390_Gain gain) {// 檢查器件IDif(LTR390_CheckID() != LTR390_PART_ID) return 0;// 配置測量速率和分辨率LTR390_WriteReg(LTR390_MEAS_RATE, res | 0x02); // 默認100ms測量周期// 配置增益LTR390_WriteReg(LTR390_GAIN, gain);// 配置主控制寄存器uint8_t ctrl = 0;ctrl |= (mode << 3); // 設置模式ctrl |= 0x02; // 啟用傳感器LTR390_WriteReg(LTR390_MAIN_CTRL, ctrl);return 1;
}
數據讀取
源碼:
// 讀取環境光數據
uint32_t LTR390_Read_ALS(void) {uint32_t data = 0;data = LTR390_ReadReg(LTR390_ALS_DATA_2) << 16;data |= LTR390_ReadReg(LTR390_ALS_DATA_1) << 8;data |= LTR390_ReadReg(LTR390_ALS_DATA_0);return data;
}// 讀取紫外線數據
uint32_t LTR390_Read_UVS(void) {uint32_t data = 0;data = LTR390_ReadReg(LTR390_UVS_DATA_2) << 16;data |= LTR390_ReadReg(LTR390_UVS_DATA_1) << 8;data |= LTR390_ReadReg(LTR390_UVS_DATA_0);return data;
}// 檢查器件ID
uint8_t LTR390_CheckID(void) {return LTR390_ReadReg(LTR390_PART_ID_REG);
}
參數計算:
源碼:
void LTR_390UV_sensor(void)
{// 讀取ALS原始數據并轉換為Luxuint32_t als_raw = LTR390_Read_ALS();float lux =(als_raw*0.6)/(3);// 讀取UVS原始數據并轉換為UVIuint32_t uvs_raw = LTR390_Read_UVS();//printf("uvs_raw=%d\r\n",uvs_raw/1810);//float uvi = (uvs_raw/1810);//printf("lux=%.2f\r\n",lux);printf("uvi=%d\r\n",uvs_raw);}
總體代碼:小伙伴直接移植即可
IIC驅動程序,軟件IIC:
#ifndef __MYI2C_H
#define __MYI2C_H
#include "main.h"uint8_t MyI2C_R_SDA(void);
void I2C_Start(void);
void I2C_Stop(void);
void MyI2C_SendAck(uint8_t AckBit);
uint8_t I2C_Wait_Ack(void);
void I2C_Send_Byte(uint8_t Byte);
uint8_t I2C_Read_Byte_AckBit(uint8_t AckBit);
uint8_t I2C_Read_Byte(void);#endif
#include "stm32g4xx_hal.h"
#include "Delay.h"void MyI2C_W_SCL(uint8_t BitValue)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, (GPIO_PinState)BitValue); Delay_us(2);
}void MyI2C_W_SDA(uint8_t BitValue)
{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, (GPIO_PinState)BitValue); Delay_us(2);
}uint8_t MyI2C_R_SDA(void)
{uint8_t BitValue;BitValue = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8);Delay_us(5);return BitValue;
}void MyI2C_Init(void)
{
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//
// GPIO_InitTypeDef GPIO_InitStructure;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//
// GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
}void I2C_Start(void)
{MyI2C_W_SDA(1);MyI2C_W_SCL(1);MyI2C_W_SDA(0);MyI2C_W_SCL(0);
}void I2C_Stop(void)
{MyI2C_W_SDA(0);MyI2C_W_SCL(1);MyI2C_W_SDA(1);
}void MyI2C_SendAck(uint8_t AckBit)
{MyI2C_W_SDA(AckBit);MyI2C_W_SCL(1);MyI2C_W_SCL(0);
}uint8_t I2C_Wait_Ack(void)
{uint8_t AckBit;MyI2C_W_SDA(1);MyI2C_W_SCL(1);AckBit = MyI2C_R_SDA();MyI2C_W_SCL(0);return AckBit;
}void I2C_Send_Byte(uint8_t Byte)
{uint8_t i;for (i = 0; i < 8; i ++){MyI2C_W_SDA(Byte & (0x80 >> i));MyI2C_W_SCL(1);MyI2C_W_SCL(0);}
}uint8_t I2C_Read_Byte_AckBit(uint8_t AckBit)
{uint8_t i, Byte = 0x00;MyI2C_W_SDA(1);for (i = 0; i < 8; i ++){MyI2C_W_SCL(1);if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}MyI2C_W_SCL(0);}MyI2C_SendAck(AckBit);return Byte;
}uint8_t I2C_Read_Byte(void)
{uint8_t i, Byte = 0x00;MyI2C_W_SDA(1);for (i = 0; i < 8; i ++){MyI2C_W_SCL(1);if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}MyI2C_W_SCL(0);}return Byte;
}
驅動代碼:
#ifndef __LTR_390UV_H
#define __LTR_390UV_H#include "main.h"/* LTR-390UV 驅動頭文件 ltr390.h */#define LTR390_ADDR 0x53 // 7位I2C地址
#define LTR390_PART_ID 0xB2 // 器件ID值// 寄存器地址
#define LTR390_MAIN_CTRL 0x00
#define LTR390_MEAS_RATE 0x04
#define LTR390_GAIN 0x05
#define LTR390_PART_ID_REG 0x06
#define LTR390_MAIN_STATUS 0x07
#define LTR390_ALS_DATA_0 0x0D
#define LTR390_ALS_DATA_1 0x0E
#define LTR390_ALS_DATA_2 0x0F
#define LTR390_UVS_DATA_0 0x10
#define LTR390_UVS_DATA_1 0x11
#define LTR390_UVS_DATA_2 0x12// 工作模式
typedef enum {LTR390_MODE_ALS = 0, // 環境光模式LTR390_MODE_UVS = 1 // 紫外線模式
} LTR390_Mode;// 分辨率設置
typedef enum {LTR390_RES_20BIT = 0x00, // 400msLTR390_RES_19BIT = 0x10, // 200msLTR390_RES_18BIT = 0x20, // 100ms (默認)LTR390_RES_17BIT = 0x30,LTR390_RES_16BIT = 0x40,LTR390_RES_13BIT = 0x50
} LTR390_Resolution;// 增益設置
typedef enum {LTR390_GAIN_1 = 0x00,LTR390_GAIN_3 = 0x01, // 默認LTR390_GAIN_6 = 0x02,LTR390_GAIN_9 = 0x03,LTR390_GAIN_18 = 0x04
} LTR390_Gain;uint8_t LTR390_Init(LTR390_Mode mode, LTR390_Resolution res, LTR390_Gain gain);
uint32_t LTR390_Read_ALS(void);
uint32_t LTR390_Read_UVS(void);
uint8_t LTR390_CheckID(void);void LTR_390UV_sensor(void);
#endif
#include "LTR_390UV.h"
/* LTR-390UV 驅動源文件 ltr390.c */// 寫入寄存器
static void LTR390_WriteReg(uint8_t reg, uint8_t data) {I2C_Start();I2C_Send_Byte(LTR390_ADDR << 1); // 寫地址I2C_Wait_Ack();I2C_Send_Byte(reg); // 寄存器地址I2C_Wait_Ack();I2C_Send_Byte(data); // 數據I2C_Wait_Ack();I2C_Stop();
}// 讀取寄存器
static uint8_t LTR390_ReadReg(uint8_t reg) {uint8_t data;I2C_Start();I2C_Send_Byte(LTR390_ADDR << 1); // 寫地址I2C_Wait_Ack();I2C_Send_Byte(reg); // 寄存器地址I2C_Wait_Ack();I2C_Start(); // 重復起始條件I2C_Send_Byte((LTR390_ADDR << 1) | 1); // 讀地址I2C_Wait_Ack();data = I2C_Read_Byte(); // 讀取數據MyI2C_SendAck(1); // 發送NACKI2C_Stop();return data;
}// 初始化傳感器
uint8_t LTR390_Init(LTR390_Mode mode, LTR390_Resolution res, LTR390_Gain gain) {// 檢查器件IDif(LTR390_CheckID() != LTR390_PART_ID) return 0;// 配置測量速率和分辨率LTR390_WriteReg(LTR390_MEAS_RATE, res | 0x02); // 默認100ms測量周期// 配置增益LTR390_WriteReg(LTR390_GAIN, gain);// 配置主控制寄存器uint8_t ctrl = 0;ctrl |= (mode << 3); // 設置模式ctrl |= 0x02; // 啟用傳感器LTR390_WriteReg(LTR390_MAIN_CTRL, ctrl);return 1;
}// 讀取環境光數據
uint32_t LTR390_Read_ALS(void) {uint32_t data = 0;data = LTR390_ReadReg(LTR390_ALS_DATA_2) << 16;data |= LTR390_ReadReg(LTR390_ALS_DATA_1) << 8;data |= LTR390_ReadReg(LTR390_ALS_DATA_0);return data;
}// 讀取紫外線數據
uint32_t LTR390_Read_UVS(void) {uint32_t data = 0;data = LTR390_ReadReg(LTR390_UVS_DATA_2) << 16;data |= LTR390_ReadReg(LTR390_UVS_DATA_1) << 8;data |= LTR390_ReadReg(LTR390_UVS_DATA_0);return data;
}// 檢查器件ID
uint8_t LTR390_CheckID(void) {return LTR390_ReadReg(LTR390_PART_ID_REG);
}void LTR_390UV_sensor(void)
{// 讀取ALS原始數據并轉換為Luxuint32_t als_raw = LTR390_Read_ALS();float lux =(als_raw*0.6)/(3);// 讀取UVS原始數據并轉換為UVIuint32_t uvs_raw = LTR390_Read_UVS();//printf("uvs_raw=%d\r\n",uvs_raw/1810);//float uvi = (uvs_raw/1810);//printf("lux=%.2f\r\n",lux);printf("uvi=%d\r\n",uvs_raw);}// 初始化LTR-390UV:UVS模式,18位分辨率,3倍增益
// LTR390_Init(LTR390_MODE_UVS, LTR390_RES_18BIT, LTR390_GAIN_3);