STM32F4_光敏传感器

这篇具有很好参考价值的文章主要介绍了STM32F4_光敏传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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,对应于=65536;
  2.         确定最大值时对应的参考电压值,STM32F4的开发板对应的最大值为3.3V。
  3.         计算电压值,需要把ADC的数值除刚才的确定的最大数值(也就是)再乘以参考电压值,

        比如说是ADC*(3.3/65536)

2. 硬件分析

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

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

STM32F4_光敏传感器

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

3. 实验程序

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

STM32F4_光敏传感器

光敏二极管位于开发板的左下角,如上图PCB图所示;可以用强光照射该处,观察光敏电阻的变化;文章来源地址https://www.toymoban.com/news/detail-445716.html

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


到了这里,关于STM32F4_光敏传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器

            STM32的第三课,我们来学习如何使用按键来控制LED灯的亮灭。上一节课我们通过代码控制了LED的状态,但是还是处于一种较为低级的方式控制LED灯,缺少交互性,用按键进行控制属于更高的一个层次。然后我们将学习通过光敏传感器控制蜂鸣器的通断,让我们的学

    2024年04月29日
    浏览(24)
  • Stm32_标准库_11_ADC_光敏&热敏传感器_测数值

    在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1: 在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_

    2024年02月19日
    浏览(30)
  • Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

    ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 代码: 完整朴素代码: 效果: 此代码的不足之处在于每次写入数字都会提前占据固定位置,

    2024年02月04日
    浏览(34)
  • 【江科大STM32合集】day2按键控制LED&光敏传感器控制峰鸣器

    运算放大器-在江科大51单片机b站视频(AD/DA)复习 原理:两个极端 同相输入端电压 》反相输入端 电压输出最大值 接Vcc 同相输入端电压《 反向输入端 电压输出最小值 接GNd LED.c用来存放驱动程序的主体代码 (ps:逻辑运算代码都在这 LED.h用来存放驱动程序可以 对外 提供的函

    2024年01月17日
    浏览(43)
  • STM32F4_DHT11数字温湿度传感器

    目录 前言 1. DHT11简介 2. DHT11数据结构 3. DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h         DHT11数字温湿度传感器 不但能测温度

    2024年02月08日
    浏览(26)
  • 【正点原子STM32连载】 第三十二章 光敏传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    本章,我们将学习使用STM32开发板板载的一个光敏传感器。我们还是要使用到ADC采集,通过ADC采集电压,获取光敏传感器的电阻变化,从而得出环境光线的变化,并在TFTLCD上面显示出来。 本章分为如下几个小节: 32.1 光敏传感器简介 32.2 硬件设计 32.3 程序设计 32.4 下载验证

    2024年02月03日
    浏览(59)
  • 单片机设计:stm32远程水位检测灌溉系统(水泵+电机驱动+OLED显示屏+水位传感器+防水式ds18b20+光敏传感器+按键+WiFi+手机app)

    单片机设计:stm32远程水位检测灌溉系统(水泵+电机驱动+OLED显示屏+水位传感器+防水式ds18b20+光敏传感器+按键+WiFi+手机app) 一、主要功能:    1.水位传感器检测水的高度、光敏传感器检测周围光照强度、ds18b20检测水温 2.0LED、手机app显示当前数据以及阈值 3.手机app远程调节阈值,

    2024年02月05日
    浏览(35)
  • ESP32 直接使用WIFI进行UDP通信, 将光敏电阻传感器数值, 显示在OLED上 - 米思齐/Arduino

    ESP32主: 读取光敏传感器数值, 并通过UDP发送 ESP32从: 读取主机发送的数值, 并显示在OLED显示屏上 左边为ESP32, 连接OLED, 为STA模式从机 右边为ESP32, 连接光敏传感器, 为AP+STA主机, 可连接外网和连接从机

    2024年02月13日
    浏览(113)
  • STM32-雨滴传感器

    目录 0 说明:  1 传感器介绍  2 代码说明    2.1 ADC初始化函数(adc.c)   2.2 GPIO初始化函数 2.3 主函数         本篇文章主要是说明怎么使用STM32单片机读取雨滴传感器采集到的数据,并且附带着STM32所需要的全部代码,所使用的雨滴传感器如下图所示。 附: 使用单片机

    2024年01月17日
    浏览(38)
  • DIY_实现光敏电阻传感器简单控制LED

    模块接线图: 1、VCC 接电源正极 3.3-5V 2、GND 接电源负极 3、DO TTL 开关信号输出 4、AO 模拟信号输出 模块特色: 1、工作电压3.3V-5V 2、使用宽电压LM393比较器 3、设有固定螺栓孔,方便安装 4、采用灵敏型光敏电阻传感器 5、小板PCB尺寸:3.2cm x 1.4cm 6、配可调电位器可调节检测光

    2024年02月02日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包