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

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

[复制链接]
STMCU小助手 发布时间:2022-10-7 21:33
光敏传感器实验
1 \4 Y* D; ]: [) A本章,我们将学习使用MiniPRO STM32H750开发板板载的一个光敏传感器。我们还是要使用到ADC采集,通过ADC采集电压,获取光敏传感器的电阻变化,从而得出环境光线的变化,并在TFTLCD上面显示出来。
' a. n* O( M  k  h) r& o1 ^  R! E/ B% y5 j* H/ }. b
33.1 光敏传感器简介$ R: i+ X5 N, W7 W, Z+ x
光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。
5 [; j; J7 P' b1 W) K$ _4 n光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其它传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。( f$ M- c+ V4 o( W! u0 F
MiniPRO STM32H750开发板板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对光的变化非常敏感。光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。, o: S7 `, x- q! ]- K: c$ E
利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱。- R- z; m; X% q9 j. B, j
本实验利用ADC3的通道11(PC1)来读取光敏二极管电压的变化,从而得到环境光线的变化,并将得到的光线强度,显示在TFTLCD上面。关于ADC的介绍,前面已经有详细介绍了,这里我们就不再细说了。- r  K6 I1 p: B8 p$ C
33.2 硬件设计
. O# @6 F! V/ G1 \0 r8 }& e1.例程功能% @' u& n  x5 F3 p
通过ADC3的通道11(PC1)读取光敏传感器(LS1)的电压值,并转换为0~100的光线强度值,显示在LCD模块上面。光线越亮,值越大;光线越暗,值越小。大家可以用手指遮挡LS1和用手电筒照射LS1,来查看光强变化。LED0闪烁用于提示程序正在运行。+ y& s9 e) Z, ~$ L) e8 D
2.硬件资源
+ x4 o- ?" j, R+ E5 B7 D1)RGB灯5 |! ~/ S# K9 M$ G) ]7 n; k9 ~: x
RED : LED0 - PB4
8 |# i3 x3 i, Q, e0 ?+ X2)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面)
  Y* @: {( i( Q# n3)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
, U3 B2 I/ E) n4)ADC3 :通道11 - PC1
% Q; L( S8 g4 i: q5)光敏传感器 - PC1
8 p7 V7 G6 |% R+ y* R3.原理图4 F  P8 \$ W  k- I# V7 w
我们主要来看看光敏传感器和开发板的连接,如下图所示:
. [' I4 v# t* }. q) A
) m5 U; j: z9 x; }, j$ F 9a8031efb12a4e858da77a2381eeac5d.png ) U0 \3 {1 V& ?' X7 f9 L6 |

/ I8 d5 ?. I4 z1 q. P9 F; H图33.2.1 光敏传感器与开发板连接示意图; _  }/ x, {! V+ E+ O0 }4 h
图中,LS1是光敏二极管(实物在开发板5V排针(VOUT2)上面),R28为其提供反向电压,当环境光线变化时,LS1两端的电压也会随之改变,从而通过ADC3_IN11通道,读取LIGHT_SENSOR(PC1)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光线越暗,电压越高。( m) W$ k0 z9 {  e0 ]: J
5 c" a; R' M7 A" \2 O
33.3 程序设计# R# u5 h2 x7 _% \2 K, p
33.3.1 ADC的HAL库驱动
0 t! Y, j1 H- U  N本实验用到的ADC的HAL库API函数前面都介绍过,具体调用情况请看程序解析部分。下面介绍读取光敏传感器ADC值的配置步骤。
3 J* V/ T  h2 u& p2 T2 _读取光敏传感器ADC值配置步骤9 ~( Q* v* m- p/ ?7 ]5 q/ D
1)开启ADCx和ADC通道对应的IO时钟,并配置该IO为模拟功能
7 S* m; y2 R4 t' P( W0 M首先开启ADCx的时钟,然后配置GPIO为模拟模式。本实验我们默认用到ADC3通道11,对应IO是PC1,它们的时钟开启方法如下:& B7 ?2 O8 @  X  Y& N
__HAL_RCC_ADC3_CLK_ENABLE (); /* 使能ADC3时钟 /+ p$ t7 d% O" J; E% s
__HAL_RCC_GPIOC_CLK_ENABLE(); / 开启GPIOC时钟 */
6 F# u- m) H' ]5 X) O# \. U7 P; ~2)设置ADC3,开启内部温度传感器1 N: x5 T1 q7 c2 d6 i4 c* w1 p
调用HAL_ADC_Init函数来设置ADC3时钟分频系数、分辨率、模式、扫描方式、对齐方式等信息。/ S6 N$ n; p  t5 P+ l" {. \
注意:该函数会调用:HAL_ADC_MspInit回调函数来完成对ADC底层的初始化,包括:ADC3时钟使能、ADC3时钟源的选择等。& _  r) `9 Y; f4 a2 T3 P6 }
3)配置ADC通道并启动AD转换器
" r' ?: K0 M) B1 y2 P调用HAL_ADC_ConfigChannel()函数配置ADC3通道11,根据需求设置通道、序列、采样时间和校准配置单端输入模式或差分输入模式等。然后通过HAL_ADC_Start函数启动AD转换器。
% Y3 y( N7 Y7 E! R( @3 M) O/ z4)读取ADC值,转换为光线强度值3 @  K! Z8 J8 J9 S- Y$ `6 z2 `2 P/ A
这里选择查询方式读取,在读取ADC值之前需要调用HAL_ADC_PollForConversion等待上一次转换结束。然后就可以通过HAL_ADC_GetValue来读取ADC值。最后把得到的ADC值转换为0~100的光线强度值。: e9 y0 H/ S! F# h
33.3.2 程序流程图
8 H$ z% T* w* G2 ]+ f0 u8 s2 Z+ C/ Z1 E/ J( p9 c7 O
b79cb43c643b446d9f8fca3191d77e37.png
3 }/ w: b! B# P" f' h% o  N
, {: E2 A$ Y7 z图33.3.2.1 光敏传感器实验程序流程图5 ?# r* \8 K& y' Z) V

+ f3 o- }% v5 Q9 q( R6 }& r+ |33.3.3 程序解析- G! ~+ x5 s) X* R1 k% O
1.LSENS驱动代码
+ g! c, y" H4 Q  L这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。LSENS驱动源码包括两个文件:lsens.c和lsens.h。本实验还要用到adc3.c和adc3.h文件的驱动代码。adc3.c和adc3.h文件前面已经介绍过了,就不再赘述。' X9 e' |5 j/ k5 J& q
lsens.h头文件定义了一些宏定义和一些函数的声明,该宏定义如下:
6 h0 M, w! n& I3 l
  1. /*****************************************************************************/1 d- p' z+ M5 p# v' l' P! k& s! c
  2. /* 光敏传感器对应ADC3的输入引脚和通道 定义 */
    / r: G4 V; q& W3 Y
  3. #define LSENS_ADC3_CHX_GPIO_PORT            GPIOC
    # I, i  [  Y! c' Y
  4. #define LSENS_ADC3_CHX_GPIO_PIN             GPIO_PIN_1( n$ v" k( @3 |# T
  5. #define LSENS_ADC3_CHX_GPIO_CLK_ENABLE()    7 H; [1 K8 n( w2 j5 y# ?, a
  6. do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)  /* PC口时钟使能 */( P8 [+ x/ F' {
  7. #define LSENS_ADC3_CHX           ADC_CHANNEL_11         /* 通道Y,  0 <= Y <= 19 */   b% r+ _6 g. g  X" @
  8. /*****************************************************************************/+ p/ V) g. a( @2 v* L. ?) n* ]
  9. 这些宏定义分别是PC1及其时钟使能的宏定义,还有ADC通道11的宏定义。- d! f, u. m* e7 L4 B/ }4 d
  10. 下面介绍lsens.c的函数,首先是光敏传感器初始化函数,其定义如下:
    6 u& Y8 X& ?! G9 U9 B
  11. /**
    ; |( N' ^6 L$ Z2 L$ X1 x
  12. * @brief       初始化光敏传感器4 p& m# q/ p  P
  13. * @param       无, O$ x; f. k' l3 g
  14. * @retval      无  k- `. D4 {  i* ^. m: p' u
  15. *// w5 \( q2 ]+ t8 j8 D! Q) O
  16. void lsens_init(void)  `  P7 o* |( F3 I  ]: t- `
  17. {+ N: x4 z( Z/ {1 h
  18.     GPIO_InitTypeDef gpio_init_struct;
    ( o3 p% r  G$ E: x
  19.     LSENS_ADC3_CHX_GPIO_CLK_ENABLE ();                            /* 使能对应IO时钟 */
    ! X- N# a. v8 Y
  20.     gpio_init_struct.Pin = LSENS_ADC3_CHX_GPIO_PIN;         /* PC1 */0 x  l( J( o8 b
  21.     gpio_init_struct.Mode = GPIO_MODE_ANALOG;                /* 模拟 */
      a/ R% A! {# k/ p  \" [
  22.     HAL_GPIO_Init(LSENS_ADC3_CHX_GPIO_PORT, &gpio_init_struct);, C5 G" f2 l; O" [# ?. X
  23.     adc3_init();    /* 初始化ADC3 */6 X9 m9 O3 ]  A$ B, Y
  24. }
复制代码

. k6 {' y! H! \; }该函数初始化PC1为模拟功能,然后通过adc3_init函数初始化ADC3。
9 w* N# ]8 K8 C* G( A* j最后是读取光敏传感器值,函数定义如下:
/ T, O4 b; W6 l& T8 F  Y8 n
4 g2 f. S) v4 H- P
  1. /**! A; P$ p0 u; B# \
  2. * @brief       读取光敏传感器值, f! K' \5 }  h; }) a4 S! a3 B
  3. * @param       无
    $ h( v% z, F+ i- }! Y
  4. * @retval      0~100:0,最暗;100,最亮
    , Z; u& z6 D* O) |- d1 G
  5. */% O) d7 E+ p  c
  6. uint8_t lsens_get_val(void)
    7 f  o4 @' K# Z7 w& Y% I
  7. {
    4 P! J9 A. d. S; z
  8. uint32_t temp_val = 0;
    ) ^9 e  L& S& q$ Q; _. o
  9. /* 读取平均值 */" j# \& a* E5 [; M; j1 e: h; w2 r7 v
  10.     temp_val = adc3_get_result_average(g_adc3_handle, LSENS_ADC3_CHX, 10);
    6 P6 Q, N: |0 g8 D7 q
  11.     temp_val /= 655;. C: C  o0 q* H9 n( M
  12.     if (temp_val > 100)temp_val = 100;( q3 w9 |6 T' Q# [! h* s* E
  13.     return (uint8_t)(100 - temp_val);
    0 P* }& B" x  K* y* h, `* S" B
  14. }
复制代码

6 W2 T1 a, {! p2 Alsens_get_val函数用于获取当前光照强度,该函数通过adc3_get_result_average函数得到通道11转换的电压值,经过简单量化后,处理成0~100的光强值。0对应最暗,100对应最亮。0 _! {) ~. W# k/ r
2. main.c代码+ |* e4 h. y: c" A2 v; A! R: K" h3 Z
在main.c里面编写如下代码:
; v) z/ o7 a7 ^" _, m# v- M
7 h7 O- S4 L# B+ a
  1. int main(void)+ J( u4 ?: I( X7 W
  2. {
    ; O% u1 A$ `+ D8 W+ E$ t" I: b  D
  3.     short adcx;6 m, I8 w( N1 C, Q( M0 _7 e) x
  4.     sys_cache_enable();                             /* 打开L1-Cache */
    ( a5 C$ l+ L* G" n- s
  5.     HAL_Init();                                      /* 初始化HAL库 */9 [; D( c8 ]6 O4 z
  6.     sys_stm32_clock_init(240, 2, 2, 4);         /* 设置时钟, 480Mhz */
    ! d& Y% l2 `4 k0 A* N7 n
  7.     delay_init(480);                                /* 延时初始化 */
    & @; u" t& m( f8 x7 V; e4 k+ H& |2 @
  8.     usart_init(115200);                            /* 串口初始化为115200 */
    7 P+ J( d7 C7 K* E
  9.     mpu_memory_protection();                      /* 保护相关存储区域 */( K$ Z- O3 C' M! Q
  10.     led_init();                                             /* 初始化LED */3 e7 @+ {/ z" L( }$ z" ]
  11.     lcd_init();                                             /* 初始化LCD */
    8 E/ R4 s: p8 H" l/ x+ U3 S
  12. lsens_init();                                           /* 初始化光敏传感器 */* N7 \6 I" _4 ^# Q7 D
  13. ) T2 H( j6 x- `2 j. l. U( D5 j
  14.     lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);8 ]5 q( O% i6 r% z9 v5 D: Z' Q! w# n
  15.     lcd_show_string(30, 70, 200, 16, 16, "LSENS TEST", RED);
    + Q& y8 ]+ A. W) m) n; T
  16.     lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    ! T0 M# ]: a) T9 p9 n( i
  17. lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);
    % k5 ^! l3 n( v; G
  18.     while (1)
    5 w4 X0 H# C+ k! y
  19.     {
    0 r, o( B$ u, B3 e
  20.         adcx = lsens_get_val();
    % g( K4 R" F' M5 @3 {4 o& j: G
  21.         lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 显示光线强度值 */! R& c/ j, @  k2 u5 N* U
  22.         LED0_TOGGLE();  /* LED0闪烁,提示程序运行 */
    . o& L  o* k% u( i4 m1 X4 x
  23.         delay_ms(250);
    / ]) w1 M/ b- c# p+ w" z: u, I
  24.     }- x/ I& i( `7 O
  25. }
复制代码
1 L" B4 r- P7 |1 a! y
该部分的代码逻辑很简单,初始化各个外设之后,进入死循环,通过lsens_get_val获取光敏传感器得到的光强值(0~100),并显示在TFTLCD上面。3 K* m/ `4 U! y( m- Y

- A8 S! ]. r! f. w" I& N33.4 下载验证
- N- H7 [2 R2 P3 l5 ]  S) f将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示的内容如图33.4.1所示:; a& B+ D7 c% a$ W6 _2 c
) S* P% L! r. L9 [, h
f8b57d6edc1340cda1e471d5bb2a64e6.png 8 Z- \6 T( E0 \

# K* z# ^& m# l* L. I: s" F图33.4.1 光敏传感器实验测试图  |  K: N: J: D4 `# H
我们可以通过给LS1不同的光照强度,来观察LSENS_VAL值的变化,光照越强,该值越大,光照越弱,该值越小,LSENS_VAL值的范围是0~100。. w3 f2 q& L6 I  u6 w: Z
————————————————
3 L* b8 L" G& e版权声明:正点原子
+ Y( M6 J. ], W/ R- n) D9 b8 G4 d+ a. D7 _# z, A

+ [4 j& `& J+ d, x5 d
收藏 评论0 发布时间:2022-10-7 21:33

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版