stm32+LTR-390UV使用教程含源码 (csdn首发源码),本人大四学生,考研已上岸,毕设做的全向轮小车,这个是环境检测部分LTR-390UV使用教程
文章目录
目录
这里注意只能开启一种模式,开启光照模式就不能开启紫外线模式,数据手册里面有。
前言
描述特性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, // 400ms
LTR390_RES_19BIT = 0x10, // 200ms
LTR390_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) {
// 检查器件ID
if(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原始数据并转换为Lux
uint32_t als_raw = LTR390_Read_ALS();
float lux =(als_raw*0.6)/(3);
// 读取UVS原始数据并转换为UVI
uint32_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, // 400ms
LTR390_RES_19BIT = 0x10, // 200ms
LTR390_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); // 发送NACK
I2C_Stop();
return data;
}
// 初始化传感器
uint8_t LTR390_Init(LTR390_Mode mode, LTR390_Resolution res, LTR390_Gain gain) {
// 检查器件ID
if(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原始数据并转换为Lux
uint32_t als_raw = LTR390_Read_ALS();
float lux =(als_raw*0.6)/(3);
// 读取UVS原始数据并转换为UVI
uint32_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);