Stm32的GPIO驱动继电器

三极管
三极管S8050-D:
直插的字体面向自己从左到右依次是发射极E,基极B,集电极C

类型:NPN
集电极耗散功率Pc:0.625W(贴片:0.3W)
集电极电流Ic:0.5A
集电极-基极电压Vcbo:40V
集电极-发射极电压Vceo:25V
集电极-发射极饱和电压Vce(sat): 0.6V
特征频率f: 最小150MHz
放大倍数:160-300
找不到对应的三极管,就随便找了一个意思一下。

Stm32的GPIO驱动继电器_第1张图片
上图中,左边的GPIO_VCC表示STM32的GPIO口,它可以输出3.3V和0V电压。这里就用S1开关控制这两种电压。由于单片机的GPIO口的输出电流非常小 (功率很小),所以单片机的GPIO口只能驱动类似于LED灯、数码管等小功率用电器,而不能驱动像继电器这样大功率的用电器。
这时我们就需要用电流放大器对GPIO口的输出电流进行放大。可以用的放大器有三极管、运算放大器等。显然用三极管进行放大的电路更简单、成本更低。
上图中,三极管的集电极上连接的是一个普通的3.3V电源,通过一个10Ω的电阻进行限流。在电阻和三极管之间是输出电压Uo。这个普通的3.3V电源可以输出较大的电流,可以用来驱动继电器。
上述电路是一个反相器。输入3.3V高电压时,输出0V;输入0V低电平时,输出3.3V高电压。

继电器
SRD-03VDC-SL-C继电器:只需要3V电压就可以控制继电器中的单刀双掷开关,但不能用GPIO口的高电平驱动继电器,需要用上述提到的驱动电路进行驱动。比较安全的做法是把外接电源和常开端连接到外接的高压电路中。

Stm32的GPIO驱动继电器_第2张图片
所以,GPIO口通过三极管驱动继电器的电路如下:
左边是STM32的单片机端口通过三极管输出电压,右边是继电器。
当GPIO = +3.3V时,继电器的1和4引脚之间的电压约为0.7V;此时继电器的开关连接到3号引脚;负载R16上没有电流。
当GPIO = 0V时,继电器的1和4引脚之间的电压约为3V;此时继电器的开关连接到2号引脚;外部220V电路导通,负载R16开始工作。

由于继电器中1和4引脚之间的线圈是一个电感,所以当1和4引脚之间的电压从3.3V突然降低到0V时,电感的电流不会突变,这样就会对三极管产生一个反向电流/电压,可能会伤害三极管,缩短三极管的寿命。增加一个二极管可以保护三极管。当然,也可以加一个RC电路对三极管进行保护,但是电容会导致电路的峰型变差,所以我们更推荐用二极管。

Stm32的GPIO驱动继电器_第3张图片

万用表测量发现继电器的1和4引脚之间的电阻约为25Ω。
三极管的集电极上连接的电阻R10的阻值为10Ω。
三极管的基极上连接的电阻R取1k。

从上图可以看出,这个三极管构成一个反相器:
当GPIO为0时,三极管断开,继电器被驱动,电流值为3.3 V / 35 Ω= 94 mA。
当GPIO为1时,三极管导通,继电器被屏蔽,电流值为3.3 V / 10 Ω= 330 mA。

从这个分析看,这个电路图是有问题的。无论继电器是否在工作,电源上都要流出较大电流,这个电路的功耗是很高的。尤其是当GPIO为1时,R10的功耗为:0.33 * 0.33 * 10 = 1w,而此时我们的继电器实际上并没有工作。

改进:

Stm32的GPIO驱动继电器_第4张图片

现在在三极管的发射极 (E极) 上连接4.3k电阻 (也可以更大)。继电器并联在这个电阻上。
当GPIO为0时,三极管断开,发射极没有电流,功耗极低,继电器不被驱动。220V电流不导通。
当GPIO为1时,三极管导通,发射极上有电流,4.3k电阻上有2.6V电压。继电器也有2.6V电压,电流值为2.6 V / 25 Ω= 104 mA,继电器被驱动。
这个电路图中,功率要比改进前小很多。

另外,当GPIO = 0时,继电器不被驱动。当GPIO = 1时,继电器被驱动。
所以这个电路图中的逻辑与改进前的电路图的逻辑正好相反。

上面已经解决了继电器线圈的感应电流的问题。我们可以想象一下,一个小小的弱电控制线圈就可能击穿三极管,那么继电器控制的220V强电的开关瞬间是不是会造成更大影响呢?有的朋友说不会吧,从原理图上看,强电和弱电是完全分开的,强电应该不会影响控制系统才对。我们可以想象一下,太阳光就是电磁辐射,即使太阳离我们那么远,它对我们仍然有很大影响。如果220V电源的开关突然断开,很可能产生几千伏的电弧,在继电器这么小一个空间里,很可能对控制系统产生非常大的影响。所以,我们需要对接触器 (强电开关) 的电路进行改进,以避免电弧的产生。

在继电器线圈那边并一个二极管可以把线圈的感应电流导出去,但是在220V强电的触点开关附近可以用并一个二极管吗?显然不行,因为我们用的220V电源是交流电,并上一个二极管,那就至少有一半时间是短路,肯定会跳闸的。解决办法是连一个RC电路,用来吸收产生电弧的能量。

Stm32的GPIO驱动继电器_第5张图片

这里用的电阻经验值为10-100欧姆,电容经验值:0.1uF/250V或者0.22-0.47uF,要使用无极性的陶瓷电容 (我用安规电容X2)。
这里的电容就是用来吸收产生电弧的能量,然后通过电阻把能量变成热量释放掉。问题是电容的作用是“隔直通交”,把这个电容放到220V交流电上,这不是短路了么?我们来算一下:这个RC电路的截止频率为:
,R为电阻值,取100Ω;C为电容值,取0.1uF。
则fc = 15.9 kHz。也就是说1.59 kHz以下的交流电基本无法通过这个RC电路。而我们用的交流电是50Hz的,所以这个RC电路对于220V交流电来说可以认为是断开的。

注:
1、怎么判断我们的电路中的RC电路是高通电路,而不是低通电路?对于R3和C1组成的RC电路,如果交流电的频率非常低,低到接近直流电,则这个RC电路相当于断开。而继电器的220V触点部分不受影响,所以这个RC电路是高通电路,当电源的频率低于fc的10%时,基本无法通过。而220V的交流电的频率是50Hz,小于fc * 0.1,所以通过这个RC电路的电流很小。
2、由于通过这个RC电路的电流很小。所以C1承受了220V的电压。
3、这个RC电路是高通电路,所以当接触器断开瞬间产生的高频信号将被RC电路中的电容吸收,然后通过R3缓慢释放,将电能转化成热能。当接触器接通的瞬间,接触器也会产生高频信号,这个信号也会被RC电路吸收。所以这个RC电路可以保护接触器开关瞬间的高频信号。
3、这里的C1是安规电容X2。交流电的有效值是220V,其峰值达到220 * 1.414 = 311V。安规电容X一般都标有安全认证标志和耐压AC250V或AC275V字样,但其真正的直流耐压高达至少2500V(X2)以上。所以使用的时候不要随意使用标称耐压AC250V或者DC400V之类的的普通电容来代用。安规电容X2是专门用来放在横跨220V交流电上的电容。

Multisim仿真如下,通过RC电路的电流值非常小。

Stm32的GPIO驱动继电器_第6张图片

如果我们调整一下电阻和电容值,再次仿真发现电流值明显变大。说明选取合适的电阻值和电容值很关键。

Stm32的GPIO驱动继电器_第7张图片

有了上述电路之后,我们基本可以正常使用继电器了。但这里还有一个问题,如果我们的外部电路电压突然升高 (浪涌),我们的电路还能抗住吗?这就需要在最外面加一个保护电路了。这是一个电源模块产品说明书上的保护电路:

Stm32的GPIO驱动继电器_第8张图片

电源保护电路已经超出本文的讨论范围了,这部分内容我们将新开一篇文章进行讨论。

小结:
由于单片机的GPIO的电流很小,所以需要通过三极管对电流进行放大,然后驱动继电器。继电器中的线圈和触点在接通和断开瞬间会对整个电路造成很大的影响,因此要对继电器的线圈和触点分别进行保护。我们对这整个过程进行了讨论。

如果采用固态继电器,由于接触器部分不会断开,所以也就不会有电弧,因此采用固态继电器会对电路比较友好,然而固态继电器的价格大约是机械继电器的10倍。当大量制造设备的时候,我们更倾向于采用机械继电器。所以,对于继电器的保护和电磁辐射吸收的内容要好好理解。

你可能感兴趣的:(电路)