前言7 Y5 f: a5 L$ d5 z; e
* W p/ K. B. i! w
相信很多志同道合的小伙伴们已经找到了学习STM32的好途经(灵光一闪刷到我的博客)了,接下来的时光里,我会讲到一些我对一些模块的使用,同时附上源码还有我的心得。没错,今天我讲的就是继电器的使用。' F9 f2 S3 o% B) t* ^0 T
{0 N/ q3 `9 r2 k) H1 v$ T( e
) }0 q+ `5 n. A3 d
; a1 l: j0 I0 Q# K 一、继电器的使用(重要!!!)
' [( G% F4 r4 F5 _; \其实继电器简单来说就是一个开关,VCC表示电源正极、GND表示电源负极、IN表示信号输入脚,COM表示公共端,NC(normal close)表示常闭端,NO(normal open)表示常开端
: V- s, M1 b, u9 n+ G2 s$ E8 w0 @' H5 b" E+ \! ?
一般情况下是常闭状态
' l; `" F: _% A0 Q% w5 k0 X# L" g
这里简单地描述一下大部分的继电器模块:
1 b/ M& _$ |, z$ L& K8 G# m- O! k9 B4 c
Vcc接电源正极,Gnd接电源负极,In接STM32上的输出脚(输入高电平公共端连常闭,输入低电平公共端连常开),如下图所示,你就可以明白了,当IN脚输入高电平时,NC与COM相连(左图);当输入低电平时,NO与COM相连(右图)。8 a8 {0 Q$ G! L
# @ E5 ^9 i S3 u1 [; f" Q% p
9 w+ F: d, a7 e b8 j6 M: c% y
! n$ g6 K$ W& t( x& {. I5 N
相信这样子你就对继电器有了基本的使用了解,下面我就不讲解其内部的结构原理了,可以到其他文章上学习具体原理,附上链接
0 R8 g# X. s: ?& N- L5 S! M6 G/ z) e
二、写个代码检验8 |" K7 T$ h! a# r
下面我就简单的实现以下它的开关功能吧
# E# l) |& r6 ^9 Y0 H" j+ b3 y0 H$ s% y9 t! B2 f
- #include "jdq.h"
4 N; f3 Y% q, M( K+ y$ d( g: f
k3 }: r3 c) b
: _3 e& y$ m+ ^$ @' a- void relay_init(void)//对继电器初始化,即对PB7口初始化
" Z. K7 s4 m% h! k6 t$ ~9 g7 d - {- Q: R7 H c/ H' e
- GPIO_InitTypeDef GPIO_InitStructure;+ \9 |( U% Q$ G8 F! M2 k' ?5 H
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);1 b, G1 C7 f1 q
-
- \# S# v0 n9 I2 ^) |0 m - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;; k1 ~; L5 e7 o8 W5 y, b* f) ?
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//0 A4 u/ B5 ]2 w" J0 P0 n' k
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
* C/ m, w8 k& T" A6 | -
. W. v$ q$ Y& V - GPIO_Init(GPIOB, &GPIO_InitStructure);& {$ o- K4 p, W {, q
-
& w% V+ L! F0 g - }
8 z3 T! _( L' Y7 d/ f2 U+ J% } - / _# L9 m4 S% s b5 a
- void relay_on(void)//PB7置1
4 z5 ~3 y2 q( X8 ]; S& t) R - {
2 O! {% o! g1 u6 A! V4 R7 r1 t) d - GPIO_SetBits(GPIOB,GPIO_Pin_7);
R4 R) \0 p0 @2 L0 {0 ?: w5 e - }
- Z$ k! W% o) ]. R* {" p - ; ? ? }5 r; \
- void relay_off(void)//PB7置0) e7 J. q" A& [" l F
- { , }' ^. s# s O
- GPIO_ResetBits(GPIOB,GPIO_Pin_7);. r' s% d9 ~7 E) v+ V5 ]1 l
- }
复制代码
( v T+ R/ P. f6 t$ ?' m 主函数:+ k! x5 L5 F2 z1 P+ h
I/ j; G+ Q4 o
- #include "sys.h"
, T& R# T! d7 r9 N1 u% u% G - #include "delay.h"7 Z: F5 q- ^' K: F3 v, v% q
- #include "led.h"+ m# l P' P' ]0 ]
- #include "jdq.h"
% ?! t2 G% S; z# G0 ?( t
! }+ B8 j4 d* Z( V. F- int main(void)2 N* V% d1 B8 G) K8 d; J
- {
9 } b4 q, `0 z0 P$ L4 k0 O0 E - delay_init(); # _* Z n' o/ t, h* y6 H" n3 z* K% F
- LED_Init(); 5 c# m' B8 B" @' w. }" V2 H* }
- relay_init();//继电器初始化
6 a/ j+ b5 E" ?/ @5 l$ } - while(1)0 r" Z$ n$ s$ }& Q# V( i
- {
3 V- \$ N1 U; @" q3 J( K - ) p( C% Q [4 s
- relay_off();//置0,即开关置NO,连常开( r. i2 k, n2 v- i0 B
- LED0=0;, _3 L5 k; h: O& l
- delay_ms(2000);//延时4s左右 i5 y( B% k9 D; O' p. ?+ ^6 X
- delay_ms(2000);
) j9 b; m' ]: A - delay_ms(2000);
$ y2 r) z5 Q% J# C - delay_ms(5000);8 M0 Z: Z1 K1 Q) j- t1 s
- delay_ms(5000);
. `$ ^3 j0 `$ Y" \ D. _ - * N, @+ Q7 S6 g/ {: W6 p. S
- relay_on();//置1,即开关置NC,连常闭" D1 ?9 U( P0 A. T
- LED0=1;3 F8 F/ z' j( q. n- A- v
- delay_ms(2000);//延时4s左右3 }. W/ J4 I' @
- delay_ms(2000);
5 e. y% ^: N+ ~1 m - delay_ms(2000);
3 @# @& C! `2 l9 u - delay_ms(5000);
, o% r, \' u- j5 c# v9 u - delay_ms(5000);
3 S1 z8 X( B9 t( \8 [# w - }* `9 `% [, t. L5 ]) K% |3 K8 b. @2 p+ Q
- }
复制代码 * ^1 E( s$ c* C+ m t3 r
效果图如下:
2 V0 g6 U9 B/ ~2 V' r+ @+ o( z
. m- p0 y/ Z2 E
) v! Z/ R* s2 A
, Y% v+ |- E" _8 M8 a* Y
w+ J( G3 H1 g) @8 Q( P. y 上面我只用了STM32F1的最小系统板测试了一下,光敏传感器检验了一下,注意我这里用的是一节3.7V的锂电池给光敏传感器供电,所以你在给继电器模块上的Vcc口接电源时记得接3.3V的,不能接5V的,不然没法驱动开关,因为这个的原理就是弱电控制强电,你如果比另外一端电压还大那就无法达到效果。+ V8 w! U5 T( U6 U
" Q2 X# F( L$ x& R# z继电器就是小电控制大电电路,切记!; p& s' u: {/ g( ?: d. D+ D7 N
" G ], w$ ~: b9 f! e
注意继电器大部分都是高电平下连接常闭,低电平连接常开,有部分产家会是反过来,大家买回来如果不确定,可以像我这样做个小实验证一下。$ e. Q/ e' Y2 z) z
' T' b( k7 g& [' q
" N% S: y" d2 [/ F
; |2 R# [. z0 o+ \4 |2 F2 ]
: K/ B% d; h+ g: S; p+ B) x3 G! J: z3 Q; n8 C. n
|