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

基于STM32的光敏模块经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-7 19:19
器件选择; x! q  c6 w! R/ h* I  Q: Q6 ]" y
硬件平台选择STM32F103C8T6最小系统开发板。5 C: r" \* Z. G
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。! I4 x3 R4 X2 x* m
光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。1 d* I/ h( `0 A
注1:数据下载使用ST-LINK下载。
8 Z+ S( Y# d; t1 ], q. l注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。9 G0 Q1 C! [5 l" E: ~6 g; t
: y1 S: y8 e/ k6 J# @. \! W
5 h. c1 G, b1 j: O7 }3 g2 v
4线光敏传感器介绍
7 w# }  `" t$ `4 Y光敏模块原理图
6 r2 F7 f9 o" L- v8 C2 t- `- A/ o: ^- t" @
fef84a4cb3b94d53b17bd33538eb8572.jpg
7 ]( {) {/ W3 k3 @
3 r8 k) p; |$ B" z

% R: A8 P( O# z0 x光敏模块实物

. p3 p/ B3 w; W8 b5 m/ \" \; P: a+ s# T4 W( l
a40a9814338a4295b4e3da05ed2e17e0.png 3 x5 ^! K7 ^! e0 P
0 o! e  ^6 j% b& t0 u: C9 j, L# E
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。; Z/ M% A* d9 j- l/ G

+ }- z/ i0 v* p' ?2 H
4 m- g2 @' R" U5 p
光敏模块引脚说明) w7 |9 Z* }6 _# u
VCC:电源引脚,接单片机+5V或者3.3V。
7 p5 e: e" Z& B# wGND:地线,接单片机GND。
& p" w) Y% c$ l% BDO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。! n$ H; M; D  E3 U6 Z
AO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚); C0 \$ `; ?8 H4 K6 R
8 {+ W2 s* V9 v1 N6 ]
& s! P! h: ?8 Y% L
CubeMX配置/ J. z% _; B& G7 Y( T7 J
1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。, P1 K/ U# Z" C& E9 b
, ^; z; {4 ]& x+ B3 p
b34ad06879ff45f083d3a6f18a4a84ee.png
$ B4 Z; w! Y% z# }" b

$ X: L  H) r" u3 `$ x2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。+ h, M4 d0 q+ o8 a9 C
5 X' t6 a0 U) @# S* S  @
0645441d7e824b15b554900be5de6826.png 1 x8 m! \& V6 |) t. n

3 s9 F) `7 r& J4 ]1 }! v) L! K; V时钟配置选择外部时钟
3 I1 N, x! ^, g' x1 p9 y; N! J5 \; J( L2 j% D. M( u# O
885ca50819ea47b9bce27aeee00b3bfe.png
# v" ~8 M' n5 B
1 T: a$ t# z+ R$ c+ y% s% q
进入时钟配置:
' p% w1 z) _# ~
  o! _& L7 g9 L3 J& M% _0 b
3079b8857c364eea83f158ee0c72512a.png
! h5 j+ i# E, w' @
" g$ K. w) k& P- l! v$ g; K
3、ADC相关配置,使用PA1脚作为ADC:
( m: M3 M. v3 M2 ]
* [8 S; H! C. F- v5 g$ t9 a
d5633e418c9e47ecbddf52870691c263.png & C. E# q& s# N- X7 H

9 e* ~) X" j* m! ~# ?' p' w( x- m( g使能配置:- a) b6 \, h& V2 G1 z

1 q4 v9 X" z3 e$ M
f0f8215ff2fe4039b5bf580a9f8b4875.png
1 O6 E# U/ j8 m# m; s e2bbceb3937e4c24ab7529285d1adcfb.png ) o1 ?# [: r0 v& i& O
( V) D0 u) e2 G/ i
为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:
' S) Y) V$ q' l/ U) m* J
/ L  B5 L5 S8 d2 l  a4 Z. C
f0fde49c84b34806bbe405e2cc23bd10.png
) y8 |( V- _! n( M& W+ C( O# @

" B" P( W& `- ]5 @" F& m同时也对其中断使能配置,勾选Enabled:& @' ~, v* x: y
- i' m9 s! ~( ]% w' o
e8edbfb6d4004a7ba43ea1aef25699d4.png , Y* U& w& W: y  q9 O

$ {0 j! ~- U6 [3 B6 L! _后续配置:  c, w6 U2 g6 H% @  q* o

& Z& |2 ?. N. _. f$ A; w
b535f82955914f23a54eb5dfb7c34233.png 3 J" f* M' d9 Q- q2 A" q
; V3 O$ _7 j0 _( o! i# _7 S( ^1 n/ m

3 ]7 i6 H& y' }7 v# W' G  A5 g5 @; M$ ~- B# i: O

' _1 x" `) W0 K: B7 {: q9 _5 _9 Q3 D代码主体部分# C) N, y3 B( Y
1、引入头文件,为后续使用sprintf做准备。; D" L9 ]; S1 @$ B4 |' U8 ]7 v
  1. #include "stdio.h"/ |7 k" O. S0 H" a) w( u) E0 h
复制代码
% w& ~9 F3 [5 P9 [1 s0 m% i6 l
2、变量预先定义。
: v, t+ v7 f: M6 k' _+ u% T
  1. uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
    5 ^; a- Y9 `1 e/ {2 f. ]3 ~
  2. uint8_t str[64];//给定一个数组空间,存放sprintf的内容' S! `0 A/ p4 i
复制代码
, N5 ^! `( k8 t! G4 _1 u
3、数据存放与发送。
) G2 b' K3 j$ F* g4 }
  1. void UR1_Send_Info()6 B- |# {3 }! M" |' C
  2. {
    ) _: i. l# O, i" R
  3.         sprintf((char*)str_buff,"\r\nSampling value:%d,Voltage value:%d.%d%d",ADC_Sample,ADC_Volt/100,(ADC_Volt/10)%10,ADC_Volt%10);//使用sprintf把将要发送的内容存放到数组
    3 E9 i; w" ]0 X5 L- ^- c. Q. X
  4.         HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口( I* h7 G/ _5 Q- ^9 H- J' F& `) W# W
  5. }0 G& l$ t; x$ ]2 R- V, C- M
复制代码

( J: q5 {' ^: }, \  q& T4、数据的获取。: W$ w% w! p# B. H. v
  1. void Get_ADC_Sample()2 @) D7 l% V# y7 u3 _& [  V6 u
  2. {8 o5 D  X. J* h% M
  3.         HAL_ADC_Start(&hadc1);//打开ADC转换9 [% U; e2 }- x: o/ e' n" a" P, Q
  4.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
    4 P" O9 W' Q+ K* {
  5.         {
    ! f" G- O1 `6 `/ [" O% ~
  6.                 ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中
    9 @" `. K6 c0 i
  7.                 ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数$ q0 d$ k+ b/ z1 ^$ a# _+ A3 E1 F% V$ |; E
  8.         }
    ) h. E. ?% [+ a6 q. n% ~
  9.         UR1_Send_Info();//将上面数据进行存放,发送到上位机& `* I  V7 o# V# u. U. Z
  10.         HAL_ADC_Stop(&hadc1);//停止ADC转换
    ( Z4 n, T. Y& k% s" c: r
  11. }
    0 @" u: ^1 z. Y: g7 C& X
复制代码

$ b" D8 N& c  g5、在main函数的while循环中加入写入的代码
8 F1 c8 m1 k; g- E7 b2 v) v
  1. /* USER CODE BEGIN WHILE */. N1 l2 F( P0 c  O3 @- A
  2.   while (1)7 S+ l3 T% E6 w# O* N
  3.   {
    8 z' x) s+ v) Y
  4.     Get_ADC_Sample();
    # U7 M8 X$ K5 m9 P4 M" O4 A% V( m
  5.         UR1_Send_Info();
    8 w/ g# Q( K. R7 a: ^' v2 c
  6.         HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
    5 d8 ]5 Q, g  O7 |+ q9 q
  7.     /* USER CODE END WHILE */
    / i8 G6 I$ s' G( \0 V! L4 I

  8. 9 |; K2 T( {& q2 T2 o
  9.     /* USER CODE BEGIN 3 */, \) c' f( F  ?. C
  10.   }
    , A6 [$ E1 c2 [* D% z& r
  11.   /* USER CODE END 3 */+ N- z$ p3 S3 ], Y# L$ v- a
复制代码
6 Z; Y4 ^- [8 X$ N" i' {" J; y& v
结果展示+ x# u# t3 N" K! u  k$ S# u  b$ h

7 }) z$ i, h2 f) ?  f; \8 p! O
bc1c1be709b6447aaf62454cb049faf8.png # |% Y2 Q( t/ [: T

$ `  u: n& H' \: M6 J————————————————
. t5 F9 W: R0 ~4 z7 F版权声明:xiang--ying
* L& E5 T3 l& ]9 u3 a如有侵权请联系删除
$ B8 y1 _1 B* j6 h1 ~6 l' m7 ^" J
& N/ V% W6 ?4 |5 g2 L: X2 V% l5 U) X% O2 l+ l1 S$ o1 Y* T
收藏 评论0 发布时间:2023-4-7 19:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

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