资讯详情

光敏传感器

文章目录

  • 前言
  • 一、 介绍光敏传感器
  • 二、硬件设计
  • 三、 软件设计
    • lsens.c
    • lsens.h
    • adc.c
    • adc.h
    • main.c


前言

本节将向您介绍光敏传感器,本章仍需使用 ADC 采集,通过 ADC 收集电压,获得光敏传感器的电阻变化,从而获得环境光的变化 TFTLCD上图显示。本节将分为以下几个部分:

  1. 光敏传感器简介
  2. 硬件设计
  3. 软件设计

一、 介绍光敏传感器

光敏传感器是最常见的传感器之一,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外传感器、紫外线传感器、光纤光电传感器、色彩传感器、CCD 和 CMOS 图像传感器等。光传感器是目前产量最大、应用最广泛的传感器之一,在自动控制和非电测技术中起着非常重要的作用。

光敏传感器是一种利用光敏元件将光信号转换为电信号的传感器。它的敏感波长接近可见光波长,包括红外波长和紫外波长。光传感器不仅局限于光检测,还可以作为检测元件组成其他传感器,只要将这些非电转换为光信号的变化,就可以检测到许多非电。

二、硬件设计

我用的是原子哥STM32F103战舰版(自带光敏传感器)

本节使用的硬件资源包括: 1) 指示灯 DS0 2) TFTLCD 模块 3) ADC 4) 光敏传感器 之前介绍过光敏传感器和 STM32F1 如图所示: 在这里插入图片描述 图中,LS1 光敏二极管(实物在开发板摄像头接口右侧),R34 当环境光发生变化时,反向电压,LS1 通过这种方式,两端的电压也会发生变化 ADC3_IN6 通道,读取 LIGHT_SENSOR(PF8)以上电压可获得环境光的强度。光线越强,电压越低,光线越暗,电压越高。

三、 软件设计

lsens.c

//// void Lsens_Init(void) { 
          GPIO_InitTypeDef GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能 PORTF 时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//PF8 anolog 输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; ///模拟输入引脚 GPIO_Init(GPIOF, &GPIO_InitStructure); Adc3_Init();} //读取 Light Sens 的值 //0~100:0,最暗;100,最亮 u8 Lsens_Get_Val(void) { 
         u32 temp_val=0; u8 t; for(t=0;t<LSENS_READ_TIMES;t ) { 
         temp_val =Get_Adc3(LSENS_ADC_CHX); //读取 ADC 值 delay_ms(5); } temp_val/=LSENS_READ_TIMES; //得到平均值 if(tmp_val>4000)temp_val=4000;
return (u8)(100-(temp_val/40));
}

lsens.h

#ifndef __LSENS_H
#define __LSENS_H 
#include "sys.h" 
#include "adc.h" 
  
#define LSENS_READ_TIMES 10 //定义光敏传感器读取次数,读这么多次,然后取平均值
#define LSENS_ADC_CHX ADC_Channel_6 //定义光敏传感器所在的ADC通道编号
    
void Lsens_Init(void); 				//初始化光敏传感器
u8 Lsens_Get_Val(void);				//读取光敏传感器的值
#endif 

Lsens_Init 用于初始化光敏传感器,其实就是初始化 PF8 为模拟输入,然后通过 Adc3_Init 函数初始化 ADC3Lsens_Get_Val 函数用于获取当前光照强度,该函数通过 Get_Adc3 得到 ADC3_CH6 转换的电压值,经过简单量化后,处理成 0~100 的光强值。0 对应最暗,100 对应最亮。 头文件 lsens.h ,主要是一些函数申明以及宏定义敞亮。

adc.c

//初始化ADC3
//这里我们仅以规则通道为例
//我们默认仅开启通道6 
void  Adc3_Init(void)
{ 
              
	ADC_InitTypeDef ADC_InitStructure; 

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3	, ENABLE );	  //使能ADC3通道时钟
	
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);//ADC复位
	
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);//复位结束 
	
	ADC_DeInit(ADC3);  //复位ADC3,将外设 ADC3的全部寄存器重设为缺省值
	
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式: 独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC3, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 
	
	
	ADC_Cmd(ADC3, ENABLE);	//使能指定的ADC3
	
	ADC_ResetCalibration(ADC3);	//使能复位校准 
	 
	while(ADC_GetResetCalibrationStatus(ADC3));	//等待复位校准结束
	
	ADC_StartCalibration(ADC3);	 //开启AD校准
 
	while(ADC_GetCalibrationStatus(ADC3));	 //等待校准结束
}		 
//获得ADC3某个通道的值
//ch:通道值 0~16
//返回值:转换结果
u16 Get_Adc3(u8 ch)   
{ 
        
  //设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC3,ADC通道,采样时间为239.5周期 
  
	ADC_SoftwareStartConvCmd(ADC3, ENABLE);		//使能指定的ADC3的软件转换启动功能 
	 
	while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC ));//等待转换结束

	return ADC_GetConversionValue(ADC3);	//返回最近一次ADC3规则组的转换结果
} 

adc.h

#ifndef __TSENSOR_H
#define __TSENSOR_H 
#include "stm32f10x.h"
   
short Get_Temprate(void);			//获取内部温度传感器温度值
void T_Adc_Init(void); //ADC通道初始化
u16  T_Get_Adc(u8 ch); //获得某个通道值 
u16  T_Get_Adc_Average(u8 ch,u8 times);//得到某个通道10次采样的平均值 

void Adc3_Init(void); 				//ADC3初始化
u16  Get_Adc3(u8 ch); 				//获得ADC3某个通道值 
#endif 

main.c

int main(void)
 { 
        	 
 	u8 adcx; 
	delay_init();	    	 //延时函数初始化 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
	LED_Init();		  		//初始化与LED连接的硬件接口
  	LCD_Init();				//初始化LCD
	Lsens_Init(); 			//初始化光敏传感器
	POINT_COLOR=RED;//设置字体为红色 
	//显示提示信息 
	LCD_ShowString(30,50,200,16,16,"WarShip STM32");	
	LCD_ShowString(30,70,200,16,16,"LSENS TEST");	
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2015/1/14");	  
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(30,130,200,16,16,"LSENS_VAL:");	             
	while(1)
	{ 
        
		adcx=Lsens_Get_Val();
		LCD_ShowxNum(30+10*8,130,adcx,3,16,0);//显示ADC的值 
		LED0=!LED0;
		delay_ms(250);	
	}
}

初始化各个外设之后,进入死循环,通过 Lsens_Get_Val 获取光敏传感器得到的光强值(0~100),并显示在 TFTLCD 上面。

标签: 光电传感器挡住后不灭什么原因光纤传感器的二大类型如何添加传感器传感器ad值成了1管光敏传感器79u光纤传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台