器件选择! h( t+ Q4 f# F" B3 j) i: i6 Y
硬件平台选择STM32F103C8T6最小系统开发板。. \9 i7 H0 x9 b$ \$ B$ f' F" L
STM32代码配置工具使用STM32CubeMX的HAL库进行开发。
* p/ L: t1 l* Q4 P6 y- A光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。1 g. }5 H& a0 s$ C
注1:数据下载使用ST-LINK下载。5 b E% d; t4 V) n* j8 z2 i
注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PA10引脚RXD,RXD接STM32的PA9引脚TXD。
( p# z8 U4 Y- t5 J
3 |" k0 [( Q5 U" q3 T
F. {- L3 B3 B- O# D6 _& h! h: x4线光敏传感器介绍7 t, N5 d: ?+ T8 a* c
光敏模块原理图
& L* o2 l# n) C1 [, H1 e
0 O6 E" G3 t o% Q) Z' A8 h' T5 d
- M2 y2 g6 L* I7 S0 x2 n: W' D
: Z/ B+ Z8 k" |4 x" ` f7 {9 }0 `8 j, s* B3 ^
光敏模块实物
; [0 ?: H' @! ^' d+ t' V- T c) \5 [1 t
; U7 P+ L! d; ^7 }
( U( ?7 R, o. W3 n2 v
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。* a1 x( i; ]( `# ?$ e, t
3 u( f0 r; R5 r0 n3 H9 i
" {1 M/ c$ e1 u& l8 A: ?1 Z光敏模块引脚说明
1 |7 k: O- v' e: k, t& uVCC:电源引脚,接单片机+5V或者3.3V。6 q. L) x& I# m0 Z2 I
GND:地线,接单片机GND。
8 |1 r# ]* [+ v; P$ f* KDO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。
- r/ X& {* m1 D0 J6 a* AAO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
3 Z5 @7 t. p! s8 L8 ^* p1 E; t/ y- W. |& _
& q" o) N% X: }/ j+ fCubeMX配置+ B, K3 M6 J5 ^0 x/ |
1、首先新建一个工程,芯片选择STM32F103C8T6,双击后进入开发。% f3 t5 E( ~3 L/ J7 Y
* J" h- `5 R! r5 ]
+ _/ J0 [& I2 u7 l& z$ M/ G( I. Q( y: R2 \
2、进入后,首先进行一些基础配置。配置调试引脚,配置时钟。在SYS下的Debug中选择Serial Wire。
; p$ w& ^5 E1 N8 D( ^/ z9 y7 F8 z. [+ S3 C$ M+ O
: F* `+ r# W" |# w# r& Y, y+ S
1 V4 W+ c4 p4 e" u- v时钟配置选择外部时钟
; g+ t0 v. v; `/ {; ?# ~; ?
/ a0 _& b9 |( }& a* n" {. A6 p
# P; }! ~ L/ n$ G' c
Q s7 W5 ~1 L
进入时钟配置:& _) H2 c7 i- T7 [! I
; Q4 o3 I0 T$ z k$ j* ?/ D9 s" Y
' Q+ r! X0 R! W: b+ P4 @, j+ y+ q8 d' j+ b* I9 v; {2 V, E8 N
3、ADC相关配置,使用PA1脚作为ADC:
0 K6 k: y7 f" _/ w& k; v. Z/ X+ x! Y+ F
0 P' a1 b7 d% U. }
& @- {7 p" h$ y6 X: w
7 {" g3 t& W% Q6 O" c2 t
使能配置:1 y7 K& V& u# e- P1 s8 C
" s/ h; ~; @( w4 u0 c; I! n( H
( X& R+ J& K: e5 h
8 a' q, Y$ f9 }/ d
8 m' i/ @! b; M! K0 l
为了方便看出光敏模块输出模拟量的变化,通过PC端的串口工具返回电压值。因此也要进行串口的配置:
# G* J/ r6 Q P5 I) ~; H- R+ U& J' A! }" z
2 F6 e% F( _) u* q0 O V
2 o1 a) V& Q; y. b同时也对其中断使能配置,勾选Enabled:; p' A8 |) d9 W9 s% z+ ~3 |) z
" l/ z& [" y9 V$ \
3 Y+ E# A" B5 | ^' v; a. h* `* [
2 W8 M, _0 W) n7 v5 c后续配置:7 o6 q: g. U7 [/ j- k
$ E8 |7 ] ~- y3 R) p* q c0 O9 x
, m7 W: v& Z" O4 t8 O
, a$ k3 W& H# a" T/ {8 W
) n I. m9 a0 R. R5 g" x6 }. u* q8 w5 y! X4 D6 |
5 O, a2 O8 t0 q7 I* l( k d8 c8 U代码主体部分
5 a1 G- N& }8 k6 V1、引入头文件,为后续使用sprintf做准备。
1 N; D, [$ l7 `; v/ e- #include "stdio.h") b" F$ {8 w4 E- S. G8 E
复制代码 ' U5 _5 v. F* O1 j, E3 k
2、变量预先定义。) T5 p% ^% Z! t% Y
- uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值9 r( K4 J6 p: g, j4 r+ ^
- uint8_t str[64];//给定一个数组空间,存放sprintf的内容
# ~, z4 K& d1 P3 ?& T
复制代码 ' P3 e! \0 R1 j7 ]3 j
3、数据存放与发送。
: p B, o& j. A' e1 H; _- void UR1_Send_Info()
^3 q S& i) f C ?% a2 Q7 L - {: J. O; q! k* ^% w6 Z
- 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把将要发送的内容存放到数组
8 r; E2 M* z/ m6 n% n; s - HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口" z! b, [3 j; P" s
- }
7 A4 L2 [9 X0 t8 L+ i
复制代码 ; K$ e7 T5 w( N' L
4、数据的获取。* O" m( n) x, m; i' g' P- K
- void Get_ADC_Sample()! d& h% P" ^) `4 B
- {
6 t R, W4 s( N1 D. e - HAL_ADC_Start(&hadc1);//打开ADC转换4 e4 ~5 v' c' l" C5 L
- if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
( m7 Z9 V/ A) Q - {
" |) Y" M0 e7 `/ _ - ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中& I! l8 q* `" U
- ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数5 l) d: j8 ]0 D
- }1 ~. Q, F1 }0 A
- UR1_Send_Info();//将上面数据进行存放,发送到上位机
+ @% V/ s6 E; C& Z8 X - HAL_ADC_Stop(&hadc1);//停止ADC转换) \3 W3 |" t0 x$ Z6 k: ^( D" q; F
- }9 [( J' _/ ]+ ]4 \6 G9 b
复制代码 I4 L- Q1 j4 l
5、在main函数的while循环中加入写入的代码
( o' u2 B* k' a* ?# ~- /* USER CODE BEGIN WHILE */- c P; e' J, j4 S# {) J
- while (1)1 f6 a- [( X a1 i
- {* c7 H" w9 r1 t$ B# P2 o
- Get_ADC_Sample();
3 B; S- D0 T1 J - UR1_Send_Info();) t/ Q- G. K3 E! U
- HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
, L l' H% v8 u. q - /* USER CODE END WHILE */1 X3 c" A& z4 C# c( c$ \
. A* i3 y0 F2 d) T8 @. B- /* USER CODE BEGIN 3 */0 a0 j# T$ G/ I4 h
- }
9 T3 L. f( I* ~& e$ i2 a - /* USER CODE END 3 */
! @5 n Y- }4 K" w2 S
复制代码 0 {6 b7 t% Y4 E% r0 g2 r
结果展示
U3 _! B6 O' ?, }. z
& h- @# _7 H9 T7 p o, U
o5 @, a! r2 |5 K
& q1 d- w, _' @+ i# u# U! I- C& M————————————————) L% [1 x, q7 }4 Y% ?& D
版权声明:xiang--ying& O2 S7 ~; [' F) T, ]0 Q2 A2 o$ r
如有侵权请联系删除% R# V" W) y) d$ x( `
; I% G) U2 B4 O( n$ y9 J% x( [& T7 I# b+ f0 Q1 _7 Z& ^: ~
|