器件选择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
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
* 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: u3 ?# 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
+ 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
& 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
3 h b; E T: f1 r% v* @+ U0 Q0 j$ P% }$ _% e
进入时钟配置:0 z9 v4 H6 _3 t+ c1 ]' t# s1 H
) _" C4 W% {+ z5 \, V6 s6 V
" 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
6 X9 W b' R6 ^ `4 s9 j5 G4 B, r; |- \& {/ A; K/ }' I3 a
使能配置:1 W& `! D8 ]+ r+ |1 @* ?5 i
% x7 E4 ~ s" a" o
* n( K& @+ L" I4 p
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
' 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
) 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
- 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
- #include "stdio.h"
* v! c* Y( _$ u
复制代码 + t3 C1 r% S& \
2、变量预先定义。* ?2 t1 d- f+ j! w# N
- uint16_t ADC_Sample = 0,ADC_Volt = 0;//ADC_Value为采样值,ADC_Volt为电压值
- V9 |- Y2 q8 _7 q$ N1 F - uint8_t str[64];//给定一个数组空间,存放sprintf的内容" d& U' n6 p: c
复制代码
6 A4 Z$ H; g/ C4 q3、数据存放与发送。
: h, e" {, h3 [# E* M; r- void UR1_Send_Info()
3 I4 r; b8 E) T! Z - {& P1 {9 W, j: U0 t
- 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
- HAL_UART_Transmit(&huart1,str,sizeof(str),10000);//将数组中的内容发送到串口
- l& v* v$ z! n/ M( J! E- Y3 w0 ~0 d - }
( S) m& \* j, W) A1 x' [
复制代码 % G1 \1 V% \4 M
4、数据的获取。* G; y+ b0 L9 N6 b9 |9 \9 ~
- void Get_ADC_Sample()
$ d0 t9 {) b; \3 S - {
9 r* C3 R! K( N/ C6 Q8 c, Y - HAL_ADC_Start(&hadc1);//打开ADC转换
" z( c5 Y" U7 s7 z+ G - if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
1 f" S. f' k! T& f6 N - {
% i3 N& Z7 I1 D* j - ADC_Sample = HAL_ADC_GetValue(&hadc1);//将得到的ADC采样值放入变量ADC_Sample中# d F# n& @& L
- ADC_Volt = ADC_Sample * 330/4096;//数据转换,电压为3.3V,数据时12位,保留两位小数4 }# O: a9 q" v; x
- }$ b" m+ z( B) Q# i9 f; J2 I
- UR1_Send_Info();//将上面数据进行存放,发送到上位机9 V3 v' a# e6 i- E
- HAL_ADC_Stop(&hadc1);//停止ADC转换
" S! @0 A2 i0 _7 N- g1 N. Y1 f - }
; 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- /* USER CODE BEGIN WHILE */
; N6 R: b7 L: f1 f4 c" k - while (1)
8 K$ D! w* a" I - {
5 y* H% P' E, H5 n8 S1 I2 _/ K0 e% s - Get_ADC_Sample();$ g8 [( `% P" V9 O2 P4 r
- UR1_Send_Info();1 g) d- J' L( L( ~/ y8 \
- HAL_Delay(500);//使用HAL库的Delay函数延时500ms,每500ms转换一次
4 Z, G. B, J* | - /* USER CODE END WHILE */
2 ]8 f, |0 H3 X8 F
$ J1 g9 y$ C! _) V8 t- /* USER CODE BEGIN 3 */
4 g5 o6 n$ Z: [- P. B. C - }6 R9 K4 b" e6 \( L
- /* 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
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 |