当前位置:首页>温度传感器

探索者 STM32F407 开发板资料连载第二十五章 光敏传感器实验

时间:2024-05-10 00:20:35来源:佛山顺德区昊胜传感仪器有限公司

1)实验平台:alientek阿波罗STM32F767开发板

第二十五章光敏传感器实验

本章我们将向大家介绍探索者STM32F4开发板自带的探索一个光敏传感器,本章还是资料要用

到ADC采集,通过ADC采集电压,发板获取光敏传感器的连载电阻变化,从而得出环境光线的第章变

化,并在TFTLCD上面显示出来。光敏本章将分为如下几个部分:

25.1光敏传感器简介

25.2硬件设计

25.3软件设计

25.4下载验证

25.1光敏传感器简介

光敏传感器是传感最常见的传感器之一,它的器实种类繁多,主要有:光电管、探索光电倍增管、资料光

敏电阻、发板光敏三极管、连载太阳能电池、第章红外线传感器、光敏紫外线传感器、传感光纤式光电传感器、色

彩传感器、CCD和CMOS图像传感器等。光传感器是目前产量最多、应用最广的传感器之

一,它在自动控制和非电量电测技术中占有非常重要的地位。

光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波

长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探

测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即

可。

探索者STM32F4开发板板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对

光的变化非常敏感。光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类

似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。

无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱

和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,

可以使PN结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂

移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。

利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过ADC读

取电压值,判断外部光线的强弱。

本章,我们利用ADC3的通道5(PF7)来读取光敏二极管电压的变化,从而得到环境

光线的变化,并将得到的光线强度,显示在TFTLCD上面。关于ADC的介绍,前面两章已

经有详细介绍了,这里我们就不再细说了。

25.2硬件设计

本实验用到的硬件资源有:

1)指示灯DS0

2)TFTLCD模块

3)ADC

4)光敏传感器

前三个之前均有介绍,光敏传感器与STM32F4的连接如图25.2.1所示:

图25.2.1光敏传感器与STM32F4连接示意图

图中,LS1是光敏二极管(实物在开发板摄像头接口右侧),R58为其提供反向电压,

当环境光线变化时,LS1两端的电压也会随之改变,从而通过ADC3_IN5通道,读取

LIGHT_SENSOR(PF7)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光

线越暗,电压越高。

25.3软件设计

打开本章实验工程可以看到,在HAL库文件中,我们跟上一讲的实验是一样的,添加

了adc相关的库函数文件stm32f4xx_hal_和对应头文件的支持。同时,我们在

HARDWARE分组下新建了和源文件,以及包含了它们对应的头文件。因为

本实验我们主要是使用ADC3去测量关敏二极管的电压变化,所以大部分知识我们在前面

ADC实验部分都有所讲解,这里我们就略带而过。打开,代码如下:

//初始化光敏传感器voidLsens_Init(void){GPIO_InitTypeDefGPIO_Initure;__HAL_RCC_GPIOF_CLK_ENABLE();//开启GPIOF时钟GPIO_=GPIO_PIN_7;//PF7GPIO_=GPIO_MODE_ANALOG;//模拟GPIO_=GPIO_NOPULL;//不带上下拉HAL_GPIO_Init(GPIOF,GPIO_Initure);Adc3_Init();//初始化ADC3}//读取LightSens的值//0~100:0,最暗;100,最亮u8Lsens_Get_Val(void){u32temp_val=0;u8t;for(t=0;tLSENS_READ_TIMES;t++){temp_val+=Get_Adc3(ADC_CHANNEL_5);//读取ADC值,通道5delay_ms(5);}temp_val/=LSENS_READ_TIMES;//得到平均值if(temp_val4000)temp_val=4000;return(u8)(1(temp_val/40));}

这里就2个函数,其中:Lsens_Init用于初始化光敏传感器,其实就是初始化PF7为模

拟输入,然后通过Adc3_Init函数初始化ADC3的通道ADC_Channel_5。Lsens_Get_Val函

数用于获取当前光照强度,该函数通过Get_Adc3得到通道ADC_Channel_5转换的电压值,

经过简单量化后,处理成0~100的光强值。0对应最暗,100对应最亮。

接下来我们看看源文件代码:

ADC_HandleTypeDefADC3_Handler;//ADC句柄//初始化ADC//ch:ADC_channels//通道值0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16voidAdc3_Init(void){ADC3_=ADC3;ADC3_=ADC_CLOCK_SYNC_PCLK_DIV4;//4分频,ADCCLK=PCLK2/4=84/4=21MHZADC3_=ADC_RESOLUTION_12B;//12位模式ADC3_=ADC_DATAALIGN_RIGHT;//右对齐ADC3_=DISABLE;//非扫描模式ADC3_=DISABLE;//关闭EOC中断ADC3_=DISABLE;//关闭连续转换ADC3_=1;//1个转换在规则序列中也就是只转换规则序列1ADC3_=DISABLE;//禁止不连续采样模式ADC3_=0;//不连续采样通道数为0ADC3_=ADC_SOFTWARE_START;//软件触发ADC3_=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发ADC3_=DISABLE;//关闭DMA请求HAL_ADC_Init(ADC3_Handler);//初始化}//ADC底层驱动,引脚配置,时钟使能//此函数会被HAL_ADC_Init()调用//hadc:ADC句柄voidHAL_ADC_MspInit(ADC_HandleTypeDef*hadc){__HAL_RCC_ADC3_CLK_ENABLE();//使能ADC3时钟}//获得ADC值//ch:通道值0~取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16//返回值:转换结果u16Get_Adc3(u32ch){ADC_ChannelConfTypeDefADC1_ChanConf;ADC1_=ch;//通道ADC1_=1;//1个序列ADC1_=ADC_SAMPLETIME_480CYCLES;//采样时间ADC1_=0;HAL_ADC_ConfigChannel(ADC3_Handler,ADC1_ChanConf);//通道配置HAL_ADC_Start(ADC3_Handler);//开启ADCHAL_ADC_PollForConversion(ADC3_Handler,10);//轮询转换return(u16)HAL_ADC_GetValue(ADC3_Handler);//返回最近一次ADC1规则组的转换结果}

这里,Adc3_Init函数几乎和ADC_Init函数一模一样,这里我们设置了ADC3_CH5的

相关参数,但是没有设置对应IO为模拟输入,因为这个在Lsens_Init函数已经实现。Get_Adc3

用于获取ADC3某个通道的转换结果。

因为我们前面对ADC有了详细的讲解,所以本章实验源码部分讲解就比较简单。接下

来我们看看主函数:

intmain(void){u8adcx;HAL_Init();//初始化HAL库Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhzdelay_init(168);//初始化延时函数uart_init(115200);//初始化USARTusmart_(84);//初始化USMARTLED_Init();//初始化LEDKEY_Init();//初始化KEYLCD_Init();//初始化LCDLsens_Init();//初始化光敏传感器POINT_COLOR=RED;LCD_ShowString(30,50,200,16,16,"ExplorerSTM32F4");LCD_ShowString(30,70,200,16,16,"LSENSTEST");LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2014/5/7");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上面。

代码设计部分就为大家讲解到这里,下面我们开始下载验证。

25.4下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK探索者STM32F4开发板上,

可以看到LCD显示如图25.4.1所示:

图25.4.1光敏传感器实验测试图

伴随DS0的不停闪烁,提示程序在运行。此时,我们可以通过给LS1不同的光照强度,

来观察LSENS_VAL值的变化,光照越强,该值越大,光照越弱,该值越小。