当前位置: 首页 > news >正文

Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

ADC简介

在这里插入图片描述
测量方式

在这里插入图片描述
采用二分法比较数据

IO通道

在这里插入图片描述
ADC基本结构及配置路线

在这里插入图片描述


获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可
在这里插入图片描述
测得的模拟数据与实际光照强度之间的关系为

光照强度 = 100 - 模拟量 / 40;

代码:

完整朴素代码:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;void AD_Init(void){//初始化ADRCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC模块工作时钟 72 / 6 = 12MHZ/*配置GPIO口*/GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);/*在规则组列表第一个位置,写入通道0这个通道*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);/*结构体初始化ADC*/ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,不使用外部触发,即软件触发ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC工作模式为独立模式ADC_InitStruct.ADC_NbrOfChannel = 1;//通道数目ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描ADC_Init(ADC1, &ADC_InitStruct);//开启ADC电源ADC_Cmd(ADC1, ENABLE);/*给ADC校准*/ADC_ResetCalibration(ADC1);//复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回ADC1复位校准状态ADC_StartCalibration(ADC1);//开始校准while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
}uint16_t AD_Getvailue(void){//获取信息ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成return ADC_GetConversionValue(ADC1);//读取数据
}uint16_t Reality_ADLight(uint16_t ADCnum){//获取光照强度return 100 - ADCnum / 40;
}int main(void){OLED_Init();//初始化OLEDAD_Init();while(1){uint16_t num  = AD_Getvailue();uint16_t num1 = Reality_ADLight(num); OLED_ShowString(1, 1, "ADO:");OLED_ShowNum(1, 5, num, 5);OLED_ShowString(2, 1, "LUX:");OLED_ShowNum(2, 5, num1, 3);Delay_ms(300);}
}

效果:

在这里插入图片描述
此代码的不足之处在于每次写入数字都会提前占据固定位置,这个固定位置在整个过程是不能更改的,十分影响观感

所以添加求数字长度的函数,方便随时捕捉并调正所占空间
添加代码:

uint8_t length(uint16_t num){uint8_t length = 0;while(num > 0){num = num / 10;length = length + 1;}return length;
}

完整优化代码1:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;void AD_Init(void){//初始化ADRCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC模块工作时钟 72 / 6 = 12MHZ/*配置GPIO口*/GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);/*在规则组列表第一个位置,写入通道0这个通道*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);/*结构体初始化ADC*/ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,不使用外部触发,即软件触发ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC工作模式为独立模式ADC_InitStruct.ADC_NbrOfChannel = 1;//通道数目ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描ADC_Init(ADC1, &ADC_InitStruct);//开启ADC电源ADC_Cmd(ADC1, ENABLE);/*给ADC校准*/ADC_ResetCalibration(ADC1);//复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回ADC1复位校准状态ADC_StartCalibration(ADC1);//开始校准while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
}uint16_t AD_Getvailue(void){//获取信息ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成return ADC_GetConversionValue(ADC1);//读取数据
}
uint8_t length(uint16_t num){uint8_t length = 0;while(num > 0){num = num / 10;length = length + 1;}return length;
}
uint16_t Reality_ADLight(uint16_t ADCnum){//获取光照强度return 100 - ADCnum / 40;
}int main(void){OLED_Init();//初始化OLEDAD_Init();while(1){uint16_t num  = AD_Getvailue();uint16_t num1 = Reality_ADLight(num); OLED_ShowString(1, 1, "ADO:");OLED_ShowNum(1, 5, num, length(num));OLED_ShowString(2, 1, "LUX:");OLED_ShowNum(2, 5, num1, length(num1));Delay_ms(300);OLED_Clear();}
}

效果:在这里插入图片描述

写入数据是采用覆盖制,例如上次写入的数据是1234,本次写入的数据是999,那么此时展现的效果为9994,由于ADO取值范围为[0 ~4095],LUX(光照强度)取值范围为[1, 100],所以为了不影响数据的合理性,所以必须要在每次写入新数据时必须要清理一下OLED

但是由于提供的清屏函数每次都是将全部数据清理掉,所以画面刷新也要从新再全部刷新一次所以整体画面会不连贯

所以我写入了一个只清屏某个部分的函数
添加代码:

/* 直接用清屏函数整体刷新会导致OLED画面不连贯清除行函数:保留本行字符串,清除本行剩余部分row:清除的具体行len:不希望被清除的字符串长度
*/void OLED_LoactionClear(uint8_t row, uint8_t len)
{  uint8_t i, j;for (j = row * 2 - 2; j < row * 2; j++){OLED_SetCursor(j, len * 8);for(i = len * 8; i < 128; i++){OLED_WriteData(0x00);}}
}

放入位置

需要将其copy到OLED.c文件下,并在OLED.h文件内声明一下
在这里插入图片描述
在这里插入图片描述
具体函数使用方法:

OLED_LoactionClear(uint8_t row, uint8_t len);
此函数有两个参数:

其中row指你想要进行清屏操作的具体行,OLED上一共能显示4行
其中len代表row行从左到右len长度区间的字符串将会被保留,row行剩余其他数据将全被清除

完整优化代码2:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;void AD_Init(void){//初始化ADRCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC模块工作时钟 72 / 6 = 12MHZ/*配置GPIO口*/GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);/*在规则组列表第一个位置,写入通道0这个通道*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);/*结构体初始化ADC*/ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,不使用外部触发,即软件触发ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC工作模式为独立模式ADC_InitStruct.ADC_NbrOfChannel = 1;//通道数目ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描ADC_Init(ADC1, &ADC_InitStruct);//开启ADC电源ADC_Cmd(ADC1, ENABLE);/*给ADC校准*/ADC_ResetCalibration(ADC1);//复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回ADC1复位校准状态ADC_StartCalibration(ADC1);//开始校准while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
}uint16_t AD_Getvailue(void){//获取信息ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成return ADC_GetConversionValue(ADC1);//读取数据
}
uint8_t length(uint16_t num){uint8_t length = 0;while(num > 0){num = num / 10;length = length + 1;}return length;
}
uint16_t Reality_ADLight(uint16_t ADCnum){//获取光照强度return 100 - ADCnum / 40;
}int main(void){OLED_Init();//初始化OLEDAD_Init();while(1){uint16_t num  = AD_Getvailue();uint16_t num1 = Reality_ADLight(num); OLED_ShowString(1, 1, "ADO:");OLED_LoactionClear(1, length(num) + 3);//"ADO:"长度为3所以要加3OLED_ShowNum(1, 5, num, length(num));OLED_ShowString(2, 1, "LUX:");OLED_LoactionClear(2, length(num1) + 3);OLED_ShowNum(2, 5, num1, length(num1));Delay_ms(300);}
}

效果:

在这里插入图片描述

相关文章:

Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口&#xff0c;AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 光照强度 100 - 模拟量 / 40;代码&#xff1a; 完整朴素代码&#xff1a; #in…...

基于SSM的固定资产管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

Leetcode---364场周赛

题目列表 2864. 最大二进制奇数 2865. 美丽塔 I 2866. 美丽塔 II 2867. 统计树中的合法路径数目 一、最大二进制奇数 这题只要你对二进制有了解(学编程的不会不了解二进制吧)&#xff0c;应该问题不大&#xff0c;这题要求最大奇数&#xff0c;1.奇数&#xff1a;只要保证…...

使用 Powershell 检索不理解的命令

使用 Powershell 检索不理解的命令 尝试使用 Powershell 完成 Powershell 的命令行 使用 Powershell 时&#xff0c;有时您会忘记某个 cmdlet 或想要了解哪些 cmdlet 可用。在这种情况下&#xff0c;最好在互联网上查找&#xff0c;但您也可以使用 Powershell 函数来完成。 以…...

基于 FPGA 的机器博弈五子棋游戏

基于 FPGA 的机器博弈五子棋游戏 一,设计目的 五子棋是一种深受大众喜爱的游戏,其规则简单,变化多端,非常富有趣味性 和消遣性。棋类游戏在具备娱乐性、益智性的同时也因为其载体大多是手机, 电脑等移动互联网设备导致现代社会低头族等现象更加严重,危害青少年的身 体健康…...

uCOSIII实时操作系统 三 移植

目录 uCOSIII简介&#xff1a; 准备工作&#xff1a; 准备基础工程&#xff1a; UCOSIII工程源码&#xff1a; UCOSIII移植&#xff1a; 向基础工程中添加相应的文件夹 向工程中添加分组 常见问题&#xff1a; 下载验证&#xff1a; uCOSIII简介&#xff1a; UCOS-I…...

机器学习之SGD, Batch, and Mini Batch的简单介绍

文章目录 总述SGD(Stochastic Gradient Descent)(随机梯度下降&#xff09;Batch &#xff08;批量&#xff09;mini Batch (迷你批量&#xff09; 总述 SGD, Batch, and Mini Batch是可用于神经网络的监督学习计算权重更新的方案&#xff0c;即∆wij。 SGD(Stochastic Gradi…...

Windows电脑上的多开器与分布式存储系统的关系

Windows电脑上的多开器和分布式存储系统是两个不同的概念&#xff0c;二者之间没有直接的关系。 多开器是一种软件&#xff0c;它可以在Windows电脑上让用户同时运行多个同一应用程序的实例。多开器通常用于游戏玩家和应用程序测试人员等需要同时运行多个实例的用户。 分布式…...

积分球可以用于什么光谱光学检测

积分球是光测量的主要工具之一。积分球可以同时捕获一个光源发出的所有辐射。 1.光源测量 积分球可以用于测量光源的光通量、色温、光效等参数。通过将光源放置在积分球的入口处&#xff0c;球内的光线经过多次反射后形成均匀的照度分布&#xff0c;然后使用光度计或光谱仪对光…...

【力扣面试题】URL化

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、使用String内部方法2、使用StringBuilder 一、题目描述 题目链接&#xff1a;URL化 编写一种…...

计算机网络基础(二):物理层、数据链路层及网络层

一、物理层 1.物理层 物理层面的通信标准可以概括划分为与网络基础设施有关的标准和与被传输物理信号有关的标准两类。 网络基础设施的标准&#xff1a;鉴于物理层面的消息互通也是物理层应该兑现的服务&#xff0c;因此物理层的标准还会包括针脚的用途、线缆的材料与设计等…...

小白自学—网络安全(黑客技术)笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…...

2.2.3 vim操作合集

1 vim VIM 是 Linux 系统上一款文本编辑器,学习 VIM 最好的文档,应该是阅读学习 VIM 的帮助文档,可以使用本地的帮助文件(vim--->:help),或者使用在线帮助文档。同时针对vim的使用,相应的相书籍也很多,如下 2 vim操作模式 命令模式:默认模式,该模式下可以移动光标…...

解决 Jenkins 性能缓慢的问题~转

解决 Jenkins 性能缓慢的问题 Docker中文社区 ​​ 计算机技术与软件专业技术资格持证人 2 人赞同了该文章 没有什么比缓慢的持续集成系统更令人沮丧的了。它减慢了反馈循环并阻止代码快速投入生产。虽然像使用性能更好的服务器可以为您争取时间&#xff0c;但您最终必须投资…...

Matrix卡顿优化之IdleHandlerLagTracer源码分析

前言 IdleHandler是Android系统为开发者提供的一种在消息队列空闲时运行任务的机制&#xff0c;通过IdleHandler执行的任务优先级低于主线程优先级&#xff0c;会在主线程任务执行完成后再执行&#xff0c;所以适用于一些实时性要求不高的任务&#xff0c;通常用于Android启动…...

(ubuntu)Docker 安装linux 详情过程

文章目录 前言Docker 安装linux第一步&#xff1a;使用dokcker 拉取镜像&#xff1a;第二步&#xff1a;创建本地目录&#xff08;用于挂载&#xff09;第三步&#xff1a;&#xff08;上传配置文件&#xff09;修改配置文件第四步&#xff1a;创建docker容器第五步: 测试本地连…...

ArcMap:第二届全国大学生GIS技能大赛(广西师范学院)详解-上午题

目录 01 题目 1.1 第一小题 1.2 第二小题 1.3 第三小题 1.4 数据展示 02 思路和实操 2.1 第一问思路 2.2 第一问操作过程 2.2.1 地理配准 2.2.2 镶嵌 2.2.2.1 第一种镶嵌方法 2.2.2.2 第二种镶嵌方法 2.2.3 裁剪 2.2.4 DEM信息提取 2.2.5 分类 2.3 第二问思路 …...

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现&#xff0c;材质空白的情况&#xff08;如下图所示&#xff09;&#xff0c;今天终于找到问题原因&#xff0c;记录下来&#xff0c;让大家避免踩坑。 其实原因很简…...

C++交换a和b的方法

以下是用C编写的交换a和b的六种方法&#xff1a; 1. 方法一&#xff1a;使用临时变量 #include <iostream>int main() {int a 5;int b 10;std::cout << "Before swapping: a " << a << ", b " << b << std::end…...

3D孪生场景搭建:模拟仿真

前面几期文章介绍如何使用NSDT 编辑器 搭建3D应用场景&#xff0c;本期介绍下孪生场景中一个一个非常重要的功能&#xff1a;模拟仿真。 1、什么是模拟仿真 模拟仿真是一种用于描述、分析和模拟现实世界中系统、过程或事件的计算机模型和程序。仿真通过输入各种参数和条件&am…...

如何用20万条真实动作数据,终结机器人动作“脑补”

3月30日&#xff0c;某知名媒体报道了一项来自南洋理工大学的前沿技术突破。研究团队利用超过20万条“4D交互数据”结合“运动学锚定”&#xff0c;研发出一种新型的“生成式仿真”技术&#xff0c;有效解决了机器人动作模拟中长期存在的“脑补”难题。据悉&#xff0c;这一技术…...

解锁7大加密场景:Cryptii离线工具全攻略

解锁7大加密场景&#xff1a;Cryptii离线工具全攻略 【免费下载链接】cryptii Web app and framework offering modular conversion, encoding and encryption 项目地址: https://gitcode.com/gh_mirrors/cr/cryptii 在数字化时代&#xff0c;数据安全与格式转换成为开发…...

解密Qwen2VLImageProcessor:从RGB转换到时空补丁的完整预处理流水线

解密Qwen2VLImageProcessor&#xff1a;从RGB转换到时空补丁的完整预处理流水线 在计算机视觉与多模态模型融合的前沿领域&#xff0c;图像预处理流水线的设计质量直接影响着模型性能的天花板。Qwen2VLImageProcessor作为专为Qwen2-VL模型设计的预处理引擎&#xff0c;其独特之…...

基于PyTorch Geometric的交通网络流量预测与优化

基于PyTorch Geometric的交通网络流量预测与优化 【免费下载链接】pytorch_geometric Graph Neural Network Library for PyTorch 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric 问题定义&#xff1a;破解城市交通网络的复杂性挑战 交通网络的图…...

不用Animator!用Playable+Timeline打造Unity自定义动画状态机(含项目代码片段)

突破Animator限制&#xff1a;Playable与Timeline构建Unity高阶动画系统 在Unity游戏开发中&#xff0c;动画系统一直是角色表现的核心。传统Animator虽然入门简单&#xff0c;但当项目复杂度上升时&#xff0c;状态机臃肿、过渡僵硬、调试困难等问题逐渐暴露。许多中高级开发…...

Xilinx UltraScale GT收发器实战:从时钟配置到8B/10B编码的避坑指南

Xilinx UltraScale GT收发器实战&#xff1a;从时钟配置到8B/10B编码的避坑指南 在高速数字系统设计中&#xff0c;Xilinx UltraScale系列FPGA的GT收发器是实现多Gbps数据通信的核心组件。然而&#xff0c;许多工程师在实际部署时会遇到时钟配置混乱、弹性缓冲区溢出等棘手问题…...

Loop:让Mac窗口管理效率倍增的效率神器

Loop&#xff1a;让Mac窗口管理效率倍增的效率神器 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 你是否也曾在多任务处理时&#xff0c;被杂乱无章的窗口搞得焦头烂额&#xff1f;切换应用时总要在一堆窗口中寻找目标&a…...

4个步骤掌握ComfyUI-WanVideoWrapper:从环境搭建到视频生成全攻略

4个步骤掌握ComfyUI-WanVideoWrapper&#xff1a;从环境搭建到视频生成全攻略 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper ComfyUI-WanVideoWrapper是一款强大的AI视频生成插件&#xff0c;作…...

3个步骤掌握163MusicLyrics:多平台歌词提取与管理完全指南

3个步骤掌握163MusicLyrics&#xff1a;多平台歌词提取与管理完全指南 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾为找不到老歌的歌词而翻遍全网&#xff1f…...

Z-Image-GGUF在软件测试中的应用:自动化生成测试用例示意图

Z-Image-GGUF在软件测试中的应用&#xff1a;自动化生成测试用例示意图 你是不是也遇到过这样的场景&#xff1f;写测试用例文档时&#xff0c;为了描述一个复杂的用户操作流程&#xff0c;绞尽脑汁写了半天文字&#xff0c;结果评审时&#xff0c;开发同事还是没完全看懂&…...