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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-7 19:19
器件选择9 @) I0 d6 @# D, O! }, V2 V1 e
硬件平台选择STM32F103C8T6最小系统开发板。
) v3 ~- E/ f2 m6 OSTM32代码配置工具使用STM32CubeMX的HAL库进行开发。* \/ `6 N1 R% r# P: V2 R* a2 f
光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。
0 E3 M9 x) g, e/ U9 b$ k, y5 c注1:数据下载使用ST-LINK下载。' t" z( V! b/ s8 |  ]
注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。9 W- K8 y, g3 g* P/ @% f' U

! ~3 Y! O1 n! m: ~
8 U  P  ~. k3 G$ J/ F
4线光敏传感器介绍
* A+ `8 ]+ T/ x9 ^5 z/ N5 F光敏模块原理图8 B5 g+ `8 _8 c4 y5 B8 W+ P2 |
8 u) W4 g- L+ q/ R  G8 Z4 u( n
fef84a4cb3b94d53b17bd33538eb8572.jpg 2 K0 H3 e1 H# m: t& Y: [
; Z+ X0 E: R* Q

, v2 O8 _  R0 Y& t6 {# h+ v) Y光敏模块实物

1 ?# O: H# p1 f! r& K* e, ^8 @. p" F3 l
a40a9814338a4295b4e3da05ed2e17e0.png
* l% f- C" X& R* E, V* T. c

* h8 I" F! N7 ~2 W% _光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。. E2 G; @% W5 S( U1 X3 {6 h

  Y8 V9 Q7 U% U1 _. S6 F# t: u
3 ?# j' ~. L6 X' X2 L0 X$ U+ `
光敏模块引脚说明
8 E6 s  t$ I, }! ]3 Z* M# u- h' yVCC:电源引脚,接单片机+5V或者3.3V。0 ?& V+ ]) y8 r( f
GND:地线,接单片机GND。
) z+ X. [- ?# ~% ?& P2 uDO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。
! |  P: P( J3 V9 }6 ?& r, c) d6 j) |AO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
1 }9 W, K$ Z8 Q6 u7 M; g2 c. ]' D3 y4 v2 M6 f% K0 E5 l1 O

$ Z2 u, k% f; I0 y) l5 W# N8 e. x( CCubeMX配置
& h: P% ]$ G3 F" g# K9 @! d# s1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。
: k; v8 ~) g. ?4 [. z: H. \$ V) R3 v4 x+ Z7 k2 x* C& h) K
b34ad06879ff45f083d3a6f18a4a84ee.png
+ r  Z" n6 n! m/ S0 x* P& z/ b

% h: a# B* i5 T& @# N. W2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。
; y2 M& Z& {' Y+ q, Q1 A. v: A; [* D' C
0645441d7e824b15b554900be5de6826.png & h& Q* U( o5 f! d- q+ m$ O! w

  t+ v, T5 q- _1 h! G$ R& U时钟配置选择外部时钟+ U( l5 \9 Q1 _. P# i

9 n+ ^# t; e/ Q$ y0 j8 v) K
885ca50819ea47b9bce27aeee00b3bfe.png
3 h  b; E  T: f
1 r% v* @+ U0 Q0 j$ P% }$ _% e
进入时钟配置:0 z9 v4 H6 _3 t+ c1 ]' t# s1 H

) _" C4 W% {+ z5 \, V6 s6 V
3079b8857c364eea83f158ee0c72512a.png " u0 |+ h! _5 q9 C
# N6 `  {2 x# M. r& `
3、ADC相关配置,使用PA1脚作为ADC:
( v" `/ R! D- c8 B+ B2 a5 l
7 l! Q0 q# L- L6 U6 j: m# C7 G' G" @& q
d5633e418c9e47ecbddf52870691c263.png
6 X9 W  b' R6 ^  `4 s9 j
5 G4 B, r; |- \& {/ A; K/ }' I3 a
使能配置:1 W& `! D8 ]+ r+ |1 @* ?5 i

% x7 E4 ~  s" a" o
f0f8215ff2fe4039b5bf580a9f8b4875.png
* n( K& @+ L" I4 p e2bbceb3937e4c24ab7529285d1adcfb.png
0 Z# l3 h+ ]2 T3 }  g# i  d

" y' [/ R/ ]$ h为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:# B! \. O. T* \7 Q/ x/ p
$ b& s0 g0 _4 k- R3 w
f0fde49c84b34806bbe405e2cc23bd10.png ' V( G- \$ F$ R% F3 V  Q5 m5 N
3 j3 W! k: h) x5 l  M
同时也对其中断使能配置,勾选Enabled:" l4 Z2 G8 h. l1 {8 T: T, a  p
6 t: E3 v7 f! b
e8edbfb6d4004a7ba43ea1aef25699d4.png ) p! S, `/ W# Z- F3 P

' Q5 u" x( C" @后续配置:
4 D( r% B! T( J4 T1 m3 L; h/ {5 i$ O: t9 P3 q
b535f82955914f23a54eb5dfb7c34233.png
- h5 {! _* k7 N4 z8 |( L& R, b' o1 }2 |) t5 v& e8 r' n: \
3 P: g+ d& M  U2 l& w

0 U% \* ]' d, u( ^
6 m  N+ A+ L) K1 J9 h
代码主体部分
# U: g+ r2 t/ S) N0 G* c1、引入头文件,为后续使用sprintf做准备。7 _3 c) H% I" q/ p
  1. #include "stdio.h"
    * v! c* Y( _$ u
复制代码
+ t3 C1 r% S& \
2、变量预先定义。* ?2 t1 d- f+ j! w# N
  1. uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
    - V9 |- Y2 q8 _7 q$ N1 F
  2. uint8_t str[64];//给定一个数组空间,存放sprintf的内容" d& U' n6 p: c
复制代码

6 A4 Z$ H; g/ C4 q3、数据存放与发送。
: h, e" {, h3 [# E* M; r
  1. void UR1_Send_Info()
    3 I4 r; b8 E) T! Z
  2. {& P1 {9 W, j: U0 t
  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把将要发送的内容存放到数组7 {7 A1 B! P4 b7 ?& T1 C9 d6 Z
  4.         HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口
    - l& v* v$ z! n/ M( J! E- Y3 w0 ~0 d
  5. }
    ( S) m& \* j, W) A1 x' [
复制代码
% G1 \1 V% \4 M
4、数据的获取。* G; y+ b0 L9 N6 b9 |9 \9 ~
  1. void Get_ADC_Sample()
    $ d0 t9 {) b; \3 S
  2. {
    9 r* C3 R! K( N/ C6 Q8 c, Y
  3.         HAL_ADC_Start(&hadc1);//打开ADC转换
    " z( c5 Y" U7 s7 z+ G
  4.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
    1 f" S. f' k! T& f6 N
  5.         {
    % i3 N& Z7 I1 D* j
  6.                 ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中# d  F# n& @& L
  7.                 ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数4 }# O: a9 q" v; x
  8.         }$ b" m+ z( B) Q# i9 f; J2 I
  9.         UR1_Send_Info();//将上面数据进行存放,发送到上位机9 V3 v' a# e6 i- E
  10.         HAL_ADC_Stop(&hadc1);//停止ADC转换
    " S! @0 A2 i0 _7 N- g1 N. Y1 f
  11. }
    ; W' `6 h0 t8 ~( R: ]1 W6 ~1 Q# ]
复制代码

! S+ J" m8 x0 z& P. Z1 r! B) d5 m/ c5、在main函数的while循环中加入写入的代码
, j; J& I, E2 x
  1. /* USER CODE BEGIN WHILE */
    ; N6 R: b7 L: f1 f4 c" k
  2.   while (1)
    8 K$ D! w* a" I
  3.   {
    5 y* H% P' E, H5 n8 S1 I2 _/ K0 e% s
  4.     Get_ADC_Sample();$ g8 [( `% P" V9 O2 P4 r
  5.         UR1_Send_Info();1 g) d- J' L( L( ~/ y8 \
  6.         HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
    4 Z, G. B, J* |
  7.     /* USER CODE END WHILE */
    2 ]8 f, |0 H3 X8 F

  8. $ J1 g9 y$ C! _) V8 t
  9.     /* USER CODE BEGIN 3 */
    4 g5 o6 n$ Z: [- P. B. C
  10.   }6 R9 K4 b" e6 \( L
  11.   /* USER CODE END 3 */
    & Y' k! G( h6 l( F" i
复制代码

1 [; I( ?' F3 f: q结果展示
+ X# Y' W) Y0 p- b+ D: ?
9 h  k$ a+ ?0 R4 m* T* I
bc1c1be709b6447aaf62454cb049faf8.png 6 J0 R* D$ T8 E4 f

) X% y! x, v9 u. k$ A————————————————+ ~% p8 q/ U5 R# R2 c9 z
版权声明:xiang--ying
  r% {9 P$ A+ ?' P8 }8 T如有侵权请联系删除0 ~0 ]9 Y% H; a+ W+ q
& k# j. {4 F6 H! G' D

  Y" E$ [, s- H: K( E
赞 收藏 评论0 发布时间:2023-4-7 19:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

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