你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

MiniPro STM32H750 开发指南_V1.1-光敏传感器实验

[复制链接]
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图像传感器等。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。
! R+ N$ X6 m6 c3 u光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其它传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。
/ U$ ~" H$ r* o9 p5 d( s4 rMiniPRO STM32H750开发板板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对光的变化非常敏感。光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。
  N( L& N; M% T5 E利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱。
& C+ f& A) @4 U本实验利用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.例程功能
& Y  T, o+ f9 p" I: v8 O通过ADC3的通道11(PC1)读取光敏传感器(LS1)的电压值,并转换为0~100的光线强度值,显示在LCD模块上面。光线越亮,值越大;光线越暗,值越小。大家可以用手指遮挡LS1和用手电筒照射LS1,来查看光强变化。LED0闪烁用于提示程序正在运行。" T' V; C6 P) L/ C/ U* M
2.硬件资源
' e# u' V- j( [- \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并口驱动)
& D2 J$ q7 E0 p" j' k4)ADC3 :通道11 - PC14 V+ o( f1 y& k7 H9 v
5)光敏传感器 - PC1
! f9 g% N7 v+ f/ Z/ n3.原理图
: y( q3 o! N, m" P8 W9 J我们主要来看看光敏传感器和开发板的连接,如下图所示:
8 j0 e6 j4 |. R. m
0 J8 }: z: k, }7 n, q 9a8031efb12a4e858da77a2381eeac5d.png " i% ]& z' M: @" r# K
; R8 U, \, B' B' |
图33.2.1 光敏传感器与开发板连接示意图
' A7 p$ J: u" a& u( I* ^2 ?* }图中,LS1是光敏二极管(实物在开发板5V排针(VOUT2)上面),R28为其提供反向电压,当环境光线变化时,LS1两端的电压也会随之改变,从而通过ADC3_IN11通道,读取LIGHT_SENSOR(PC1)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光线越暗,电压越高。6 h! i' `4 j6 e8 Q( A; L& |+ G+ A

" R- K/ Q9 c! \1 ~/ z- n' e33.3 程序设计( g, L) {1 K2 d1 B8 i: a
33.3.1 ADC的HAL库驱动
  v* W/ |0 ^  @7 C: \8 f* u% e' H本实验用到的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时钟 /
  \! N2 Z+ W8 A3 }0 E! K__HAL_RCC_GPIOC_CLK_ENABLE(); / 开启GPIOC时钟 */
9 D; U; ]( y  m; g8 C" \* f6 d+ P8 w2)设置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的光线强度值。
  ^' _: U4 J/ Z) x: u: N( ~3 E33.3.2 程序流程图( H1 a4 A9 l. D

+ {& X- p# ~" F b79cb43c643b446d9f8fca3191d77e37.png
% G" c' p7 z% i4 w! V0 v* Y6 Q! R2 r, @
图33.3.2.1 光敏传感器实验程序流程图) Q" U: `( V: ^/ T
7 j+ y' m8 r2 x/ a6 \
33.3.3 程序解析
: q0 t+ E$ e$ }" u" A( }1.LSENS驱动代码$ A4 a) `* u+ v; S$ g, A! n5 |
这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。LSENS驱动源码包括两个文件:lsens.c和lsens.h。本实验还要用到adc3.c和adc3.h文件的驱动代码。adc3.c和adc3.h文件前面已经介绍过了,就不再赘述。
, ^9 _) [5 C$ X9 g& ]lsens.h头文件定义了一些宏定义和一些函数的声明,该宏定义如下:
5 I7 P* ^& @8 B. J2 c5 e
  1. /*****************************************************************************/: j) k) z" l2 y9 \( ?  N
  2. /* 光敏传感器对应ADC3的输入引脚和通道 定义 */
    4 n7 n- |6 L, h* S2 i: T
  3. #define LSENS_ADC3_CHX_GPIO_PORT            GPIOC, C) g4 o1 J  w% i$ D3 @$ I
  4. #define LSENS_ADC3_CHX_GPIO_PIN             GPIO_PIN_1
    + O( E( I' v- w  Z' V* |% _5 ]! x
  5. #define LSENS_ADC3_CHX_GPIO_CLK_ENABLE()    ) Y2 J; W* B0 H' B7 B
  6. do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)  /* PC口时钟使能 */! _* o0 t0 E- a% H
  7. #define LSENS_ADC3_CHX           ADC_CHANNEL_11         /* 通道Y,  0 <= Y <= 19 */
    : I0 y7 J, Q: p  F! i, C
  8. /*****************************************************************************/" b4 D" S; ^2 C" b1 h5 Y1 o/ E% d  k
  9. 这些宏定义分别是PC1及其时钟使能的宏定义,还有ADC通道11的宏定义。
    1 P* B, [% F: a) a2 ?( E4 E
  10. 下面介绍lsens.c的函数,首先是光敏传感器初始化函数,其定义如下:# b, H: m  p- ]4 Y. c0 w
  11. /*** E! T5 H4 `7 }% v3 ~
  12. * @brief       初始化光敏传感器
    9 R  T; C! ]3 \+ C! l& P
  13. * @param       无2 [, W( |7 ^! E* z2 c
  14. * @retval      无
    1 w- U4 D& e2 G* p8 r# W
  15. */! j/ D& v. I9 O! W9 _" s% C
  16. void lsens_init(void)' N) J  K$ ^% S5 @. c( R3 p
  17. {
    " H% c4 e2 P  W. G
  18.     GPIO_InitTypeDef gpio_init_struct;3 `* O  K( a+ C/ n
  19.     LSENS_ADC3_CHX_GPIO_CLK_ENABLE ();                            /* 使能对应IO时钟 */2 K7 U* ]+ i: u9 U4 }
  20.     gpio_init_struct.Pin = LSENS_ADC3_CHX_GPIO_PIN;         /* PC1 */
    6 o5 Y- a% ^8 J9 i+ I
  21.     gpio_init_struct.Mode = GPIO_MODE_ANALOG;                /* 模拟 */' o, |: t6 _" p7 _( x2 C+ X6 T
  22.     HAL_GPIO_Init(LSENS_ADC3_CHX_GPIO_PORT, &gpio_init_struct);. n; ]) e& |4 E6 ^) D/ `8 u! C
  23.     adc3_init();    /* 初始化ADC3 */. M0 i2 I' F8 m3 Q" T" [2 s8 L
  24. }
复制代码
0 V# S# L! k, u! ?: Z5 A5 X
该函数初始化PC1为模拟功能,然后通过adc3_init函数初始化ADC3。9 B' P( I/ e5 H
最后是读取光敏传感器值,函数定义如下:
( o0 B# {: T: \+ g9 }' [! f: {  y* `, T
  1. /**
    * ?# B6 J  O( v. A, x0 P8 ]0 m
  2. * @brief       读取光敏传感器值
    6 l" s6 c+ m/ b' K% {
  3. * @param       无
    % j" b$ _+ S  X' x2 U0 k
  4. * @retval      0~100:0,最暗;100,最亮
    5 e1 u. F, T9 j9 I2 t" }1 [1 {
  5. */
    1 c$ [) s6 r6 k* x7 Q; V/ u6 m
  6. uint8_t lsens_get_val(void)
    5 f0 d. ^5 y( m; t6 J
  7. {
    3 l! B. B' t* ^, ^
  8. uint32_t temp_val = 0;
    . t2 {, V1 q' P' H
  9. /* 读取平均值 */3 F/ O6 B" B( ?* P3 N* x4 E
  10.     temp_val = adc3_get_result_average(g_adc3_handle, LSENS_ADC3_CHX, 10);
    . w" g( M" e& O% Y0 C# g3 K
  11.     temp_val /= 655;( J& ?* {0 F( ^3 i
  12.     if (temp_val > 100)temp_val = 100;
    - A6 l0 w' F+ B- ?5 \
  13.     return (uint8_t)(100 - temp_val);
    0 I8 }+ F0 L3 I$ D& h
  14. }
复制代码
! m' w( c; h% S* K3 e
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 ~

8 s' b- Q8 U9 g1 S
  1. int main(void)/ j& z: S$ v1 ?! i$ r2 x) y  |
  2. {
    + J3 N# y: R) x& \
  3.     short adcx;
    4 Q9 i6 H' p$ H+ ]
  4.     sys_cache_enable();                             /* 打开L1-Cache */6 r, A9 J) ^3 K" }. Y  h! S
  5.     HAL_Init();                                      /* 初始化HAL库 */) q% ?2 A# g- e8 v7 F9 C
  6.     sys_stm32_clock_init(240, 2, 2, 4);         /* 设置时钟, 480Mhz */1 F- E0 O7 u. U
  7.     delay_init(480);                                /* 延时初始化 */. p8 \6 n7 q! y6 O( E0 G
  8.     usart_init(115200);                            /* 串口初始化为115200 */7 d" ~( X: {- Y. a5 W* r/ Y4 [
  9.     mpu_memory_protection();                      /* 保护相关存储区域 */
    . o5 Q" D6 ^6 [) t! A  E
  10.     led_init();                                             /* 初始化LED */
    $ J% f# w% g) W6 K3 o
  11.     lcd_init();                                             /* 初始化LCD */
      {8 O( @' \% Q" U7 s
  12. lsens_init();                                           /* 初始化光敏传感器 */
    " y" o. G5 l% Y# N9 E

  13. 8 X% E+ j" w/ T5 D1 U& ^
  14.     lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);& p6 ?2 m- Z7 f- g: J. y, v7 F8 h
  15.     lcd_show_string(30, 70, 200, 16, 16, "LSENS TEST", RED);
    , v# w8 c4 @5 k8 T; h+ f* N
  16.     lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);2 G/ z) a. R+ ?; R- h! {
  17. lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);. A7 Z: D  q/ I0 I
  18.     while (1)
    # }) |9 @' S% N. D/ l4 r7 \
  19.     { . X( V0 @6 E# W# P9 u
  20.         adcx = lsens_get_val();% _! D8 u( q! J: j4 d: N2 L" _/ v4 b
  21.         lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 显示光线强度值 */$ U( A8 x# t5 O$ D' Z. i+ W
  22.         LED0_TOGGLE();  /* LED0闪烁,提示程序运行 */  B% T. m+ i3 ^
  23.         delay_ms(250);
    9 X% W' ?3 C& X, C+ f8 v' q5 B
  24.     }2 q4 |) Q2 ?9 h1 F8 x8 M3 Y; X
  25. }
复制代码

8 A* |2 G7 q' \, ]) k, E该部分的代码逻辑很简单,初始化各个外设之后,进入死循环,通过lsens_get_val获取光敏传感器得到的光强值(0~100),并显示在TFTLCD上面。
6 _  I, V* v9 e$ u3 C) P( B. h2 P5 i  H3 h. N. X
33.4 下载验证
  N7 j4 E9 V9 I; {2 q. P- V  i& U将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示的内容如图33.4.1所示:1 ^$ G% v5 r/ z1 ~; c! P' ]

( L2 C5 v( B+ A' c4 m6 n f8b57d6edc1340cda1e471d5bb2a64e6.png 0 t! m, i- ~/ a# e

  l1 B" s8 s) @" O) y图33.4.1 光敏传感器实验测试图' v1 y& K* s, M: f6 E
我们可以通过给LS1不同的光照强度,来观察LSENS_VAL值的变化,光照越强,该值越大,光照越弱,该值越小,LSENS_VAL值的范围是0~100。
* g9 }- h! \& O; c* `————————————————
% p+ [! \0 G$ K* I8 D版权声明:正点原子& z6 z( V( u& [4 W& e. Z
: t6 p, P8 S, G+ V% Z

1 \' |) y) G+ c) H7 w
赞 收藏 评论0 发布时间:2022-10-7 21:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版