完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:alientek 阿波罗 STM32F767 开发板
2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子 第二十五章 光敏传感器实验 本章我们将向大家介绍探索者 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_adc.c 和对应头文件的支持。同时,我们在 HARDWARE 分组下新建了 adc3.c 和 lsens.c 源文件,以及包含了它们对应的头文件。因为 本实验我们主要是使用 ADC3 去测量关敏二极管的电压变化,所以大部分知识我们在前面 ADC 实验部分都有所讲解,这里我们就略带而过。打开 lsens.c,代码如下: //初始化光敏传感器 void Lsens_Init(void) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOF_CLK_ENABLE(); //开启 GPIOF 时钟 GPIO_Initure.Pin=GPIO_PIN_7; //PF7 GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟 GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉 HAL_GPIO_Init(GPIOF,&GPIO_Initure); Adc3_Init();//初始化 ADC3 } //读取 Light Sens 的值 //0~100:0,最暗;100,最亮 u8 Lsens_Get_Val(void) { u32 temp_val=0; u8 t; for(t=0;t { temp_val+=Get_Adc3(ADC_CHANNEL_5); //读取 ADC 值,通道 5 delay_ms(5); } temp_val/=LSENS_READ_TIMES;//得到平均值 if(temp_val>4000)temp_val=4000; return (u8)(100-(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 对应最亮。 接下来我们看看 adc3.c 源文件代码: ADC_HandleTypeDef ADC3_Handler;//ADC 句柄 //初始化 ADC //ch: ADC_channels //通道值 0~16 取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16 void Adc3_Init(void) { ADC3_Handler.Instance=ADC3; ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4 分频,ADCCLK=PCLK2/4=84/4=21MHZ ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B; //12 位模式 ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐 ADC3_Handler.Init.ScanConvMode=DISABLE; //非扫描模式 ADC3_Handler.Init.EOCSelection=DISABLE; //关闭 EOC 中断 ADC3_Handler.Init.ContinuousConvMode=DISABLE; //关闭连续转换 ADC3_Handler.Init.NbrOfConversion=1; //1 个转换在规则序列中 也就是只转换规则序列 1 ADC3_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式 ADC3_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为 0 ADC3_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发 ADC3_Handler.Init.ExternalTrigConvEdge= ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发 ADC3_Handler.Init.DMAContinuousRequests=DISABLE; //关闭 DMA 请求 HAL_ADC_Init(&ADC3_Handler); //初始化 } //ADC 底层驱动,引脚配置,时钟使能 //此函数会被 HAL_ADC_Init()调用 //hadc:ADC 句柄 void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { __HAL_RCC_ADC3_CLK_ENABLE(); //使能 ADC3 时钟 } //获得 ADC 值 //ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16 //返回值:转换结果 u16 Get_Adc3(u32 ch) { ADC_ChannelConfTypeDef ADC1_ChanConf; ADC1_ChanConf.Channel=ch; //通道 ADC1_ChanConf.Rank=1; //1 个序列 ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间 ADC1_ChanConf.Offset=0; HAL_ADC_ConfigChannel(&ADC3_Handler,&ADC1_ChanConf); //通道配置 HAL_ADC_Start(&ADC3_Handler); //开启 ADC HAL_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 有了详细的讲解,所以本章实验源码部分讲解就比较简单。接下 来我们看看主函数: int main(void) { u8 adcx; HAL_Init(); //初始化 HAL 库 Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz delay_init(168); //初始化延时函数 uart_init(115200); //初始化 USART usmart_dev.init(84); //初始化 USMART LED_Init(); //初始化 LED KEY_Init(); //初始化 KEY LCD_Init(); //初始化 LCD Lsens_Init(); //初始化光敏传感器 POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); 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,"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 值的变化,光照越强,该值越大,光照越弱,该值越小。 |
|
相关推荐
|
|
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1265 浏览 2 评论
1585 浏览 3 评论
1206 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1339 浏览 0 评论
1632 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-18 06:20 , Processed in 0.561948 second(s), Total 65, Slave 48 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号