STMCU小助手
发布时间:2022-10-7 21:33
|
光敏传感器实验6 I; J4 _- R# p8 a 本章,我们将学习使用MiniPRO STM32H750开发板板载的一个光敏传感器。我们还是要使用到ADC采集,通过ADC采集电压,获取光敏传感器的电阻变化,从而得出环境光线的变化,并在TFTLCD上面显示出来。# f$ j% P* n9 q% N$ \0 r / [; i. ^6 R# i, y( ]8 o) v 33.1 光敏传感器简介6 B& O+ \2 D# X 光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。 光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其它传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。 MiniPRO STM32H750开发板板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对光的变化非常敏感。光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。 利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱。 本实验利用ADC3的通道11(PC1)来读取光敏二极管电压的变化,从而得到环境光线的变化,并将得到的光线强度,显示在TFTLCD上面。关于ADC的介绍,前面已经有详细介绍了,这里我们就不再细说了。7 M: S; S: K7 \2 N" a1 K" C/ l 33.2 硬件设计8 t p1 g$ q2 N. L4 a5 P) F- ^, d 1.例程功能 通过ADC3的通道11(PC1)读取光敏传感器(LS1)的电压值,并转换为0~100的光线强度值,显示在LCD模块上面。光线越亮,值越大;光线越暗,值越小。大家可以用手指遮挡LS1和用手电筒照射LS1,来查看光强变化。LED0闪烁用于提示程序正在运行。" T' V; C6 P) L/ C/ U* M 2.硬件资源 1)RGB灯3 W/ }* w, t$ [- w RED : LED0 - PB4& {8 l$ g, o3 `0 ]! M/ C/ z 2)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面): h) \3 V- x. o: \+ k. J 3)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动) 4)ADC3 :通道11 - PC14 V+ o( f1 y& k7 H9 v 5)光敏传感器 - PC1 3.原理图 我们主要来看看光敏传感器和开发板的连接,如下图所示:
; R8 U, \, B' B' | 图33.2.1 光敏传感器与开发板连接示意图 图中,LS1是光敏二极管(实物在开发板5V排针(VOUT2)上面),R28为其提供反向电压,当环境光线变化时,LS1两端的电压也会随之改变,从而通过ADC3_IN11通道,读取LIGHT_SENSOR(PC1)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光线越暗,电压越高。6 h! i' `4 j6 e8 Q( A; L& |+ G+ A 33.3 程序设计( g, L) {1 K2 d1 B8 i: a 33.3.1 ADC的HAL库驱动 本实验用到的ADC的HAL库API函数前面都介绍过,具体调用情况请看程序解析部分。下面介绍读取光敏传感器ADC值的配置步骤。# z6 P6 h9 W2 f m' f- ?9 B 读取光敏传感器ADC值配置步骤1 S& }3 i' I& [# }8 R2 D 1)开启ADCx和ADC通道对应的IO时钟,并配置该IO为模拟功能/ d2 a% ?) z$ v$ `% _3 x5 x" l" L 首先开启ADCx的时钟,然后配置GPIO为模拟模式。本实验我们默认用到ADC3通道11,对应IO是PC1,它们的时钟开启方法如下:$ a( P: L1 ~7 l __HAL_RCC_ADC3_CLK_ENABLE (); /* 使能ADC3时钟 / __HAL_RCC_GPIOC_CLK_ENABLE(); / 开启GPIOC时钟 */ 2)设置ADC3,开启内部温度传感器- @8 s: t1 q2 p8 f! O, U @( F, \ 调用HAL_ADC_Init函数来设置ADC3时钟分频系数、分辨率、模式、扫描方式、对齐方式等信息。; Q) {% j( Z+ M) x 注意:该函数会调用:HAL_ADC_MspInit回调函数来完成对ADC底层的初始化,包括:ADC3时钟使能、ADC3时钟源的选择等。" ~; C9 v# N8 a, |- J8 a 3)配置ADC通道并启动AD转换器6 z6 i* J# Z& w- a 调用HAL_ADC_ConfigChannel()函数配置ADC3通道11,根据需求设置通道、序列、采样时间和校准配置单端输入模式或差分输入模式等。然后通过HAL_ADC_Start函数启动AD转换器。3 Z* e `4 T1 x5 l( q& R 4)读取ADC值,转换为光线强度值; u# t, A4 P1 C7 v 这里选择查询方式读取,在读取ADC值之前需要调用HAL_ADC_PollForConversion等待上一次转换结束。然后就可以通过HAL_ADC_GetValue来读取ADC值。最后把得到的ADC值转换为0~100的光线强度值。 33.3.2 程序流程图( H1 a4 A9 l. D
! V0 v* Y6 Q! R2 r, @ 图33.3.2.1 光敏传感器实验程序流程图) Q" U: `( V: ^/ T 7 j+ y' m8 r2 x/ a6 \ 33.3.3 程序解析 1.LSENS驱动代码$ A4 a) `* u+ v; S$ g, A! n5 | 这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。LSENS驱动源码包括两个文件:lsens.c和lsens.h。本实验还要用到adc3.c和adc3.h文件的驱动代码。adc3.c和adc3.h文件前面已经介绍过了,就不再赘述。 lsens.h头文件定义了一些宏定义和一些函数的声明,该宏定义如下:
该函数初始化PC1为模拟功能,然后通过adc3_init函数初始化ADC3。9 B' P( I/ e5 H 最后是读取光敏传感器值,函数定义如下: + g9 }' [! f: { y* `, T
lsens_get_val函数用于获取当前光照强度,该函数通过adc3_get_result_average函数得到通道11转换的电压值,经过简单量化后,处理成0~100的光强值。0对应最暗,100对应最亮。2 K/ b% t% F/ j& q7 `' r 2. main.c代码: G# m7 f8 \, x0 b9 o8 f 在main.c里面编写如下代码:( ~: \; _& \1 ~
该部分的代码逻辑很简单,初始化各个外设之后,进入死循环,通过lsens_get_val获取光敏传感器得到的光强值(0~100),并显示在TFTLCD上面。 . h2 P5 i H3 h. N. X 33.4 下载验证 将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示的内容如图33.4.1所示:1 ^$ G% v5 r/ z1 ~; c! P' ]
图33.4.1 光敏传感器实验测试图' v1 y& K* s, M: f6 E 我们可以通过给LS1不同的光照强度,来观察LSENS_VAL值的变化,光照越强,该值越大,光照越弱,该值越小,LSENS_VAL值的范围是0~100。 ———————————————— 版权声明:正点原子& z6 z( V( u& [4 W& e. Z : t6 p, P8 S, G+ V% Z |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版