前言
因为最近用到了继电器,所以稍微记录一下继电器的用法。
如果我们需要点亮一个LED灯的时候,我们只需要用单片机的GPIO口去输出高低电平驱动就行。
但是我们需要通过单片机去控制大电压器件的开关的时候,我们就不能简简单单地用一个GPIO口去控制了,这时候我们需要用到继电器。
继电器
上图是我有的继电器(是磁吸式的,不过不重要),其他继电器的用法也大差不差。
可以看到有6个接口,分别是NO,COM,CN;VCC,GND,IN。
我这款继电器是5V直流驱动的(继电器表面最下面一行写的),所以我们需要在VCC接5V直流电压(实测STM32F103提供的3.3V带得不动我这款继电器,因此我使用了5V锂电池),GND就接地。IN随便接一个GPIO口用于驱动继电器。
接下来是重点,我们抛开原理不谈,直接说用法。当继电器工作时,也就是你的IN触发了继电器工作(具体看你的继电器是高电平驱动还是低电平驱动),COM和NO是连通的,而COM和CN是断开的。当继电器不工作时,COM和NO是断开的,而COM和CN是连通的。
一般情况下,我们要点亮一个灯是像上图这样的。
而我们要用单片机去控制一个灯的开关,并且默认灯是关着的时候是像下图这样的,原本直接连通的线我们破开,一路接COM,一路接NO。
这样默认情况下COM和NO是断开的,当我们给IN的电平驱动继电器工作时,COM和NO连通了起来,灯泡也就亮了,我们也就成功通过单片机控制继电器从而控制灯泡的开关。
当我们要用单片机去控制一个灯的开关,并且默认灯是开着的时候是像下图这样的,原本直接连通的线我们破开,一路接COM,一路接NC。
这样默认情况下COM和NC是连通的,当我们给IN的电平驱动继电器工作时,COM和NC断开,灯泡也就灭了,我们也就成功通过单片机控制继电器从而控制灯泡的开关。
通过STM32F103实测
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef itd;
itd.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
itd.GPIO_Pin=GPIO_Pin_0; //使用Pin_0号引脚
itd.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&itd);
while(1){
GPIO_WriteBit(GPIOA,GPIO_Pin_0,1);
Delay_s(1);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,0);
Delay_s(1);
}
}
代码没什么可说的,就是让一个GPIO口高低电平切换,我们就是用这个GPIO口去接继电器的IN口来操控继电器的。
可以来看看我的接线。
我的LED以及继电器都是用的5V锂电池供电的(因为STM32F103的3.3V带不动继电器,因此用了锂电池,因为用了DC降压模块,实际电压差不多是4V),上图的线比较乱,我再画个平面图。
简单来说就是在LED通电的情况下,用继电器把原本连通的电路给阻断。
值得一提的是由于STM32F103的3.3V带不动继电器,因此用的额外的电池给继电器供电,但是需要STM32的GND和继电器的GND共地。一开始没有共地导致STM32F103即使是输出高电平也是触发了继电器工作,因为GND不同,因此电压的高低电平会有偏差,使得单片机即使是输出了高电平,在继电器眼里仍然是低电平(我的继电器是低电平触发),后来共地就好了。