STM32F4_光敏传感器

news2024/11/21 0:18:24

目录

1. 什么是光敏传感器、光敏电阻

2. 硬件分析

3. 实验程序

3.1 main.c

3.2 ADC3.c

3.3 ADC3.h

3.4 Lightsensor.c

3.5 Lightsensor.h


1. 什么是光敏传感器、光敏电阻

光敏传感器也称为光电传感器。是利用光电器件把光信号转换成电信号的一种传感器。它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。

光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、CCD和CMOS图像传感器等。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。

光敏电阻是一种由半导体材料制成的没有极性的纯电阻,光敏电阻是一种对光敏感的光电器件。

光敏电阻的主要参数:

  • 暗电阻和暗电流:通常把光敏电阻未受到光照射时的电阻称作暗电阻,在没有光照射时流过的电流称作暗电流。
  • 亮电阻和亮电流:亮对应于暗,通常将光敏电阻在受到光照射时的电阻称作亮电阻,在有光照射时通过的电流称作亮电流。

光敏电阻的主要特性:

  • 伏安特性:在一定的光照强度下,光敏电阻两端所加的电压与电流成正比,阻值只和照射的入光强度有关,与加在两端的电流或者电压无关。
  • 光谱特性:我们只要光存在不同的波长,则不同波长的光对光敏电阻的灵敏度是不一样的。
  • 温度特性:光敏电阻受温度的影响较大,当温度升高时,暗电阻和灵敏度都随之下降。

工作原理:

        光敏电阻串联在电流中,在光敏电阻的两端,通常加上合适的电压,在没有光照的条件下,光敏电阻的阻值接近于无穷大,相当于断路,当在一定的光照强度下, 光敏电阻的阻值减少,电流对应增大,足够的光照强度使得光敏电阻所在的支路相当于短路。

实际应用:

        通过STM32F4的ADC去测量电压值

  1.         首先需要确定ADC的位数,也可以说是分辨率,最大数值是多少。比如说一个16位的ADC,最大值就是0xFFFF,对应于2^{16}=65536;
  2.         确定最大值时对应的参考电压值,STM32F4的开发板对应的最大值为3.3V。
  3.         计算电压值,需要把ADC的数值除刚才的确定的最大数值(也就是2^{16})再乘以参考电压值,

        比如说是ADC*(3.3/65536)

2. 硬件分析

        STM32F4板载了一个光敏二极管(光敏电阻),作为开发板的光敏传感器,它对光的变化非常敏感。光敏二极管也叫作光电二极管。光敏二极管和半导体二极管类似,其管芯是一个具有光敏特性的PN结,PN结具有单向导电性,因此工作时需要加反向电压。无光照条件时,有很小的饱和反向漏电流,也就是上面提到的暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,此时这个值随着入射光的光照强度变化而变化。当光线照射PN结时,可以在PN结中产生电子---空穴对,使得少数的载流子的密度增加。这些载流子在反向电压下产生漂移,使得反向电流增加。因此可以利用光照强度来改变电路中的电流。

        利用PN结中电流的变化,串联一个电阻,就可以转换成电压的变化,通过ADC读取电压值。

 图中,LSI 就是光敏二极管,R58为其提供反向电压,当环境光线变化时,LSI 两端的电压也会随之变化,通过ADC3_IN5通道,读取LIGHT_SENSOR上面的电压;光线越强,电压越低,光线越暗,电压越高。

3. 实验程序

本实验利用ADC3的通道5(PF7)来读取光敏二极管的电压变化。

光敏二极管位于开发板的左下角,如上图PCB图所示;可以用强光照射该处,观察光敏电阻的变化;

3.1 main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "lcd.h"
#include "usmart.h"
#include "ADC3.h"
#include "Lightsensor.h"


//LCD状态设置函数
void led_set(u8 sta)//只要工程目录下有usmart调试函数,主函数就必须调用这两个函数
{
	LED1=sta;
}
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
	led_set(sta);
}
int main(void)
{
	u8 adcx;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);
	uart_init(115200);
	LED_Init();
	LCD_Init();
	LightSensor_Init();
	POINT_COLOR=RED;
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
	LCD_ShowString(30,70,200,16,16,"Lightsensor Test");
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2023/20/23");
	POINT_COLOR=BLUE;
	LCD_ShowString(30,130,200,16,16,"Lightsensor:");
	while(1)
	{
		adcx=LightSensor_Get_Val();
		LCD_ShowxNum(30+12*8,130,adcx,3,16,0);
		LED0=!LED0;
		delay_ms(250);
	}
}


3.2 ADC3.c

#include "stm32f4xx.h"                 
#include "ADC3.h"

void Adc3_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE); //使能ADC3时钟
	
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);  //ADC3复位
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);   //复位结束
	
	//初始化CCR寄存器
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled; //DMA不使能,DMA通常用于多通道的转移
	ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent;  //独立模式
	ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;  //预分频4分频
	ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;  //两个采样阶段之间延迟5个时钟
	ADC_CommonInit(&ADC_CommonInitStructure);
	
	//初始化ADC
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;  //关闭连续转换
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;  //右对齐
	ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
	ADC_InitStructure.ADC_NbrOfConversion=1; //1个转换在规则序列中
	ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;  //12位模式分辨率
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;  //非扫描模式
	ADC_Init(ADC3,&ADC_InitStructure);
	
	ADC_Cmd(ADC3,ENABLE);  //开启AD转换器
}
//获得ADC的值
//ch:通道值0~16  ADC_Channel_0~ADC_Channel_16 
//返回值:转换的结果
u16 Get_Adc3(u8 ch)
{
	ADC_RegularChannelConfig(ADC3,ch,1,ADC_SampleTime_480Cycles); //设置ADC规则组通道,1个序列 采样时间
	ADC_SoftwareStartConv(ADC3);//使能指定的ADC3的软件转换启动功能
	while(!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC));//等待状态寄存器转换标志位结束
	return ADC_GetConversionValue(ADC3);   //返回转换的结果
}

3.3 ADC3.h

#ifndef _ADC3__H_
#define _ADC3__H_

u16 Get_Adc3(u8 ch);
void Adc3_Init(void);
#endif

3.4 Lightsensor.c

#include "stm32f4xx.h"                
#include "Lightsensor.h"
#include "ADC3.h"
#include "delay.h"

void LightSensor_Init(void)    //初始化光敏传感器
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);  //初始化GPIOF时钟
	
	//初始化GPIOF PF7通道
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;  //模式为模拟输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;  //不带上下拉
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	
	Adc3_Init(); //初始化ADC3
}
//读取光敏电阻Light Sensor的值
//0~100 0最暗,100最亮
u8 LightSensor_Get_Val(void)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<LSENS_READ_TIMES;t++)
	{
		temp_val=Get_Adc3(ADC_Channel_5)+temp_val;// 取多次读取的总和加在一起
		delay_ms(5);
	}
	temp_val=temp_val/LSENS_READ_TIMES;  //得到平均值
	if(temp_val>4000)
		temp_val=4000;
	return (u8)(100-(temp_val/40));
	
}

3.5 Lightsensor.h

#ifndef _LIGHTSENSOR__H_
#define _LIGHTSENSOR__H_

#define LSENS_READ_TIMES	10

u8 LightSensor_Get_Val(void);
void LightSensor_Init(void);
#endif


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

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

相关文章

opencv实践项目-多张图片拼接之stitcher

目录 1.简介2. 拼接算法流程3. 代码演示 1.简介 OpenCV从2.4.x版本之后多出来一个新的模型 图像拼接&#xff0c;该模块通过简单的高级API设置&#xff0c;可以获得比较好的图像拼接效果&#xff0c;OpenCV官方提供了一个高度集成的API函数 Stitcher&#xff0c;只要两行代码就…

SRE/DevOps不得不懂的:Prometheus的配置工程化!

原创不易&#xff0c;还请关注和转发&#xff5e;谢谢 背景 Prometheus有两个最基本的组件&#xff1a;一个是Prometheus程序&#xff0c;一个是Alertmanager程序。 它们的职责分工很明确&#xff1a; • Prometheus程序负责&#xff1a;定时拉取监控指标数据、存储指标数据、根…

谈谈IOC容器和AOP编程

Java发展的路途中&#xff0c;由刚开始的使用new创建对象&#xff0c;到使用抽象类&#xff0c;接口进行解耦&#xff0c;又到了提问时刻&#xff0c;什么是耦合度&#xff1f; 对于这个对象的关联和依赖关系&#xff0c;例如&#xff1a; 当一个对象要使用&#xff0c;但是&…

4.6k Star,SpringBoot+Vue+App+硬件实现的智能家居系统,一套带走

今天&#xff0c;推荐一个智能家居系统项目。这是我目前见过的最好的智能家居系统项目&#xff0c;功能完整&#xff0c;代码结构清晰。值得推荐。 4.6k Star&#xff0c;SpringBootVueApp硬件实现的智能家居系统&#xff0c;一套带走 简介 FastBee是一个简单易用的物联网平…

Cocos Shader实现HSL和RGB颜色模型

HSL和RGB是两种常见的颜色模型&#xff0c;被广泛应用于计算机图形学、数字图像处理、Web设计等领域。在进行颜色处理时&#xff0c;经常需要将HSL和RGB相互转换&#xff0c;本demo演示如何通过Cocos Creator 3.7游戏引擎&#xff0c;用HSL模型来调节图片颜色&#xff0c;并详细…

徐培:以数据智能技术助力制造型企业降本增效

导语 2023年4月7日&#xff0c;由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店盛大开启。次日&#xff0c;云和恩墨数据智能产品部总经理徐培博士在“智胜未来&#xff1a;数据技术创新应用”…

二、讲师管理接口开发总结

首先本项目将实体类单独放在model包中&#xff0c;方便后期集体的调用&#xff1a; 整个项目的建包结构都是在java包中建立com.lxl.ggkt包&#xff0c;方便后期包路径的扫描。 上述有三个包&#xff1a; enums包规定了一些状态规定&#xff0c;比如优惠券是否使用&#xff0c…

CVE-2017-7921漏洞复现

文章目录 漏洞描述 漏洞描述 0x01 CVE-2017-7921漏洞复现 许多HikvisionIP摄像机包含一个后门&#xff0c;允许未经身份验证的模拟任何配置的用户帐户。 0x02 漏洞复现&#xff1a; 利用工具发现漏洞&#xff08;CVE-2017-7921&#xff09;&#xff1a; 利用路径&#xff…

“数字裂变”宇宙,华为云与和伙伴组成“银河护卫队”

最近&#xff0c;《银河护卫队3》正在上映&#xff0c;取得了豆瓣高分和全网好评。很多朋友走出电影院都感叹&#xff0c;真想有像银河护卫队一样的朋友和伙伴。 “伙伴”这个词&#xff0c;不仅是超级英雄电影的内核&#xff0c;更是云计算产业的“新贵”。关注云产业的朋友可…

Go项目组织:在单一repo中管理多个Go module指南

0. 单repo单module管理回顾 众所周知&#xff0c;Go在1.11版本中引入了go module[1]&#xff0c;随着近几年Go module机制的逐渐成熟&#xff0c;它已经被Go团队确定为Go标准的依赖管理与构建方案&#xff0c;原先的GOPATH mode已经被彻底废弃。 在Go module模式下&#xff0c;…

C++——类和对象(5)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月8日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.操作符重载&#xff08;续&#xff09;&#xff1a; 前置和后置&#xff1a; 日期减日期&#xff1a; <<操作符&#xff1a; 结尾&#xff…

智能里既有技术也有艺术

智能不仅仅是技术方面的创新和应用&#xff0c;也是一种艺术的体现。智能技术需要融合多个学科和领域的知识&#xff0c;包括计算机科学、数学、心理学、哲学、人文艺术、宗教民俗等等&#xff0c;从而形成一个完整的系统。这个系统的设计和实现&#xff0c;需要技术人员具备深…

跟着我学 AI丨“Hey,Siri”的前生今世

Siri 是由苹果公司开发的一款智能语音助手&#xff0c;它可以通过语音识别和自然语言处理来回答用户的问题、执行任务、提供建议等等。Siri 可以在 iOS 和 macOS 设备上使用&#xff0c;它的出现极大地改变了人机交互的方式&#xff0c;让我们用语音成为了交互的媒介。 Siri 的…

轻松客观认识大模型系列:一

这是我关于《轻松客观认识大模型系列》第一篇 一、前言 这篇文章旨在为没有计算机科学背景的读者提供一些关于ChatGPT及其类似的人工智能系统&#xff08;如GPT-3、GPT-4、Bing Chat、Bard等&#xff09;如何工作的原理。ChatGPT是一种聊天机器人&#xff0c;建立在一个大型语…

AI 自动补全的这句日志能正常打印吗?

最近用上了 GitHub Copilot&#xff0c;它的能力不时让我惊叹&#xff0c;于是越来越多地面向 tab 编程&#xff0c;机械键盘的损耗都小了许多:-p 这天&#xff0c;它给我自动生成了一句像这样的日志打印代码&#xff1a; try {// ... } catch (Exception e) {log.error("…

Vue列表过滤与数据原理

目录 列表过滤 使用计算属性 使用watch监视属性 列表排序 Vue中数据原理 练习数据原理 Vue中数据原理总结 列表过滤 可以进行模糊搜索 使用计算属性 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml"> <…

YARN框架概述

Yarn 概述 Yarn概述对Yarn的需求简介变迁YARN于MRv1的区别MRv1YARN介绍 YARN集群安装部署集群角色介绍ResourceManager(RM)NodeManager(NM)集群部署规划 YARN RM重启机制概述**开启重启机制**RM状态数据的存储介质开启 后续正在学习&#xff1a;YARN HA高可用 YARN架构体系官方…

DNDC模型

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

harbor(docker仓库)仓库部署

harbor仓库部署 1. harbor概述2. harbor主要功能3. harbor架构介绍4. Docker Compose4.1 compose简介4.2 docker-compose工具命令 5. harbor部署5.1 部署Docker Compose5.2 部署harbor5.3 部署harbor开机自启 6. harbor应用6.1 配置客户端访问harbor6.2 harbor的web管理界面 1.…

炸裂!Hugging Face 发布重磅更新,人手一个 AutoGPT!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; Hugging Face&#xff0c;作为 AI 开源圈最为知名的「网红」创业公司&#xff0c;成立仅几年&#xff0c;便在 GitHub 开源了诸多实用开源项目&#xff0c;受到了不少开发者的赞赏。 其中影…