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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-7 19:19
器件选择
+ ?& v7 N. l0 Y% s硬件平台选择STM32F103C8T6最小系统开发板。+ ^' K) x  a' B8 g! Y) g
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。
1 J+ r$ v9 z. M0 ~. k: I4 J光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。2 C* o. L3 D9 }  l
注1:数据下载使用ST-LINK下载。0 z' o! `' M  ?$ D" n9 f2 T
注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。; w7 [5 K- Q# @% i- W
  s2 n  x% I+ A% T: c! L
2 ?3 w  \, ~: \' S
4线光敏传感器介绍% g/ ~$ M1 T4 B' s) q# M
光敏模块原理图$ K' `& H$ d2 P! s3 f* o
$ Y/ Q4 A. q# p2 v) M7 ^
fef84a4cb3b94d53b17bd33538eb8572.jpg + C" a5 {# ]6 [
8 i5 u, c5 e9 I" F
0 R9 B5 G: X6 L* q& g
光敏模块实物

+ g1 i/ F8 ^1 J2 R* g  m% A4 _
a40a9814338a4295b4e3da05ed2e17e0.png ) A& E3 z6 A9 y2 U, e
' y! F. m1 }+ j
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。9 M2 n1 k: z# p. F
. j6 M  |- F' E# s7 c

2 V3 \: J1 L3 `! z$ b. S光敏模块引脚说明
$ Q5 j( I- B9 ~4 ]+ EVCC:电源引脚,接单片机+5V或者3.3V。' i" H, O3 |5 J8 c* F1 X/ H
GND:地线,接单片机GND。! R; ^& s+ }$ W# T' U' w" O( @: f# K4 K* v
DO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。4 j0 G4 ]/ p) E, j
AO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
; _8 X* y" X8 c5 R
- d# p. P1 B3 }

: A2 L- A. |/ M1 [CubeMX配置5 a3 w% Y6 F5 k' R$ W
1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。
$ g: ~* }3 F! p6 b* W* r8 E* ~
0 H" r6 R6 E  h- T" h; L
b34ad06879ff45f083d3a6f18a4a84ee.png 6 `, O6 W/ K' U9 U
: X7 j: x0 S* J" ^' T
2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。
8 F7 x' T7 e( B' f* B# L
  G( Y7 C8 @* P2 [
0645441d7e824b15b554900be5de6826.png 0 i* `% I# e8 _+ I) F; O5 n
2 u: l# O" |. Z* x/ N
时钟配置选择外部时钟
$ v" f; |$ A6 v# |9 v7 ^6 S$ b7 Z
885ca50819ea47b9bce27aeee00b3bfe.png 2 H4 g& P3 k' {( Y

! O" L9 `; A# O2 {$ }; y: c进入时钟配置:
: O1 J0 I: _' B8 r" ^- S; s- v# `* a- a6 [  M, d
3079b8857c364eea83f158ee0c72512a.png
; U  R3 l+ W  H

; _: B! z& K7 d  A3、ADC相关配置,使用PA1脚作为ADC:
7 X  Y: C: I* F; e8 K4 V  E
0 w8 @# P0 Q! C- T; V5 C4 x* d
d5633e418c9e47ecbddf52870691c263.png
$ `4 P! g) |# _* C8 M+ M  y
9 o) g+ O6 F1 U) I) W) S8 M
使能配置:2 i" j) _+ |- z6 |

* A8 W* ?+ W+ g3 D
f0f8215ff2fe4039b5bf580a9f8b4875.png " h4 e! ?) ~4 R9 Y
e2bbceb3937e4c24ab7529285d1adcfb.png
$ U# Q6 q# d' [& k5 G

0 \0 O3 u" g/ D0 R; }* t) _' Q- Q1 T为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:7 M  ^  |" T) J4 D9 ^
* s+ [: j( i1 ?; P$ D/ E
f0fde49c84b34806bbe405e2cc23bd10.png - x8 x) a" d2 Q( O* `! x

- Q) S- ?; W" P3 C8 K1 i7 B同时也对其中断使能配置,勾选Enabled:
: X: S1 I; J+ K) q
" M- Y' _0 O% K9 f& v9 q* x2 c7 {
e8edbfb6d4004a7ba43ea1aef25699d4.png
1 c3 `, T: }' w1 }' H+ W) l) @9 H8 A, g

/ B2 A/ x3 o$ T% V9 ?后续配置:
& T$ P+ M6 j0 \7 h  c" o" ^
5 F2 M# D  ?7 T" [1 n
b535f82955914f23a54eb5dfb7c34233.png * j8 W( T, s) E

- q; O: M  \/ r$ ]2 |2 O  Z

* w. m9 p9 ]' l6 v% P2 U2 f
- T; Q2 s  j7 Q) w5 _
8 f" m8 a3 X" |8 I9 n  g( }
代码主体部分
. d$ @% q+ N6 G7 ^" ]7 S5 C1、引入头文件,为后续使用sprintf做准备。0 ~$ Z) {7 ]! A, p* F
  1. #include "stdio.h"# c7 O' D; u* L  q
复制代码
7 }, V; d! I# [2 U7 }9 z
2、变量预先定义。/ e9 z4 }! H. c+ @
  1. uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值. H, m: |' X& L3 M
  2. uint8_t str[64];//给定一个数组空间,存放sprintf的内容
    / F9 s3 b2 t0 m; Z' e7 i: g( g
复制代码

0 b9 O% |! C, `" E3、数据存放与发送。' _( y( d/ l4 ]5 H) y2 v
  1. void UR1_Send_Info()* X( K3 G; a, e' H
  2. {* W. j$ p3 D+ _' V1 B
  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把将要发送的内容存放到数组
    . A" U3 q; E0 I& T
  4.         HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口3 T! l, f5 k8 O9 T" j( q! m8 [- [
  5. }
    8 x. Y- H* O7 J
复制代码
/ C1 I  B5 t1 J0 |
4、数据的获取。/ u0 @, Q1 K. e2 T
  1. void Get_ADC_Sample()# r% \. O7 U. ^4 `+ K
  2. {
    * ]3 ?& `) @7 i4 E( a8 P$ z5 a
  3.         HAL_ADC_Start(&hadc1);//打开ADC转换  [: e7 M1 j/ v: O: a- _% Z
  4.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
    ' |: P$ O+ ]+ u5 N2 q: r% n, r
  5.         {
    . d# a$ O- V* o
  6.                 ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中/ h5 s  u! K+ ?0 J6 w. F
  7.                 ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数
    ' l; w8 }& b' ~: l6 K; y
  8.         }& H' u8 l' j( B6 Q
  9.         UR1_Send_Info();//将上面数据进行存放,发送到上位机
    1 N0 L# M( v' r$ j2 F) A
  10.         HAL_ADC_Stop(&hadc1);//停止ADC转换
    " Q$ {5 [& Z" K4 v! o" }
  11. }
    % h, B& f  X% b/ E* e6 m7 v1 [
复制代码
" h" ]" n+ X# o2 c% C( L
5、在main函数的while循环中加入写入的代码& S; |( B9 A- _& ^2 g" y# l
  1. /* USER CODE BEGIN WHILE */, B. |/ ^- S$ j
  2.   while (1)0 E  {9 ^1 I: ~$ v0 `
  3.   {
    ' i# w/ V- c- F' b# ~
  4.     Get_ADC_Sample();
    $ c8 a6 f' }$ O) f
  5.         UR1_Send_Info();" p! R. A3 ^$ V1 N& }
  6.         HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次$ ^! W' x9 b0 S* U/ V1 F
  7.     /* USER CODE END WHILE */# z8 k4 a1 d9 {1 Y

  8. # A8 i5 k* _2 G
  9.     /* USER CODE BEGIN 3 */
    ( I* P/ B& e# E+ Y, A6 [
  10.   }( i# x" S, f) ^5 r; ?0 J0 G
  11.   /* USER CODE END 3 */
    5 x" f/ S( @& R4 n+ p; i
复制代码
1 F8 [$ M' L4 X! J4 ?% u: V
结果展示
' B6 l) t0 N, r( i/ a
: H. Y7 ~- o# l. x* i# e. v: I
bc1c1be709b6447aaf62454cb049faf8.png
& F9 f6 u6 |$ D2 s

) I! A  ~; X, g————————————————; {0 L6 Q/ a2 Y' y' G
版权声明:xiang--ying( R, ?7 L3 s0 d1 P1 W' j
如有侵权请联系删除# T3 I# C8 y6 z& p) x
. }9 n+ i& b7 z$ ]3 t5 ]

. k' o$ H5 T- R- A% v. i. c
收藏 评论0 发布时间:2023-4-7 19:19

举报

0个回答

所属标签

相似分享

官网相关资源

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