器件选择; x! q c6 w! R/ h* I Q: Q6 ]" y
硬件平台选择STM32F103C8T6最小系统开发板。5 C: r" \* Z. G
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。! I4 x3 R4 X2 x* m
光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。1 d* I/ h( `0 A
注1:数据下载使用ST-LINK下载。
8 Z+ S( Y# d; t1 ], q. l注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。9 G0 Q1 C! [5 l" E: ~6 g; t
: y1 S: y8 e/ k6 J# @. \! W
5 h. c1 G, b1 j: O7 }3 g2 v
4线光敏传感器介绍
7 w# } `" t$ `4 Y光敏模块原理图
6 r2 F7 f9 o" L- v8 C2 t- `- A/ o: ^- t" @
7 ]( {) {/ W3 k3 @
3 r8 k) p; |$ B" z
% R: A8 P( O# z0 x光敏模块实物
. p3 p/ B3 w; W8 b5 m/ \" \; P: a+ s# T4 W( l
3 x5 ^! K7 ^! e0 P
0 o! e ^6 j% b& t0 u: C9 j, L# E
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。; Z/ M% A* d9 j- l/ G
+ }- z/ i0 v* p' ?2 H4 m- g2 @' R" U5 p
光敏模块引脚说明) w7 |9 Z* }6 _# u
VCC:电源引脚,接单片机+5V或者3.3V。
7 p5 e: e" Z& B# wGND:地线,接单片机GND。
& p" w) Y% c$ l% BDO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。! n$ H; M; D E3 U6 Z
AO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚); C0 \$ `; ?8 H4 K6 R
8 {+ W2 s* V9 v1 N6 ]
& s! P! h: ?8 Y% L
CubeMX配置/ J. z% _; B& G7 Y( T7 J
1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。, P1 K/ U# Z" C& E9 b
, ^; z; {4 ]& x+ B3 p
$ B4 Z; w! Y% z# }" b
$ X: L H) r" u3 `$ x2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。+ h, M4 d0 q+ o8 a9 C
5 X' t6 a0 U) @# S* S @
1 x8 m! \& V6 |) t. n
3 s9 F) `7 r& J4 ]1 }! v) L! K; V时钟配置选择外部时钟
3 I1 N, x! ^, g' x1 p9 y; N! J5 \; J( L2 j% D. M( u# O
# v" ~8 M' n5 B1 T: a$ t# z+ R$ c+ y% s% q
进入时钟配置:
' p% w1 z) _# ~
o! _& L7 g9 L3 J& M% _0 b
! h5 j+ i# E, w' @" g$ K. w) k& P- l! v$ g; K
3、ADC相关配置,使用PA1脚作为ADC:
( m: M3 M. v3 M2 ]
* [8 S; H! C. F- v5 g$ t9 a
& C. E# q& s# N- X7 H
9 e* ~) X" j* m! ~# ?' p' w( x- m( g使能配置:- a) b6 \, h& V2 G1 z
1 q4 v9 X" z3 e$ M
1 O6 E# U/ j8 m# m; s
) o1 ?# [: r0 v& i& O
( V) D0 u) e2 G/ i
为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:
' S) Y) V$ q' l/ U) m* J
/ L B5 L5 S8 d2 l a4 Z. C
) y8 |( V- _! n( M& W+ C( O# @
" B" P( W& `- ]5 @" F& m同时也对其中断使能配置,勾选Enabled:& @' ~, v* x: y
- i' m9 s! ~( ]% w' o
, Y* U& w& W: y q9 O
$ {0 j! ~- U6 [3 B6 L! _后续配置: c, w6 U2 g6 H% @ q* o
& Z& |2 ?. N. _. f$ A; w
3 J" f* M' d9 Q- q2 A" q
; V3 O$ _7 j0 _( o! i# _7 S( ^1 n/ m
3 ]7 i6 H& y' }7 v# W' G A5 g5 @; M$ ~- B# i: O
' _1 x" `) W0 K: B7 {: q9 _5 _9 Q3 D代码主体部分# C) N, y3 B( Y
1、引入头文件,为后续使用sprintf做准备。; D" L9 ]; S1 @$ B4 |' U8 ]7 v
- #include "stdio.h"/ |7 k" O. S0 H" a) w( u) E0 h
复制代码 % w& ~9 F3 [5 P9 [1 s0 m% i6 l
2、变量预先定义。
: v, t+ v7 f: M6 k' _+ u% T- uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
5 ^; a- Y9 `1 e/ {2 f. ]3 ~ - uint8_t str[64];//给定一个数组空间,存放sprintf的内容' S! `0 A/ p4 i
复制代码 , N5 ^! `( k8 t! G4 _1 u
3、数据存放与发送。
) G2 b' K3 j$ F* g4 }- void UR1_Send_Info()6 B- |# {3 }! M" |' C
- {
) _: i. l# O, i" R - 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把将要发送的内容存放到数组
3 E9 i; w" ]0 X5 L- ^- c. Q. X - HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口( I* h7 G/ _5 Q- ^9 H- J' F& `) W# W
- }0 G& l$ t; x$ ]2 R- V, C- M
复制代码
( J: q5 {' ^: }, \ q& T4、数据的获取。: W$ w% w! p# B. H. v
- void Get_ADC_Sample()2 @) D7 l% V# y7 u3 _& [ V6 u
- {8 o5 D X. J* h% M
- HAL_ADC_Start(&hadc1);//打开ADC转换9 [% U; e2 }- x: o/ e' n" a" P, Q
- if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
4 P" O9 W' Q+ K* { - {
! f" G- O1 `6 `/ [" O% ~ - ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中
9 @" `. K6 c0 i - ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数$ q0 d$ k+ b/ z1 ^$ a# _+ A3 E1 F% V$ |; E
- }
) h. E. ?% [+ a6 q. n% ~ - UR1_Send_Info();//将上面数据进行存放,发送到上位机& `* I V7 o# V# u. U. Z
- HAL_ADC_Stop(&hadc1);//停止ADC转换
( Z4 n, T. Y& k% s" c: r - }
0 @" u: ^1 z. Y: g7 C& X
复制代码
$ b" D8 N& c g5、在main函数的while循环中加入写入的代码
8 F1 c8 m1 k; g- E7 b2 v) v- /* USER CODE BEGIN WHILE */. N1 l2 F( P0 c O3 @- A
- while (1)7 S+ l3 T% E6 w# O* N
- {
8 z' x) s+ v) Y - Get_ADC_Sample();
# U7 M8 X$ K5 m9 P4 M" O4 A% V( m - UR1_Send_Info();
8 w/ g# Q( K. R7 a: ^' v2 c - HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
5 d8 ]5 Q, g O7 |+ q9 q - /* USER CODE END WHILE */
/ i8 G6 I$ s' G( \0 V! L4 I
9 |; K2 T( {& q2 T2 o- /* USER CODE BEGIN 3 */, \) c' f( F ?. C
- }
, A6 [$ E1 c2 [* D% z& r - /* USER CODE END 3 */+ N- z$ p3 S3 ], Y# L$ v- a
复制代码 6 Z; Y4 ^- [8 X$ N" i' {" J; y& v
结果展示+ x# u# t3 N" K! u k$ S# u b$ h
7 }) z$ i, h2 f) ? f; \8 p! O
# |% Y2 Q( t/ [: T
$ ` u: n& H' \: M6 J————————————————
. t5 F9 W: R0 ~4 z7 F版权声明:xiang--ying
* L& E5 T3 l& ]9 u3 a如有侵权请联系删除
$ B8 y1 _1 B* j6 h1 ~6 l' m7 ^" J
& N/ V% W6 ?4 |5 g2 L: X2 V% l5 U) X% O2 l+ l1 S$ o1 Y* T
|