前言7 ~0 s% E9 {6 P* @! n' k
7 c$ j5 u2 R9 `$ C
相信很多志同道合的小伙伴们已经找到了学习STM32的好途经(灵光一闪刷到我的博客)了,接下来的时光里,我会讲到一些我对一些模块的使用,同时附上源码还有我的心得。没错,今天我讲的就是继电器的使用。
( w# n9 F0 D) A( ?% V, N y3 U, B( j( W8 {* |: a3 Y+ X7 q
9 z' o* \- l3 S* {- {
$ G6 P+ x$ W( @8 q* C, [, g" T
一、继电器的使用(重要!!!)' y$ C; y; C5 q, l8 Z: z
其实继电器简单来说就是一个开关,VCC表示电源正极、GND表示电源负极、IN表示信号输入脚,COM表示公共端,NC(normal close)表示常闭端,NO(normal open)表示常开端
3 r: N& F& J; |6 F. S9 m- ?
" g0 d. X" K+ ~' [7 B一般情况下是常闭状态" a* r0 A* o `3 @. |. Q8 Y5 E
( r, K! @. Q/ U! V- a4 s$ }; `/ K9 I/ p
这里简单地描述一下大部分的继电器模块:! ?& r$ p* `, ^1 m0 U" C
1 H; Z/ M7 F! \' v/ Q+ f) m
Vcc接电源正极,Gnd接电源负极,In接STM32上的输出脚(输入高电平公共端连常闭,输入低电平公共端连常开),如下图所示,你就可以明白了,当IN脚输入高电平时,NC与COM相连(左图);当输入低电平时,NO与COM相连(右图)。
7 Y0 y* c. L7 Q7 y/ ^7 u1 Q8 X3 V7 s# K- R) S6 }
% K0 ]& j5 r: v& x6 s) ?
' F- b8 N* u/ C0 Z相信这样子你就对继电器有了基本的使用了解,下面我就不讲解其内部的结构原理了,可以到其他文章上学习具体原理,附上链接
# h6 F, Y9 c$ x7 I w
$ _$ |# p' }7 H+ Q# |% M! R二、写个代码检验
/ K7 h! [' l# Q6 x- v! a下面我就简单的实现以下它的开关功能吧/ n* I1 x% r V1 I) t* @! @
: U7 m+ D6 R# u# d4 e3 h
- #include "jdq.h"' s' Z6 C: [6 |
- 4 t) s; C4 i9 u, K4 L1 V9 q
2 ~. D; `, M( w! r3 _# ^- void relay_init(void)//对继电器初始化,即对PB7口初始化4 m+ X# V1 g/ Y/ r5 y7 e
- {( c' {% r# I2 @( { }3 r
- GPIO_InitTypeDef GPIO_InitStructure;3 O9 [7 j) {& W3 _# r& ?* d+ x
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
2 [# M; G% s. I1 O" M+ v - * |! Z* x: g% }! w; w
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;2 S2 x9 u; g5 _( K3 t# i9 X. o
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//# ~" D- m& F. ]
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ w/ w3 N* a9 B4 K1 Q) [% e
- * U- ^6 O* P7 r* C/ |( X
- GPIO_Init(GPIOB, &GPIO_InitStructure);
$ N: f* W# w* f- o8 H -
- B3 h/ P: C7 o1 S - }
0 V- V, l" j4 W( f" \' q
, ?& ] Y6 k# ]0 d! M& q- void relay_on(void)//PB7置1
8 \' U' m7 @1 T) d9 S9 u - {9 W. p' K. L' D2 I# s7 N
- GPIO_SetBits(GPIOB,GPIO_Pin_7);6 n2 R/ Y$ z3 Z9 ~7 H
- }
; h% o W3 E" l: ] - ) R" j7 R! Q! z3 K
- void relay_off(void)//PB7置0/ [2 q; E& m9 N6 \: {/ @2 F6 h. j$ C
- {
9 q3 l$ B; H6 U& n - GPIO_ResetBits(GPIOB,GPIO_Pin_7);& @! X7 C- Q& }8 j+ m
- }
复制代码
1 [) [& f; v) c! w, p* H 主函数:
7 W+ h& `: }1 x+ w3 U9 I) v3 Q1 k* ~
- #include "sys.h"$ c% F* g% y7 ~6 n4 c2 r
- #include "delay.h"$ s# y% I0 }* e, P) m, K
- #include "led.h"
( N" N/ F- K6 ]6 y5 p2 W - #include "jdq.h"3 n4 U3 ]% b* M* @) F- I
- 2 {# y# z# w# i
- int main(void)
8 I. [' P7 T- a& ]* M7 S - { 7 p$ I. D4 |. L2 p8 f9 [
- delay_init(); - \: h0 f) b S, r% ~: @+ ?, I
- LED_Init();
( l3 ^- f8 O9 A2 C4 i$ t, [ - relay_init();//继电器初始化
4 |, N* G+ B9 B2 ~ - while(1)
- Y$ P n9 q* \$ ~0 x2 E - {
' G+ `9 a1 [5 L5 `2 h* ~ - 3 Y/ ^& Q/ [7 H: X9 v
- relay_off();//置0,即开关置NO,连常开% F, q- b: k( e- U
- LED0=0;
# N+ F) c$ a0 b# p) X0 J! _6 m - delay_ms(2000);//延时4s左右
) x1 n) _/ l6 G" F0 s3 N F7 z - delay_ms(2000);
" @: s9 W0 a5 L - delay_ms(2000);
: S+ y4 O! t: r3 p* p - delay_ms(5000);
( ^9 Z- U( H% i+ ?8 I3 h - delay_ms(5000);2 k: F5 p7 B( [5 Z2 {9 k
( }: l' \# p3 v6 O5 q: K; N% B6 b- relay_on();//置1,即开关置NC,连常闭' x0 q9 i/ W! G; k1 A. Z4 v
- LED0=1;
: L1 i. B1 ^! l, ]9 x2 r K3 D - delay_ms(2000);//延时4s左右# a" {- ]( \& O" c
- delay_ms(2000);2 c; q& h7 R% v- q( `5 A( a
- delay_ms(2000);
# { e' X& r# M8 q/ i( ~) h# D - delay_ms(5000);# G, X+ \ |0 m0 s/ Q/ ]
- delay_ms(5000);
! w- j4 o; h5 d( B; \ ~$ \$ z - }
7 L( Z* z1 q) y - }
复制代码
- F$ V2 {, R l# J. H 效果图如下:
+ Y* A' M' e! V9 Z$ r5 g. Z" v6 p1 R1 v* n
: a1 Z$ i$ ~: V# q8 g }# r3 ^" L
' O- A2 `' F# r2 ?
1 S, _( Y8 x; q8 n# {9 Q
8 P/ V$ @( D+ g$ {4 z/ R1 } 上面我只用了STM32F1的最小系统板测试了一下,光敏传感器检验了一下,注意我这里用的是一节3.7V的锂电池给光敏传感器供电,所以你在给继电器模块上的Vcc口接电源时记得接3.3V的,不能接5V的,不然没法驱动开关,因为这个的原理就是弱电控制强电,你如果比另外一端电压还大那就无法达到效果。 [' F7 m& w# A' k* N
) Z% [" v( s- I
继电器就是小电控制大电电路,切记!
: K9 q- K: \6 m2 }5 z$ j
* @+ r6 p5 |3 @ u( O" b注意继电器大部分都是高电平下连接常闭,低电平连接常开,有部分产家会是反过来,大家买回来如果不确定,可以像我这样做个小实验证一下。7 t/ Q) w& {# Q0 K
: p1 c- t6 r/ a2 ~& i
, m' W: W8 c+ `6 Q8 I- l0 t* g, g Z5 `! t
, C! A% v& P, e4 u
1 d6 g4 M9 o# F( u, N) _. X
|