器件选择
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
* 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
( 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
; 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
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
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
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
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
1 a6 N% q( R: s# K- _6 b
: \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( ^
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$ ~
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
% 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- #include "stdio.h"
" R3 y8 b! ~. ]$ G
复制代码
- @+ M& m, V8 k! c$ Y2、变量预先定义。
' k7 m% E: g! \& V+ K- uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
0 ?" M* u' r# c. f t - 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( @
- void UR1_Send_Info()
" U m0 |+ U) Z: v - {, k' s9 V% \# l7 Y# l; y
- 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
- HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口
7 O" i$ k9 s$ s0 y - }0 T0 H# [9 v. t9 w
复制代码
$ f+ }; u3 c. g; S4、数据的获取。
0 }4 M7 j6 k( s# ?1 c+ s+ Z/ O- void Get_ADC_Sample()& n/ Y! |7 y* E$ f
- {
- ?' _( r* ~! X5 S6 H - HAL_ADC_Start(&hadc1);//打开ADC转换
4 Y- L: e4 r# l$ W8 g; t% N/ [" t - if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)) J" }2 l. @, t4 q% E7 F
- {9 j) [0 t/ Q8 B! V. Y# C# }, |
- ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中
' _& l1 K2 G. C$ T+ V7 j - ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数- I" K- O1 M0 t. ?7 k3 k5 q. i
- }, @ y. ~. Z9 g% C: C g3 r% A6 @
- UR1_Send_Info();//将上面数据进行存放,发送到上位机& E+ C$ [4 w$ w' M
- HAL_ADC_Stop(&hadc1);//停止ADC转换
; N% R* l4 V G c - }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
- /* USER CODE BEGIN WHILE */ l, M% E* Q8 j$ i7 n
- while (1)
5 i) S8 g1 n# u - {7 w# t( ]+ }7 c& e8 p6 ~
- Get_ADC_Sample();
2 O' G4 |) n0 k( A4 @/ d1 V - UR1_Send_Info();0 D; d- Q, f$ J% d% F$ \! y( ^3 ]2 A6 I
- HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
& y" ]! I# i$ S. o" B7 C - /* USER CODE END WHILE */
- k) R! V& \) q - . z8 `: w i6 w* l
- /* USER CODE BEGIN 3 */
* K* X# \1 u& K+ E& J - }0 y7 o0 J; B) y$ m) U
- /* 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
) 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) }
|