嵌入式系统应用-LVGL的应用-智能时钟 part 3

智能时钟 part 3

  • 6 光强传感器
    • 6.1 光敏电阻介绍
    • 6.2 电路图介绍
  • 7 ADC模块
    • 7.1 ADC模块介绍
    • 7.2 adc 转化流程
    • 7.3 规则通道和注入通道
    • 7.4 DMA 搬运
    • 7.5 TIM触发ADC和DMA搬运数据的原理
  • 8 代码
    • 8.1 配置头文件
    • 8.2 初始化ADC 和DMA
    • 8.3 创建线程读取 值
    • 8.4 演示效果

由于丢失温湿度传感器 DHT11,临时加成光强检测,检测结果用湿度指示器来显示。

6 光强传感器

6.1 光敏电阻介绍

‌光敏电阻(photoresistor或light-dependent resistor,缩写为LDR)是一种基于内光电效应的半导体元件,其阻值依赖于入射光强的变化。‌当入射光强增加时,光敏电阻的阻值减小;反之,入射光强减弱时,其阻值增大。光敏电阻没有极性,使用时在其两端施加一个任意方向的外加电压,通过测量回路中的电流大小可以反映入射光的强弱。‌

工作原理
光敏电阻的工作原理基于半导体的内光电效应。在黑暗条件下,光敏电阻内部的大部分电子是不能自由移动的价带电子,此时光敏电阻的阻值很高。当存在波长合适的光照时,光敏电阻内的价带电子会吸收光子能量跃迁到导带,成为可以导电的自由电子,并在价带中留下一个空穴。光强越大,激发的电子-空穴对数量越多,光敏电阻的阻值也就越低。当光被移除时,导带电子与价带空穴重新结合,光敏电阻的阻值增加。

应用领域
光敏电阻具有灵敏度高、响应速度快、稳定性好的优点,因此广泛应用于光的测量、光的控制和光电转换等领域。常见的应用包括紫外线探测器、红外线探测器、自动调光系统、烟雾报警器等。

6.2 电路图介绍

在这里插入图片描述
对应IO口: PF7口

在这里插入图片描述

7 ADC模块

7.1 ADC模块介绍

ADC是英文Analog Digital Converter,直译的意思就是模数转换器.它是一种能将一定范围内的模拟电压量转换为数字信号量的设备。stm32单片机内部内置了ADC

任何测量仪器都有测量范围。单片机内置的ADC测量范围是0-Vref。Vref一般可以是一个引脚。这里Vref直接接在了VDD上,因此测量范围0-3v3。

7.2 adc 转化流程

单次转换模式的规则通道

  1. 转换数据被储存在ADC_DR寄存器中
  2. EOC(转换结束)标志位被标志
  3. 如果设置了EOCIE,则产生中断

单次转换模式的注入通道

  1. 存储特定的ADC_DRJx寄存器中(每一个通道单独分配了一个寄存器)
  2. 转换结束的标志位为JEOC
  3. 中断标志位为JEOCIE

循环转换模式

循环转换模式则在这一次转换结束后立马启动下一次转换
在这里插入图片描述

7.3 规则通道和注入通道

规则通道:用于常规的数据采集,通常用于采集主要的输入信号
注入通道:是一种特殊的输入通道,比规则通道有着更高的优先级

7.4 DMA 搬运

DMA(Direct Memory Access)控制器可以在不占用CPU资源的情况下,在外设和内存之间搬运数据。使用DMA来搬运ADC数据有以下优点:

减轻CPU负担:CPU无需介入每次数据传输,可以专注于其他任务。
提高数据传输效率:DMA可以以更快的速度搬运数据,适合高速采样的应用。
减少延迟:DMA传输数据时延更低,适合实时性要求高的场合。

以下是一些适合使用DMA的情况:

需要频繁和大批量的数据采集和传输。
CPU需要执行其他高优先级任务,不适合频繁处理中断。
系统需要高实时性,低延迟的数据处理。

在这里插入图片描述

7.5 TIM触发ADC和DMA搬运数据的原理

STM32F103的TIM、ADC和DMA之间可以通过事件控制器(Event Controller)建立联系。当TIM的输出比较事件发生时,可以产生一个触发信号,这个信号可以用来启动ADC的转换过程。然后,DMA控制器可以将ADC转换后的数据搬运到内存中。具体流程如下:

配置TIM,使其在特定时间间隔生成输出比较事件。
配置ADC,使其在接收到TIM的触发信号后开始采集。
配置DMA,使其在ADC采集到数据后将数据搬运到内存。

8 代码

8.1 配置头文件

#ifndef __ADC_H
#define __ADC_H#include "stm32f4xx.h"#define ADCx_CLK RCC_APB2Periph_ADC3#define ADCx_CHANNEL_GPIO_CLK RCC_AHB1Periph_GPIOF#define GPIO_PIN  GPIO_Pin_7#define GPIO_PORT GPIOF#define DMA_CHANNELx  DMA_Channel_2#define ADCx_DR_ADDRESS   (&ADC3->DR)#define  DMA_STREAMx DMA2_Stream1#define ADCx ADC3#define ADC_CHANNEL ADC_Channel_5void ADC_Config(void);extern __IO uint16_t uhADCxConvertedValue;#endif

8.2 初始化ADC 和DMA

__IO uint16_t uhADCxConvertedValue = 0;
__IO uint32_t uwADCxConvertedVoltage = 0;static void ADC_Config(void)
{ADC_InitTypeDef       ADC_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;DMA_InitTypeDef       DMA_InitStructure;GPIO_InitTypeDef      GPIO_InitStructure;/* Enable ADCx, DMA and GPIO clocks ****************************************/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);RCC_AHB1PeriphClockCmd(ADCx_CHANNEL_GPIO_CLK, ENABLE);  RCC_APB2PeriphClockCmd(ADCx_CLK, ENABLE);/* DMA2 Stream0 channel2 configuration **************************************/DMA_InitStructure.DMA_Channel = DMA_CHANNELx;  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADCx_DR_ADDRESS;DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADCxConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStructure.DMA_BufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;DMA_Init(DMA_STREAMx, &DMA_InitStructure);DMA_Cmd(DMA_STREAMx, ENABLE);/* Configure ADC3 Channel7 pin as analog input ******************************/GPIO_InitStructure.GPIO_Pin = GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;GPIO_Init(GPIO_PORT, &GPIO_InitStructure);/* ADC Common Init **********************************************************/ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;ADC_CommonInit(&ADC_CommonInitStructure);/* ADC3 Init ****************************************************************/ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfConversion = 1;ADC_Init(ADCx, &ADC_InitStructure);/* ADC3 regular channel7 configuration **************************************/ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_3Cycles);/* Enable DMA request after last transfer (Single-ADC mode) */ADC_DMARequestAfterLastTransferCmd(ADCx, ENABLE);/* Enable ADC3 DMA */ADC_DMACmd(ADCx, ENABLE);/* Enable ADC3 */ADC_Cmd(ADCx, ENABLE);
}

8.3 创建线程读取 值

void update_humi(uint32_t humi)
{uint32_t value=0;value=humi*100/4096;lv_meter_set_indicator_value(meter_humi, indic_humi, value);}ALIGN(RT_ALIGN_SIZE)
static char thread3_stack[512];
static struct rt_thread thread3;
/* 线程1入口函数 */
static void thread3_recv_event(void *param)
{	ADC_SoftwareStartConv(ADCx);while(1){rt_mutex_take(&lvgl_mutex,RT_WAITING_FOREVER);update_humi(uhADCxConvertedValue);rt_mutex_release(&lvgl_mutex);rt_thread_mdelay(500); /* sleep for 10 ms */}  
}	//   创建第三个线程,检测光强rt_thread_init(&thread3,"thread3",thread3_recv_event,RT_NULL,&thread3_stack[0],sizeof(thread3_stack),THREAD_PRIORITY - 1, THREAD_TIMESLICE);rt_thread_startup(&thread3);	

8.4 演示效果

ADC 模块

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

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

相关文章

跨平台应用开发框架(1)----Qt(组件篇)

目录 1.Qt 1.Qt 的主要特点 2.Qt的使用场景 3.Qt的版本 2.QtSDK 1.Qt SDK 的组成部分 2.安装 Qt SDK 3.Qt SDK 的优势 3.Qt初识 1.快速上手 widget.cpp mian.cpp widget.h Helloworld.pro 2.对象树 3.坐标系 4.信号和槽 1. 信号和槽的基本概念 2. 信号和槽的…

架构-微服务-服务治理

文章目录 前言一、服务治理介绍1. 什么是服务治理2. 常见的注册中心 二、nacos简介三、nacos实战入门1. 搭建nacos环境2. 将商品微服务注册到nacos3. 将订单微服务注册到nacos 四、实现服务调用的负载均衡1. 什么是负载均衡2. 自定义实现负载均衡3. 基于Ribbon实现负载均衡 五、…

AWS的流日志

文章目录 一、aws如何观察vpc的日志?二、aws观测其vpc的入口日志三、 具体配置3.1、配置你的存储神器 S33.2、建立子网的流日志 一、aws如何观察vpc的日志? 排查问题的时候除了去抓包看具体的端口信息的时候,还可以根据其所在的vpc的子网信息…

万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统

万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统 哈喽小伙伴们还,我是Stark-C~ 最近苹果Mac mini 2024款在政府补贴的加持下,仅需3500块钱左右就能到手确实挺香的。我看很多评论区的小伙伴跃跃欲试,但是也有不少之前从未体…

函数模板(进阶)

机甲为婚纱,银河为殿堂,爆炸为礼炮,见证了只属于他们的婚礼,樱花树下,再续前缘,鹤望兰无凋零之时,比翼鸟永世长存。 我们这一篇博客紧接我们前面的函数模板(初阶)这一篇博…

全面解析:HTML页面的加载全过程(五)--浏览器渲染之布局Layout

理解一些概念: 盒子模型 页面中的所有元素都被看作一个矩形盒子 内边距(padding)是内容区周围的空间。 边框(border)会在内边距外侧增加一条框线,这条框线可以是实线、虚线或点划线。 外边距(margin),外边距是围绕在盒子可见…

AI 驱动的个性化推荐系统设计

文章目录 摘要引言推荐系统的核心原理推荐系统的类型个性化推荐中的挑战 基于协同过滤的推荐系统设计设计流程系统架构设计 示例代码模块1:数据准备模块2:相似度计算模块3:推荐生成模块4:整体调用与展示 QA 环节总结参考资料 摘要…

基于springboot + vue-element-plus-admin开发的MES系统源码,制造执法系统MES源码;支持app,小程序,H5,后台

MES系统(Manufacturing Execution System,制造执行系统)的生产计划管理功能是其核心功能之一,旨在将企业的生产计划转化为实际的生产操作,并通过实时监控和调整来确保生产活动的顺利进行。 MES系统技术栈:…

Java后端如何进行文件上传和下载 —— 本地版

简介: 本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。 大体思路 1、文件上传 …

深入理解结构化学习:从结构化感知器到条件随机场

摘要 结构化学习是一类能够处理复杂输出空间问题的机器学习方法,被广泛应用于自然语言处理、图像分析等领域。本文将从三个经典模型——结构化感知器、隐马尔可夫模型 (HMM) 和条件随机场 (CRF) 入手,详细解析其理论基础、算法实现及应用案例&#xff0c…

C#基础题总结

16.一张单据上有一个5位数的号码为6**42,其中百位数和千位数已模糊不清,但知道该数能被 57 和 67 除尽。设计一个算法,找出该单据所有可能的号码。 17.编程序求2~10000以内的完全数。一个数的因子(除了这个数本身&…

Docker3:docker基础1

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案

本文旨在深入探讨xinput1_3.dll这一动态链接库文件。首先介绍其在计算机系统中的功能和作用,特别是在游戏和输入设备交互方面的重要性。然后分析在使用过程中可能出现的诸如文件丢失、版本不兼容等问题,并提出相应的解决方案,包括重新安装相关…

Golang项目:实现一个内存缓存系统

要求 支持设定过期时间,精确到秒支持设定最大内存,当内存超过时做出合适的处理支持并发安全按照以下接口安全 type Cache interface{//size : 1KB 100KB 1MB 2MB 1GBSetMaxMemory(size string )bool//将value写入缓存Set(key string, val interface{},e…

计算机网络复习笔记(湖科大教书匠)

课程链接:【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?p61&share_sourcecopy_web&vd_sourcecd12864239c2976e9f2bce4b307393f0 一、基础概念 信息交换方式 电路交换 电话交换机接通…

C语言菜鸟入门·关键字·int的用法

目录 1. int关键字 1.1 取值范围 1.2 符号类型 1.3 运算 1.3.1 加法运算() 1.3.2 减法运算(-) 1.3.3 乘法运算(*) 1.3.4 除法运算(/) 1.3.5 取余运算(%) 1.3.6 自增()与自减(--) 1.3.7 位运算 2. 更多关键字 1. int关键字 int 是一个关键字&#xff0…

神经网络(系统性学习三):多层感知机(MLP)

相关文章: 神经网络中常用的激活函数 神经网络(系统性学习一):入门篇 神经网络(系统性学习二):单层神经网络(感知机) 多层感知机(MLP) 多层感…

Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! ! ! 关注博主,更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了一…

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector

《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…