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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-7 19:19
器件选择
0 {+ Z  G7 U: u* @8 I) r& P: |1 w7 Y硬件平台选择STM32F103C8T6最小系统开发板。, d4 S4 p. Z% r6 C6 C: K
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。
3 ^+ ~; o4 P  C9 }! ?. o, I$ R2 G光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。. B# R8 X. S8 D9 {. i5 k, l: @
注1:数据下载使用ST-LINK下载。
4 K( @0 Y: m! @' n& q注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。! Z+ x) G$ X1 G

5 ]4 k! B- P$ X
- `  L+ y; z( E8 a& _  K
4线光敏传感器介绍
7 H6 e- M# x2 \2 Q9 ~: p; x光敏模块原理图
& o6 D, _5 L; G; @/ F/ z$ {; c# C& i3 N
fef84a4cb3b94d53b17bd33538eb8572.jpg
* S! {  F8 w$ M& S6 @1 ]% q# p. r
, t2 J+ c( N" S, L$ g- r
. Z  ~5 T2 L+ _7 U% h4 S
光敏模块实物

7 `" G0 `: J( E/ ^* k: k! m, q$ h7 X' d; X. c& x# `- ^/ ]$ T' P
a40a9814338a4295b4e3da05ed2e17e0.png ( P- n8 `" f: V" ^1 M* l, Y
1 W3 p( n/ Y2 g! g- z0 e: Z5 |
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。& Z6 h! I7 m: J( \" d8 W* s! {
! M" u' I. z7 H/ n* ~. D
. A" U/ Z# t' \/ Y+ u( v/ p
光敏模块引脚说明) d$ w. `6 t' i4 S# N
VCC:电源引脚,接单片机+5V或者3.3V。
/ Z5 l! j" x# O4 jGND:地线,接单片机GND。: s9 B, N6 L" Q. H; J5 _- Q: @8 w
DO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。
4 {" \- u8 M, f$ ?AO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
' A% J( Q2 H) k& W8 `4 X3 Q, p: a' A% t* Z7 u

4 u. G- Q$ C0 v  z$ q& KCubeMX配置
; j5 s2 K% l4 F% O" y4 N1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。
4 u$ o" S1 w& w( k; R' w" V" M$ B& |' J- b
b34ad06879ff45f083d3a6f18a4a84ee.png
; k0 l  `1 }# x7 _) f1 a

( a8 V0 b. i' U/ O, P5 G1 a6 ^2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。
. t, o; a4 Y+ q2 S* ^6 D% {
8 A! R$ k) k+ e* s4 F: `/ i
0645441d7e824b15b554900be5de6826.png 9 O2 m& Q, u# Y* Z6 G# m
5 P! r2 ^6 }& k+ }# @
时钟配置选择外部时钟- K7 P: d0 H3 E# d7 ]  b7 h

  O6 ?" N( M% X) h7 I
885ca50819ea47b9bce27aeee00b3bfe.png
9 t# [6 D3 M5 Z: M
) @! g; Q& _( l8 y
进入时钟配置:1 a* Q% i9 b. b# |
4 R  P# Z5 Y4 q+ U3 \6 D
3079b8857c364eea83f158ee0c72512a.png
  d  p* E; D( y9 J6 C" U

1 D% R9 c2 V) J; d3、ADC相关配置,使用PA1脚作为ADC:6 A# a8 g$ {4 b) n$ w
; ]; ]0 k; R8 V0 @7 d
d5633e418c9e47ecbddf52870691c263.png 4 e+ ~2 H/ P. t9 i/ h% z/ c/ `

2 ^6 v% G  n! r: I% |  E使能配置:
& @# h  j' ^4 S1 r0 w. ]; A1 z0 F
* r3 y- p2 r% u6 l6 o" M! x
f0f8215ff2fe4039b5bf580a9f8b4875.png 1 a6 N% q( R: s# K- _6 b
e2bbceb3937e4c24ab7529285d1adcfb.png : \1 e* `7 I3 V% E, N

8 b2 u6 u7 ^# Q为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:
; U+ O6 d9 S+ r" y; d6 I$ R. I! }9 Q) S( ^
f0fde49c84b34806bbe405e2cc23bd10.png
7 p; q. @! F- F9 w; |- r  M' b
) g  h, z# D% \' N) t, q$ o
同时也对其中断使能配置,勾选Enabled:
4 {* L( x0 N( q
1 I6 e; U7 x& W% \& I2 U$ ~
e8edbfb6d4004a7ba43ea1aef25699d4.png 8 _$ t, W( ]. p8 [) ^# X( E
' b, R: N. X0 v4 k
后续配置:9 m; P" s0 Y; V0 P2 V
& r( l4 s3 U  c
b535f82955914f23a54eb5dfb7c34233.png
% Y  S* I# j) x6 x% `% Y- ^( k' C- h0 j$ Y$ z5 m( _# `
* o$ _: c: |4 }$ S7 S! e9 g* e

( c+ m. q7 S) J& E' ]( G

8 n% C, Q; a' A! p0 }代码主体部分
' `" G' R; I- {+ c( u) G' Z1、引入头文件,为后续使用sprintf做准备。
5 a1 Y, j9 F; u$ r: X( a
  1. #include "stdio.h"
    " R3 y8 b! ~. ]$ G
复制代码

- @+ M& m, V8 k! c$ Y2、变量预先定义。
' k7 m% E: g! \& V+ K
  1. uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
    0 ?" M* u' r# c. f  t
  2. uint8_t str[64];//给定一个数组空间,存放sprintf的内容
    3 b6 O# t- F; p/ \  p" c
复制代码
, D" C: S4 ?  c8 {# H7 [( C
3、数据存放与发送。" Y' m+ I4 G; t( @
  1. void UR1_Send_Info()
    " U  m0 |+ U) Z: v
  2. {, k' s9 V% \# l7 Y# l; y
  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把将要发送的内容存放到数组! J( u* _" D  I3 ?) x
  4.         HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口
    7 O" i$ k9 s$ s0 y
  5. }0 T0 H# [9 v. t9 w
复制代码

$ f+ }; u3 c. g; S4、数据的获取。
0 }4 M7 j6 k( s# ?1 c+ s+ Z/ O
  1. void Get_ADC_Sample()& n/ Y! |7 y* E$ f
  2. {
    - ?' _( r* ~! X5 S6 H
  3.         HAL_ADC_Start(&hadc1);//打开ADC转换
    4 Y- L: e4 r# l$ W8 g; t% N/ [" t
  4.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)) J" }2 l. @, t4 q% E7 F
  5.         {9 j) [0 t/ Q8 B! V. Y# C# }, |
  6.                 ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中
    ' _& l1 K2 G. C$ T+ V7 j
  7.                 ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数- I" K- O1 M0 t. ?7 k3 k5 q. i
  8.         }, @  y. ~. Z9 g% C: C  g3 r% A6 @
  9.         UR1_Send_Info();//将上面数据进行存放,发送到上位机& E+ C$ [4 w$ w' M
  10.         HAL_ADC_Stop(&hadc1);//停止ADC转换
    ; N% R* l4 V  G  c
  11. }7 `3 h7 Z: \9 l- K- C5 X/ k
复制代码

0 B! p9 [, c3 f( R4 ^8 x) q6 g5、在main函数的while循环中加入写入的代码( a/ h5 O; D0 g2 Z. p$ P# u
  1. /* USER CODE BEGIN WHILE */  l, M% E* Q8 j$ i7 n
  2.   while (1)
    5 i) S8 g1 n# u
  3.   {7 w# t( ]+ }7 c& e8 p6 ~
  4.     Get_ADC_Sample();
    2 O' G4 |) n0 k( A4 @/ d1 V
  5.         UR1_Send_Info();0 D; d- Q, f$ J% d% F$ \! y( ^3 ]2 A6 I
  6.         HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
    & y" ]! I# i$ S. o" B7 C
  7.     /* USER CODE END WHILE */
    - k) R! V& \) q
  8. . z8 `: w  i6 w* l
  9.     /* USER CODE BEGIN 3 */
    * K* X# \1 u& K+ E& J
  10.   }0 y7 o0 J; B) y$ m) U
  11.   /* USER CODE END 3 */
    5 C- M0 X3 o/ e% t$ v
复制代码
- A4 Z. y) ]3 V* v
结果展示  N' `3 f" r# \+ I! L+ `
9 f: ?, a4 o) h, i
bc1c1be709b6447aaf62454cb049faf8.png ) w8 ^$ W& }9 }# a/ o% i/ M3 K/ k# O
% ?7 a( }9 Z! K9 R
————————————————- M; X# _: i7 i2 l: z
版权声明:xiang--ying
+ Q# V, Y% Q1 U& ~如有侵权请联系删除4 f* b6 k+ a$ n( o9 U

+ v/ V4 k: B  s5 |3 h! Y4 l* A7 W/ g8 n4 A) }
赞 收藏 评论0 发布时间:2023-4-7 19:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

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