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.pswp.cn/news/900239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900239.shtml
英文地址,請注明出處:http://en.pswp.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;從而避免潛在的故障和損失。…