目录

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读取电压值。

图中,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);//初始化ADCADC_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    10u8 LightSensor_Get_Val(void);
void LightSensor_Init(void);
#endif

STM32F4_光敏传感器相关推荐

  1. Arduino的光敏传感器和超声波测距传感器测试代码

    光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...

  2. 光照传感器哪个好_传感器2—光敏传感器

    记忆关键:光敏传感器是负相关,光越强,电阻越小. 记忆技巧(只是技巧,不是原理,不要深究):把光敏传感器看做太阳能发电模块,太阳越强电压(电流越大),那根据欧姆定律,电阻不变,电压变大:电压不变,电阻 ...

  3. 【STM32】光敏传感器示例

    00. 目录 文章目录 00. 目录 01. 光敏传感器简介 02. 硬件模块 03. 程序设计 04. 结果验证 05. 预留 06. 附录 07. 声明 01. 光敏传感器简介 光敏传感器是最常见 ...

  4. 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...

  5. 光敏传感器实验报告_光敏传感器光电特性测量实验分析报告.ppt

    思考题 1.光电效应有哪些分类? 光电效应可以分为外光电效应和内光电效应. 2.光敏电阻的物理基础是什么? 内光电效应. * * 光敏传感器的光电特性测量实验 实验简介 光敏传感器是将光信号转换为电信 ...

  6. 光敏传感器实验报告_光敏传感器实验论文-大物实验

    光敏传感器实验及探究 摘要: 光敏传感器是以光电器件作为转换元件的传感器.它可用于检测光量变化或直 接引起光量变化的非电量, 也可用于检测能转换成光量变化的其他非电量. 它首先把被测量 的变化转换成光 ...

  7. c语言光敏程序代码,ADC实验之光敏传感器

    ADC实验之光敏传感器 硬件连接 我们可以测量A的电位,进而测量光的强度,光强与A点电压的对应关系如下: 电流反应的光敏二极管的导通状态,光强与电流对应关系如下: 因此,我们可以得出ADC读取的电压值 ...

  8. 【跟着江科大学Stm32】GPIO_按键控制LED_光敏传感器控制蜂鸣器

    不要管别人怎么说,一定要坚持,坚持一定会有收获! 一.按键控制LED 用两个按键来分别控制两个LED的状态,初始状态两灯均熄灭,按下1次点亮,再按下熄灭 因为江科大的套餐抢不到 我就自己看着图和利用现 ...

  9. 实验19:光敏传感器+继电器=光控智能灯实验

    欧克 在讲实验前 先讲讲安全教育 我们做弱电实验是不是会买一些电池,如果电池随意丢 如果电池的+和-被导体连通,就会导电发热,最后可能引起火灾,所以大家一定重视合理放置电池哈,这也是我今天做实验突然想 ...

最新文章

  1. 火山引擎向企业客户开放上万款抖音同款特效
  2. syslog服务器默认使用协议,什么是syslog协议?
  3. 使用leangoo做多团队敏捷开发项目管理
  4. CVPR2021 | 实现图像的“无限放大”,超详细局部隐式图像函数(LIIF)解读
  5. spring处理方法返回值的类型
  6. 【ionic App问题总结系列】ionic 如何更新app版本
  7. 一次OGG ERROR OGG-01091 Unable to open file ./dirdat/th079817 的问题解决
  8. 【物联网】QCA4010开发环境的搭建
  9. 为SAP UI5正名 - 它也支持双向绑定
  10. 多个 本地仓库_【运维工具】搭建npm私有镜像仓库,天下苦于npm build久矣
  11. 学习笔记之23-typedef
  12. java jexl 工具类_jexl表达式解析、计算工具类.md
  13. js获取DIV的位置坐标的三种方法!
  14. 实习周记---20180527
  15. Three.js的人物动画与交互
  16. android 微信朋友圈动画,使用Android 模仿微信朋友圈图片拖拽返回
  17. excel power Query
  18. ACE认证考试—阿里云产品概念深化学习
  19. linux工作区切换到桌面,linux切换桌面环境 gnome kde
  20. 计算机科学与专业大学排名,计算机科学与技术专业大学排名

热门文章

  1. 大智慧重要函数应用教程
  2. 软件测试工程师薪资调查
  3. ospf的dr和bdr,drother直间关系
  4. Mac技巧 -- 如何快速定位指定路径
  5. php写入文本检查重复,PHP检测重复文本
  6. 第三模块:面向对象网络编程基础-第1章 面向对象
  7. NO.005-2018.02.10《南歌子词二首 / 新添声杨柳枝词》唐代:温庭筠
  8. 我纠结的sql返回受影响行数与判断是否成功的问题
  9. 洋桃电子STM32物联网入门30步笔记三、新建CubeIDE工程和设置讲解
  10. python适合开发区块链吗_区块链入门开发语言选择 python适合开发区块链吗