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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-7 19:19
器件选择! h( t+ Q4 f# F" B3 j) i: i6 Y
硬件平台选择STM32F103C8T6最小系统开发板。. \9 i7 H0 x9 b$ \$ B$ f' F" L
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。
* p/ L: t1 l* Q4 P6 y- A光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。1 g. }5 H& a0 s$ C
注1:数据下载使用ST-LINK下载。5 b  E% d; t4 V) n* j8 z2 i
注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。
( p# z8 U4 Y- t5 J
3 |" k0 [( Q5 U" q3 T

  F. {- L3 B3 B- O# D6 _& h! h: x4线光敏传感器介绍7 t, N5 d: ?+ T8 a* c
光敏模块原理图
& L* o2 l# n) C1 [, H1 e
0 O6 E" G3 t  o% Q) Z' A8 h' T5 d
fef84a4cb3b94d53b17bd33538eb8572.jpg
- M2 y2 g6 L* I7 S0 x2 n: W' D
: Z/ B+ Z8 k" |4 x" `
  f7 {9 }0 `8 j, s* B3 ^
光敏模块实物

; [0 ?: H' @! ^' d+ t' V- T  c) \5 [1 t
a40a9814338a4295b4e3da05ed2e17e0.png ; U7 P+ L! d; ^7 }
( U( ?7 R, o. W3 n2 v
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。* a1 x( i; ]( `# ?$ e, t
3 u( f0 r; R5 r0 n3 H9 i

" {1 M/ c$ e1 u& l8 A: ?1 Z光敏模块引脚说明
1 |7 k: O- v' e: k, t& uVCC:电源引脚,接单片机+5V或者3.3V。6 q. L) x& I# m0 Z2 I
GND:地线,接单片机GND。
8 |1 r# ]* [+ v; P$ f* KDO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。
- r/ X& {* m1 D0 J6 a* AAO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
3 Z5 @7 t. p! s8 L8 ^* p1 E; t/ y- W. |& _

& q" o) N% X: }/ j+ fCubeMX配置+ B, K3 M6 J5 ^0 x/ |
1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。% f3 t5 E( ~3 L/ J7 Y
* J" h- `5 R! r5 ]
b34ad06879ff45f083d3a6f18a4a84ee.png
+ _/ J0 [& I2 u7 l& z$ M
/ G( I. Q( y: R2 \
2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。
; p$ w& ^5 E1 N8 D( ^/ z9 y7 F8 z. [+ S3 C$ M+ O
0645441d7e824b15b554900be5de6826.png : F* `+ r# W" |# w# r& Y, y+ S

1 V4 W+ c4 p4 e" u- v时钟配置选择外部时钟
; g+ t0 v. v; `/ {; ?# ~; ?
/ a0 _& b9 |( }& a* n" {. A6 p
885ca50819ea47b9bce27aeee00b3bfe.png # P; }! ~  L/ n$ G' c
  Q  s7 W5 ~1 L
进入时钟配置:& _) H2 c7 i- T7 [! I
; Q4 o3 I0 T$ z  k$ j* ?/ D9 s" Y
3079b8857c364eea83f158ee0c72512a.png
' Q+ r! X0 R! W: b+ P4 @, j+ y
+ q8 d' j+ b* I9 v; {2 V, E8 N
3、ADC相关配置,使用PA1脚作为ADC:
0 K6 k: y7 f" _/ w& k; v. Z/ X+ x! Y+ F
0 P' a1 b7 d% U. }
d5633e418c9e47ecbddf52870691c263.png & @- {7 p" h$ y6 X: w
7 {" g3 t& W% Q6 O" c2 t
使能配置:1 y7 K& V& u# e- P1 s8 C
" s/ h; ~; @( w4 u0 c; I! n( H
f0f8215ff2fe4039b5bf580a9f8b4875.png ( X& R+ J& K: e5 h
e2bbceb3937e4c24ab7529285d1adcfb.png 8 a' q, Y$ f9 }/ d
8 m' i/ @! b; M! K0 l
为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:
# G* J/ r6 Q  P5 I) ~; H- R+ U& J' A! }" z
f0fde49c84b34806bbe405e2cc23bd10.png 2 F6 e% F( _) u* q0 O  V

2 o1 a) V& Q; y. b同时也对其中断使能配置,勾选Enabled:; p' A8 |) d9 W9 s% z+ ~3 |) z
" l/ z& [" y9 V$ \
e8edbfb6d4004a7ba43ea1aef25699d4.png 3 Y+ E# A" B5 |  ^' v; a. h* `* [

2 W8 M, _0 W) n7 v5 c后续配置:7 o6 q: g. U7 [/ j- k

$ E8 |7 ]  ~- y3 R) p* q  c0 O9 x
b535f82955914f23a54eb5dfb7c34233.png , m7 W: v& Z" O4 t8 O

, a$ k3 W& H# a" T/ {8 W

) n  I. m9 a0 R. R5 g" x6 }. u* q8 w5 y! X4 D6 |

5 O, a2 O8 t0 q7 I* l( k  d8 c8 U代码主体部分
5 a1 G- N& }8 k6 V1、引入头文件,为后续使用sprintf做准备。
1 N; D, [$ l7 `; v/ e
  1. #include "stdio.h") b" F$ {8 w4 E- S. G8 E
复制代码
' U5 _5 v. F* O1 j, E3 k
2、变量预先定义。) T5 p% ^% Z! t% Y
  1. uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值9 r( K4 J6 p: g, j4 r+ ^
  2. uint8_t str[64];//给定一个数组空间,存放sprintf的内容
    # ~, z4 K& d1 P3 ?& T
复制代码
' P3 e! \0 R1 j7 ]3 j
3、数据存放与发送。
: p  B, o& j. A' e1 H; _
  1. void UR1_Send_Info()
      ^3 q  S& i) f  C  ?% a2 Q7 L
  2. {: J. O; q! k* ^% w6 Z
  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把将要发送的内容存放到数组
    8 r; E2 M* z/ m6 n% n; s
  4.         HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口" z! b, [3 j; P" s
  5. }
    7 A4 L2 [9 X0 t8 L+ i
复制代码
; K$ e7 T5 w( N' L
4、数据的获取。* O" m( n) x, m; i' g' P- K
  1. void Get_ADC_Sample()! d& h% P" ^) `4 B
  2. {
    6 t  R, W4 s( N1 D. e
  3.         HAL_ADC_Start(&hadc1);//打开ADC转换4 e4 ~5 v' c' l" C5 L
  4.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
    ( m7 Z9 V/ A) Q
  5.         {
    " |) Y" M0 e7 `/ _
  6.                 ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中& I! l8 q* `" U
  7.                 ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数5 l) d: j8 ]0 D
  8.         }1 ~. Q, F1 }0 A
  9.         UR1_Send_Info();//将上面数据进行存放,发送到上位机
    + @% V/ s6 E; C& Z8 X
  10.         HAL_ADC_Stop(&hadc1);//停止ADC转换) \3 W3 |" t0 x$ Z6 k: ^( D" q; F
  11. }9 [( J' _/ ]+ ]4 \6 G9 b
复制代码
  I4 L- Q1 j4 l
5、在main函数的while循环中加入写入的代码
( o' u2 B* k' a* ?# ~
  1. /* USER CODE BEGIN WHILE */- c  P; e' J, j4 S# {) J
  2.   while (1)1 f6 a- [( X  a1 i
  3.   {* c7 H" w9 r1 t$ B# P2 o
  4.     Get_ADC_Sample();
    3 B; S- D0 T1 J
  5.         UR1_Send_Info();) t/ Q- G. K3 E! U
  6.         HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
    , L  l' H% v8 u. q
  7.     /* USER CODE END WHILE */1 X3 c" A& z4 C# c( c$ \

  8. . A* i3 y0 F2 d) T8 @. B
  9.     /* USER CODE BEGIN 3 */0 a0 j# T$ G/ I4 h
  10.   }
    9 T3 L. f( I* ~& e$ i2 a
  11.   /* USER CODE END 3 */
    ! @5 n  Y- }4 K" w2 S
复制代码
0 {6 b7 t% Y4 E% r0 g2 r
结果展示
  U3 _! B6 O' ?, }. z
& h- @# _7 H9 T7 p  o, U
bc1c1be709b6447aaf62454cb049faf8.png   o5 @, a! r2 |5 K

& q1 d- w, _' @+ i# u# U! I- C& M————————————————) L% [1 x, q7 }4 Y% ?& D
版权声明:xiang--ying& O2 S7 ~; [' F) T, ]0 Q2 A2 o$ r
如有侵权请联系删除% R# V" W) y) d$ x( `

; I% G) U2 B4 O( n$ y9 J% x( [& T7 I# b+ f0 Q1 _7 Z& ^: ~
收藏 评论0 发布时间:2023-4-7 19:19

举报

0个回答

所属标签

相似分享

官网相关资源

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