20.光敏传感器

news2025/6/7 14:01:12

1.光敏传感器介绍:

  • 光敏二极管(光敏电阻),作为光敏传感器;光敏二极管也称光电二极管;
  • 光敏二极管与半导体二极管在结构上类似,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需要加上反向电压。无光照时,有很小的饱和和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成了光电流,它随入射光强度的变化而变化。
  • 利用这个电流变化,可以串接一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱;
  • 光敏传感器是利用光敏元件,将光信号转换为电信号的一种传感器;

2.光敏传感器实验:

功能实现:通过ADC3通道6采集光敏传感器的AD值,并将该值转换为光照强度值0-100,0对应最暗。100对应最亮,并通过串口1输出光照强度值,LED0指示灯闪烁提示系统正常运行。

(1)原理图:

  

(2)主函数:

#include "delay.h"
#include "led.h"
#include "usart1.h"
#include "ldr.h"



int main(){
    
    u8 i=0;    
    int LIGHT_VALUE=0;
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置分组
    delay_init();                                        //延时初始化
    LED_Init();  
    usart1_Init(9600);                                   //串口通信初始化
    LDR_Init();                                          //光敏传感器初始化
   
    while(1)
       {
          i++;
          if(i%20==0)
          {
             LED0=!LED0;
          }

           delay_ms(10);
          
           if(i%100==0)
           {
              LIGHT_VALUE+=Get_LDR_Value();           //获取光照强度值
              printf("当前光照强度值:%d \r\n",LIGHT_VALUE);
              printf("\r\n");
              
           }
       
      }       
}

(3)头文件:
 

#ifndef __LDR_H
#define __LDR_H


typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;

void LDR_Init(void);                         //光敏传感器初始化
u16 Get_ADC3_Value(u8 ch,u8 times);          //获取ADC3的值
u8 Get_LDR_Value(void);                      //获取光照强度值


#endif

(4)光敏传感器功能函数:

#include "stm32f10x.h"
#include "delay.h"
#include "ldr.h"



/*
   功能:光敏传感器初始化
   变量:无
   返回值:无
*/
void LDR_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct;
   ADC_InitTypeDef ADC_InitStruct;
   
   //1.使能端口时钟和ADC时钟,设置引脚模式
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_ADC3,ENABLE);
   
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;                    //模拟输入
   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;                        //PF8
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOF,&GPIO_InitStruct);
   
   //2.设置ADC的分频因子
   RCC_ADCCLKConfig(RCC_PCLK2_Div6);
   
   //3.初始化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_InitStruct.ADC_NbrOfChannel=1;                                                  //通道数量
   ADC_InitStruct.ADC_ScanConvMode=DISABLE;                                            //不扫描
   ADC_Init(ADC3,&ADC_InitStruct);
   
   //4.使用ADC校准
   ADC_Cmd(ADC3,ENABLE);                                          //使能ADC3
   
   ADC_ResetCalibration(ADC3);                                    //复位校准
   while(ADC_GetResetCalibrationStatus(ADC3));                    //判断复位校准是否完成
   
   ADC_StartCalibration(ADC3);                                    //开启校准
   while(ADC_GetCalibrationStatus(ADC3));                         //判断开启校准是否完成
   
   //5.开启软件触发
   ADC_SoftwareStartConvCmd(ADC3,ENABLE);
   
}



/*
   功能:获取ADC3的值
   变量:ch:通道       times:获取次数
   返回值:ADC滤波后的值

*/
u16 Get_ADC3_Value(u8 ch,u8 times)
{
   u8 i=0;
   u32 LDR_Val=0;             //存储获取到的ADC值
    
   ADC_RegularChannelConfig(ADC3,ch,1,ADC_SampleTime_239Cycles5);    //配置ADC规则通道
   
   for(i=0;i<times;i++)
   {
      ADC_SoftwareStartConvCmd(ADC3,ENABLE);                         //开启软件触发
      while(!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC));                  //判断规则组转换是否完成
      LDR_Val+=ADC_GetConversionValue(ADC3);                         //获取ADC3的值
      delay_ms(10);
      
   }
   
   return LDR_Val/times;                                             //将所获得的ADC值进行滤波
   
}



/*
   功能:获取光照强度值
   变量:无
   返回值:光照强度值


*/

#define LIGHT_READ_TIMES      20             //采集ADC3的次数
u8 Get_LDR_Value()
{
   u8 i=0;
   u32 light_val=0;                          //存储关照强度值
   
   for(i=0;i<LIGHT_READ_TIMES;i++)
   {
      light_val+=Get_ADC3_Value(ADC_Channel_6,LIGHT_READ_TIMES);        //获取ADC3采集的值
      delay_ms(10);
      
   }
   
   light_val/=LIGHT_READ_TIMES;        //将获取的ADC值进行滤波
   
   if(light_val>4000)
   {
      light_val=4000;                  //将大于4000的值都设置为4000
   }
   
   return (100-light_val/40);          //返回光照强度值(0~4000,设置笑死范围[0,100]中)
   
}


(5)实验结果:

 

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

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

相关文章

【ECharts系列】ECharts 鼠标悬停线格式化

问题描述&#xff1a; 折线图有很多数据&#xff0c;鼠标悬停时&#xff0c;针对X轴&#xff0c;Y轴数据进行格式化&#xff0c;例如X的时间戳&#xff0c;格式化为时分秒&#xff0c;Y轴保留两位小时 希望效果图&#xff1a; 方案1&#xff1a; 在这个示例中&#xff0c;X轴依…

指针进阶(二)

目录 函数指针数组 指向函数指针数组的指针 回调函数 回调函数模拟实现qsort&#xff08;快速排序&#xff09; 整型数组的排序 结构题排序 按年龄排序 按名字排序 模拟实现qsort函数&#xff08;冒泡排序&#xff09; 函数指针数组 数组是一个存放相同类型数据的存储空…

【Linux】gcc/g++的使用 自动化构建工具make/makefile的使用

一.gcc的使用 在学习C语言时&#xff0c;我们了解了预处理阶段要做的事&#xff1a;->预处理 这其中会经历两个阶段&#xff1a;编译和链接 而编译又分为三个阶段&#xff1a;预编译&#xff0c;编译&#xff0c;汇编 通过不同的选项&#xff0c;可以让gcc停在以上相应的阶段…

ArcGis Pro如何通过C#进行插件开发?

文章目录 0.引言1.开发工具准备2.VS&#xff08;C#&#xff09;创建ArcGIS Pro模块加载项3.编译并使用ArcGis Pro插件 0.引言 ArcGIS Pro插件&#xff08;Add-ins&#xff09;可以让用户更加容易的自定义和扩展ArcGIS Pro应用程序&#xff0c;它创建一系列自定义工具提供了一个…

ISO文件boot、dvd、minimal的区别

在centos的下载中&#xff0c;有分为boot、dvd、minimal的iso文件&#xff0c;那么他们之间有什么区别呢&#xff1f; boot.iso 这个版本大小不会超过1G ,只有最基本的启动引导等内容&#xff0c;各类包均需从线上下载&#xff0c;需要快速安装且有可靠网络的前提下&#xff0c…

linux中的数据库

目录 1.安装MySQL 2.创建数据库 3.删除数据库 4.查询创建数据库的语句 5使用数据库的语句 6.查询当前默认的数据库 7.查询使用的编码方式和校验规则 8.创建表的语句 9.表的物理存储结构 10.表的数据类型 11.总结 引言&#xff1a; 数据库是现代应用开发中不可或缺的组…

获取视频 RTMP 推流web播放

工作需要研究下市面上显示实时视频方案。这里介绍下RTMP协议。 需求获取USB摄像头&#xff0c;手机谁摄像头。显示到web网页上。 一、 采集摄像头 这个使用opencvSharp来采集&#xff1a; nuget: var task Task.Run(() >{var capture new VideoCapture(0);VideoCaptur…

PHP实战开发25-电商网站系统缓存设计方案系统讲述

文章目录 一、前言-缓存的作用1.1 提高性能1.2 减轻服务端压力1.3 减少网络流量1.4 改善用户体验1.5 支持离线访问1.6 降低数据传输成本 二、浏览器缓存2.1 强缓存2.2 协商缓存 三、CDN 缓存3.1 使用CDN缓存的好处3.1.1 加速网站加载时间3.1.2 节省服务器带宽3.1.3 提高可用性和…

快速计算多项式相乘系数 FFT快速傅里叶变换

快速计算多项式相乘系数 FFT快速傅里叶变换 快速傅里叶变换(FFT)——有史以来最巧妙的算法&#xff1f; 正常求两个多项式乘积 A ( x ) ∑ i 0 n A i x i , B ( x ) ∑ i 0 n B i x i C ( x ) ∑ i 0 n ∑ j 0 n A i B j x i j A(x)\sum_{i0}^{n}{A_ix^i},B(x)\sum_{…

Java多线程基础-11:工厂模式及代码案例之线程池

在Java中&#xff0c;xx池的概念是很常见的&#xff0c;比如之前遇到过的常量池、数据库连接池等等。 线程池是一种常用的多线程处理方式&#xff0c;它可以重复利用已创建的线程&#xff0c;从而减少线程的创建和销毁开销&#xff0c;并提高程序的性能。 通俗来说&#xff…

【Windows】Redis集群部署

集群是如何进行工作的 Redis采用哈希槽来处理数据与节点之间的映射关系&#xff0c;一个集群共有16384 个哈希槽&#xff0c;每个key通过 CRC16算法计算出一个16bit的值&#xff0c;再对16384取模&#xff0c;得到对应的哈希槽&#xff0c;集群通过维护哈希槽与节点的关系来得…

flutter聊天界面-Text富文本表情emoji、url、号码展示

flutter聊天界面-Text富文本表情emoji、url、号码展示 Text富文本表情emoji展示&#xff0c;主要通过实现Text.rich展示文本、emoji、自定义表情、URL等 一、Text及TextSpan Text用于显示简单样式文本 TextSpan它代表文本的一个“片段”&#xff0c;不同“片段”可按照不同的…

Verilog学习笔记2:反相器

代码&#xff1a; //反相器 timescale 1ns/10ps module inv( A,y); input A; output y; assign y~A; endmodule //testbench module inv_tb;reg A; wire YY;inv inv(.A(A),.y(YY));initial beginA<0;#10 A<1;#10 A<0; #10 A<1;#10 A<0; #10 A<1;#10 A<0;…

从小白到大神之路之学习运维第54天--------ELK日志收集分析

第三阶段基础 时 间&#xff1a;2023年7月6日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; ELK技术堆栈 目录 服务器设置&#xff1a; 部署elasticsearch集群&#xff1a; 配置elasticsearch集群&#xff…

怎样寻找SEO服务商,需要注意那些问题?

网上提供SEO服务的公司或个人多如牛毛&#xff0c;随便在搜索引擎上搜索一下&#xff0c;成千上万的公司就在眼前。大部分网站设计公司也兼职SEO服务&#xff0c;寻找合适的SEO服务商并不简单&#xff0c;鉴别合格的SEO服务商是关键。 1、确定外包任务 如果没有SEO团队&…

C++类相关概念

1. 函数形参默认值 &#xff08;1&#xff09; 建议函数&#xff08;不仅仅是构造函数&#xff09;形参默认值只在函数声明中指定&#xff1b; &#xff08;函数声明和定义写在同一个文件中&#xff0c;则函数声明、定义两者之一或两者都可指定形参默认值&#xff0c;两者都指定…

mybati执行流程源码分析

MyBatis执行流程源码分析 前言 由于之前写过关于mybatis源码的文章,但是感觉还是不够细致,不够完善.没有把一些具体的流程应用写下来,至此又写了一篇.内容可能比较长,希望大家可以打开源码跟着这篇文章一起看源码保证可以收获许多. 1.mybatis基础开发流程 1.引入mybatis相关…

短视频去水印小帮手微信小程序源码带后台

短视频去水印小帮手微信​小程序源码​带后台&#xff0c;短视频去水印系列教程服务端源码。 php版&#xff0c;这里不过多介绍&#xff0c;我假设您有基本的编码基础&#xff0c;并熟悉php语言及laravel框架。

Topaz Gigapixel AI v6 人工智能图像放大

其他软件或插件依赖于插值算法来放大图像&#xff0c;Topaz Gigapixel AI 则与众不同&#xff0c;它使用最先进的深度学习技术来扩大和增强图像。 它通过神经网络分析了数百万张照片&#xff0c;从而了解了不同的照片在放大时细节是如何损失的&#xff0c;以及如何为图像增强和…

四十三、贪心——Huffman树、排序不等式

算法主要内容 一、Huffman树1、题目内容——合并果子2、算法思路&#xff08;1&#xff09;“合并果子”中的Huffman树&#xff08;2&#xff09;算法步骤&#xff08;3&#xff09;状态转移 3、题解 二、排序不等式1、题目内容——排队打水2、算法思路&#xff08;1&#xff0…