stm32+LTR-390UV使用教程含源码

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灯光闪烁控制移动、计算和消费设备中显示面板的亮度和颜色。

一、硬件准备与连接

  1. 硬件清单

    • STM32开发板(如STM32F103C8T6、STM32L4等支持I2C接口的型号)

    • LTR-390UV传感器模块(支持I2C通信)

    • 杜邦线、上拉电阻(4.7kΩ,若模块未集成)

  2. 引脚连接
    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);

这里注意只能开启一种模式,开启光照模式就不能开启紫外线模式,数据手册里面有。

调试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式系统设计师】知识点:第2章 嵌入式系统硬件基础知识

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…

Java 项目灰度发布的详细实现与实践

前言 灰度发布是一种通过逐步将新功能或更新推向一部分用户来降低上线风险的技术。本文将详细介绍如何在 Java 项目中实现灰度发布&#xff0c;并提供相关的配置参数、代码示例以及 uml 图&#xff0c;帮助您更好地理解和应用这一技术。 一、灰度发布的核心思想 灰度发布的核…

使用 Swift 实现 LRU 缓存淘汰策略

&#x1f4cc; 实现思路 一、核心目标 我们要实现一个缓存类&#xff1a; 支持通过 get(key) 获取缓存的值&#xff1b;支持通过 put(key, value) 写入缓存&#xff1b;缓存容量有限&#xff0c;当超过容量时要淘汰最久未使用的元素。 二、为什么用「哈希表 双向链表」 功…

C#中为自定义控件设置工具箱图标

在C#中为自定义控件设置工具箱图标&#xff0c;可通过以下步骤实现&#xff1a; ### 步骤说明&#xff1a; 1. **准备图标文件** - 创建或选择一个16x16像素的位图&#xff08;.bmp&#xff09;文件&#xff0c;建议使用透明背景以确保清晰显示。 2. **添加位图到项目** -…

Linux数据库:【数据库基础】【库的操作】【表的操作】

目录 一.数据库基础 1.1什么是数据库 1.2基本使用 1.2.1连接服务器 1.2.2服务器&#xff0c;数据库&#xff0c;表关系 1.2.3使用案例 1.2.4数据存储结构 ​编辑 1.3MySQL架构 1.4SQL分类 1.5存储引擎 1.5.1什么是存储引擎 1.5.2查看存储引擎 ​编辑 1.5.3存储引擎…

CKPT文件是什么?

检查点&#xff08;Checkpoint&#xff0c;简称ckpt&#xff09;是一种用于记录系统状态或数据变化的技术&#xff0c;广泛应用于数据库管理、机器学习模型训练、并行计算以及网络安全等领域。以下将详细介绍不同领域中ckpt检查点的定义、功能和应用场景。 数据库中的ckpt检查点…

Redis的公共操作命令

目录 1.Key操作命令1.1 keys *1.2 exists <key]>1.3 type <key>1.4 del <key>1.5 unlink <key>1.6 ttl <key>1.7 expire <key> <秒数>1.8 move <key> <index> 2.库操作命令2.1 select <index>2.2 dbsize2.3 flush…

【LLM】使用MySQL MCP Server让大模型轻松操作本地数据库

随着MCP协议&#xff08;Model Context Protocol&#xff09;的出现&#xff0c;使得 LLM 应用与外部数据源和工具之间的无缝集成成为可能&#xff0c;本章就介绍如何通过MCP Server让LLM能够直接与本地的MySQL数据库进行交互&#xff0c;例如新增、修改、删除数据&#xff0c;…

【C++】从零实现Json-Rpc框架(2)

目录 JsonCpp库 1.1- Json数据格式 1.2 - JsonCpp介绍 • 序列化接口 • 反序列化接口 1.3 - Json序列化实践 JsonCpp使用 Muduo库 2.1 - Muduo库是什么 2.2 - Muduo库常见接口介绍 TcpServer类基础介绍 EventLoop类基础介绍 TcpConnection类基础介绍 TcpClient…

语文常识推翻百年“R完备、封闭”论

​语文常识推翻百年“R完备、封闭”论 黄小宁 李四光&#xff1a;迷信权威等于扼杀智慧。语文常识表明从西方传进来的数学存在重大错误&#xff1a;将无穷多各异数轴误为同一轴。 复平面z各点z的对应点zk的全体是zk平面。z面平移变换为zk&#xff08;k是非1正实常数&#xf…

【Vue】 核心特性实战解析:computed、watch、条件渲染与列表渲染

目录 一、计算属性&#xff08;computed&#xff09; ✅ 示例&#xff1a; 计算属性-methods实现&#xff1a;在插值模块里&#xff0c;实现函数的调用功能 计算属性-computed的实现&#xff1a; 计算属性-简写&#xff1a; ✅ 特点&#xff1a; ⚠️ 与 methods 的区别…

二叉树 递归

本篇基于b站灵茶山艾府的课上例题与课后作业。 104. 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…

与 AI 共舞:解锁自我提升的无限可能

与 AI 共舞&#xff1a;解锁自我提升的无限可能 在数字化浪潮的汹涌冲击下&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度重塑着世界的每一个角落。从日常生活的点滴便利到复杂工作的高效推进&#xff0c;AI 的力量无处不在。然而&#xff0c;面对 AI 的强…

【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析

【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析 简述一、引言1.1 研究背景1.2 研究目的与意义1.3 国内外研究现状1.4 研究方法与创新点二、局域网网络安全基础理论2.1 局域网概述2.1.1 局域网的定义与特点2.1.2 局域网的常见拓扑结构2.2 网络安全基本概念2.2.1 网络…

MoE Align Sort在医院AI医疗领域的前景分析(代码版)

MoE Align & Sort技术通过优化混合专家模型(MoE)的路由与计算流程,在医疗数据处理、模型推理效率及多模态任务协同中展现出显著优势,其技术价值与应用意义从以下三方面展开分析: 一、方向分析 1、提升医疗数据处理效率 在医疗场景中,多模态数据(如医学影像、文本…

[ctfshow web入门] web4

前置知识 robots.txt是机器人协议&#xff0c;在使用爬虫爬取网站内容时应该遵循的协议。协议并不能阻止爬虫爬取&#xff0c;更像是一种道德规范。 假设robots.txt中写道 Disallow: /admind.php&#xff0c;那我就暴露了自己的后台&#xff0c;这属于信息泄漏&#xff0c;攻击…

innodb如何实现mvcc的

InnoDB 实现 MVCC&#xff08;多版本并发控制&#xff09;的机制主要依赖于 Undo Log&#xff08;回滚日志&#xff09;、Read View&#xff08;读视图&#xff09; 和 隐藏的事务字段。以下是具体实现步骤和原理&#xff1a; 1. 核心数据结构 InnoDB 的每一行数据&#xff08…

coding ability 展开第九幕(位运算——进阶篇)超详细!!!!

文章目录 前言丢失的数字两整数之和只出现一次的数字II消失的两个数字总结 前言 上一篇博客&#xff0c;我们已经把位运算的基础知识&#xff0c;以及基本运算都掌握啦 上次的习题还是让人意犹未尽&#xff0c;今天我们来尝试一下难一点的题目 位运算熟练起来真的让人觉得做题是…

【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林

文章目录 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 一、 什么是算法1. 算法的定义1.1 算法的五个特征1.2 好算法的特质 2. 时间复杂度3. 空间复杂度 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 &#x1f4ac;欢…

Logo语言的系统监控

Logo语言的系统监控 引言 在信息技术飞速发展的时代&#xff0c;系统监控成为了确保计算机系统和网络平稳运行的重要手段。系统监控不仅可以实时跟踪系统的性能、资源使用情况和安全风险等&#xff0c;还能够在出现问题时及时发出警报&#xff0c;从而避免潜在的故障和损失。…