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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-7 19:19
器件选择+ m9 r! |, B# b) Y, ~
硬件平台选择STM32F103C8T6最小系统开发板。, z% x' N. R3 S) u# T
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。$ K! _8 L- i, [
光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。
/ i, [/ a! {% y+ }' O" ^3 a# s  Y, [注1:数据下载使用ST-LINK下载。/ @0 p% x; Z7 T" C
注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。" C% d! M8 y, Q: i8 X- V
/ j9 f" M7 s  h& C) Q5 h
7 Y" a. n4 q+ r0 b  `
4线光敏传感器介绍/ ~8 Z" V! Z- C2 Z! U- Q3 f
光敏模块原理图
0 I& I5 G) y: a: m3 e' P& n: j' J% r- B/ @; T) u3 M
fef84a4cb3b94d53b17bd33538eb8572.jpg , R. F0 T. U( A; e5 D

" U5 K4 S; `2 X. `0 ]

. X4 Q4 ]5 I4 w0 d3 B光敏模块实物
) T# x- g7 p  b6 C$ N
  e9 `* O/ G! V
a40a9814338a4295b4e3da05ed2e17e0.png
- `. I5 I% X, l# {2 [/ e

1 f5 ]% X/ A7 _光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。
7 s7 ?- c! V2 I/ i4 R
/ z  u7 G  t0 H3 d0 F- F- Z
. d( l  G0 r" O# M. A: A
光敏模块引脚说明9 m$ }, O7 k$ l" W5 [1 F" A+ ?
VCC:电源引脚,接单片机+5V或者3.3V。" l" [; P, ?$ T2 d
GND:地线,接单片机GND。+ r. a9 t  ~% q& X
DO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。
, i5 a  d6 F9 v* pAO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
' e: k  k- h2 K
* `4 O7 ~& G& ]  C7 Y5 \; V

# i+ t5 Q. R0 R+ ?! j- UCubeMX配置
3 ~3 C, Z. F" M/ X, ?1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。9 C! N! k% v; i/ G& J! G* T
2 I. C+ l" q, z
b34ad06879ff45f083d3a6f18a4a84ee.png
& s/ ^. i4 o$ [
- r$ z2 B" {( e) H
2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。) i) _+ L. e0 L9 E3 f, w1 s

* f5 J  }0 _- G' l" e. Q/ P
0645441d7e824b15b554900be5de6826.png
+ ]9 c! Q7 s& w5 x5 }2 A9 @" Q( b
( N3 {% L6 x; X: f5 s7 S$ `' K/ Q. ]
时钟配置选择外部时钟1 y! I. v7 }- c. o, E4 {, S

& C, t: C# j4 k5 D6 x* ]
885ca50819ea47b9bce27aeee00b3bfe.png : R/ r7 V; }: b8 b2 U3 p6 }/ D

5 d" W) f4 m0 t. T( a7 L进入时钟配置:
" X  j7 o: {# M/ y, E2 h7 s7 @$ j; I' z2 O1 X8 J5 `. C
3079b8857c364eea83f158ee0c72512a.png
: Q* t( F( @$ L% g  k
/ b; @! `+ b/ B" \# d4 E5 J# N
3、ADC相关配置,使用PA1脚作为ADC:8 X4 W5 g3 D% C1 F

; y. s/ @% A0 `; o/ H5 E; W
d5633e418c9e47ecbddf52870691c263.png ; V( x% N) S4 m" x! o' t; \

+ K! G3 o1 |3 L3 ^使能配置:
9 I  w1 }" C6 J: ^
' [# @) @* U- I7 d4 N
f0f8215ff2fe4039b5bf580a9f8b4875.png
. t6 b3 X3 }7 N/ a3 k/ O6 e e2bbceb3937e4c24ab7529285d1adcfb.png
% |" w& A! ?! L

2 B  L( n' O6 h$ J为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:" t; D. ]  ^/ ~3 x1 p& X" b8 A

, E# M0 T$ T% h: m+ `
f0fde49c84b34806bbe405e2cc23bd10.png
' z3 h4 d0 t& v" C) m, z

8 d9 X! `2 t3 s; j5 G) R& ~9 @同时也对其中断使能配置,勾选Enabled:
; Z  ?( ~, Q' M. Q& ]/ q+ h* O/ q6 {
e8edbfb6d4004a7ba43ea1aef25699d4.png
: w- z( G" R$ e, w9 V) o2 @& O8 N, l
3 ?$ \5 X& c- m) b& J& J
后续配置:9 `8 I7 P: B. r
. d) w' l% b# f5 f
b535f82955914f23a54eb5dfb7c34233.png ) A6 }( U% o. f/ ?1 d" Z  W
, T/ {4 [/ S; K
. d! |7 W; y: U4 o- d. U
3 \- S& |. }/ L# f) w- Z
! w5 u* R( |. S& D
代码主体部分
% |1 W6 A) z% I; o( }3 g1、引入头文件,为后续使用sprintf做准备。  [. r7 l6 [5 a
  1. #include "stdio.h"1 {1 r  I! L' A3 X: A
复制代码

% g* e. Y+ p( j+ t) J& L2、变量预先定义。
- T3 E" `% [8 F+ n# l( {: G
  1. uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
    8 |3 k; Y$ }. B3 ^% U) z
  2. uint8_t str[64];//给定一个数组空间,存放sprintf的内容
    ) j* r8 ]9 G/ a  ~0 a
复制代码
! d' V3 ?) H  n
3、数据存放与发送。
5 X; Z( ?6 S8 Q/ r, u  b, S
  1. void UR1_Send_Info()
    2 g  z5 O$ H* y* E! ^/ @
  2. {
    ( R: P  k. u2 j: P. d$ D
  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把将要发送的内容存放到数组
    ! D8 n9 a% R- q
  4.         HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口' h' @1 r, x" l. s
  5. }
    ' m, c3 \: F" v3 p8 R, E5 |
复制代码

  M# p: a. ?8 `& N% U4、数据的获取。
5 l/ `0 O' T& O
  1. void Get_ADC_Sample()
    ( ^: J2 U5 q! M* |4 m1 S: ]
  2. {
    , e5 z) T+ F* x
  3.         HAL_ADC_Start(&hadc1);//打开ADC转换+ W, F% y0 Y4 y( U) B% b# |( b0 o7 u
  4.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
    ; ]- r2 m8 @3 [1 w- ~
  5.         {3 U. d$ p; L) g2 R" q- ?0 H
  6.                 ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中
    ) p0 F# L8 w3 e' F& e
  7.                 ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数; Y# W8 \6 ~; b
  8.         }
    / q9 p4 u5 ]; ~0 ]% ^
  9.         UR1_Send_Info();//将上面数据进行存放,发送到上位机
    % E& ^7 g# n& q0 x1 S; k( J
  10.         HAL_ADC_Stop(&hadc1);//停止ADC转换
    8 M3 C0 u, B7 M, N* K
  11. }9 D4 v( e9 E/ A7 \  J* g1 g
复制代码
( m' }, a3 p9 ?7 b9 _5 P
5、在main函数的while循环中加入写入的代码0 ]3 ~) A0 N% v* |, ^* q
  1. /* USER CODE BEGIN WHILE */1 W7 ?, ?( b) |. q
  2.   while (1)
    1 a4 l" o8 w, S& |
  3.   {
    ( |' T4 ?/ ^- A! ]: s
  4.     Get_ADC_Sample();
    & J7 l; _. |! m% r. r: j1 v  d* U
  5.         UR1_Send_Info();2 {& t4 J+ K' ]
  6.         HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
    0 R( L' }$ h% y
  7.     /* USER CODE END WHILE */! W9 g. G' M' I1 s9 ~
  8. & h7 Y; u; d3 r; ?* z, G
  9.     /* USER CODE BEGIN 3 */
    9 ?- b+ s; P) u' X( S. {
  10.   }, z# v+ @( s2 Q( J+ \# O8 w2 V
  11.   /* USER CODE END 3 */
    . W* Y4 n) E4 D$ y
复制代码

% [5 ^" P' N) h" o: a1 [结果展示  }% O* A8 w. o  Z2 l2 _

6 \% i5 z9 X7 M' H* L* g! M
bc1c1be709b6447aaf62454cb049faf8.png , Y  B& l0 v6 r: K
) M1 A" u" L$ S% p3 v, t0 y. x
————————————————4 |5 Z6 g6 V5 O2 ?# c" w, b# g
版权声明:xiang--ying
2 {' X( C0 H3 ]- M( B% C如有侵权请联系删除2 L; T+ O; J& |8 a) ]; r  z

! N8 m  r( n8 z8 |, {3 m$ p
$ M+ \2 x, P5 N
收藏 评论0 发布时间:2023-4-7 19:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

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