浅谈单片机的GPIO外部驱动电路(三极管驱动电路)
序
一般而言,我们在开发各种单片机外围电路的时候,总会遇到两个问题:
- 单片机供电电压普遍3.3V,虽然STM32的管脚可以容忍5V电压,但如果是超过5V的电压,单片机就无能为力了。
- 就以典型的STM32F10x为例,I/O引脚电路max为±25MA,以下为ST官方说明:
就这点电流,驱动一个LED都有点困难,想要驱动别的,比如数码管啊,或者是继电器一类的就更吃力了。
小电流驱动大电流的方法
小功率LED驱动
一般而言,单片机使用LED都会将LED的阴极连接至单片机的引脚,然后,阳极连接VCC。
但是这样,也有一个问题,VCC的电流一般都比较大,在几百MA,而一个小小的二极管的电流消耗也不多,顶多几十MA,所以。。。
我们需要在二极管的阳极与VCC之间加一个限流电阻,以防止大电流导致的二极管烧毁。
限流电阻阻值
我们知道LED是一个非线性元件,但是在这个电路中,我们可以简化的看成一个接近2V的二极管。不同颜色的LED稳压值不同,但都在2V左右。通常我们按2V值进行计算;工作电流一般在0到25mA这个区间,最大工作电流具体还要看其温度特性,如果它工作环境比较恶劣,可能最大电流就只有8mA左右。这个电流作为最大电压时的工作电流。通常我们设计时取2mA到3mA左右即可。因为电流再大,其亮度变化不明显。这样我们就有了计算公式:
当工作在直流5V系统时,其电阻结果是1k~1.5k左右,我们取1k。
限流电阻功率以及封装
有了上面计算的电阻值和电流值,我们就能计算最大消耗功率。由于消耗在电阻上的功耗是热量,交流可按有效值进行计算。
对于5V系统,电阻消耗:3V*3V/1k=9mW,稳定性及容差考虑取2倍功耗电阻,即>18mW;
大功率继电器驱动
首先,不得不说一下继电器的结构,简而言之,继电器的控制端就是一个电磁线圈,通电后,线圈变成了一个电磁铁,把触电的铁片吸附,来使受控端导通。
所以,我们需要做的就是控制这个电磁铁的通电与否。
== 那么,我们把LED的驱动电路用在继电器的驱动电路上可以吗? ==
当然不行。第一点,单片机IO的驱动能力有限,对于单片机来说,继电器和电磁阀这种负载已经属于非常“大功率”的负载了,已经超出大多数单片机的IO驱动能力。第二点,继电器的控制端是一个电磁线圈,可以简化看成一个电感,这类感性负载在关断时会产生自感电压,也容易烧坏单片机。
所以,我们需要一个间接的方式来驱动他。
然而关于间接驱动,我们想要做到的只有两个要求,第一,将IO口的电流进行放大,并驱动电磁线圈,第二,将线圈产生的自感电压进行屏蔽或者过滤。
电流放大
明白了要求,那就很好找到解决方案,学过模电的同学都知道一个电路:三极管放大电路
一个普通的共射极放大电路
当然,直接的共射极放大电路远远不能对继电器进行驱动,我们得让他变化一下,来符合我们的使用要求。
第一点,C1和C2这两个电容肯定不能在电路存在,因为电容的特性就是隔直通交,假如存在,我们将很难讲IO的电平信号传入三极管内部,三极管的控制信号很难传入到继电器内部。
第二点,为了提高电路的放大倍数,进而去掉发射极电阻R1,但是,IO电平肯定不能让其处于浮空的不确定状态,于是,我们需要保留R2,使基极电平处于接地状态。
第三点,为了限制基极的电流,我们需要在基极添加限流电阻(如果没有这个电阻,输入电压一超过0.6~0.7V,二极管处于导通状态,基极将会有很大的电流通过)
第四点,为了减小功耗,我们还得把Re的电阻去掉。
综上所述,我们得到了以下电路:
这样的电路,就是一个很好的大电流驱动器。
当Input没有输入电平信号,或者输入低电平信号时,三极管基极没有电流通过,此时处于截至状态,VCC的电流到达集电极截止,整个电路处于断路状态。
当Input输入高电平时(大于最低导通电压,根据三极管的型号而定),三极管的基极有了电流,三极管导通,VCC电流从集电极流入后,从发射极流出接地,整个电路通路。
当然,做了这些以后,我们驱动一般的负载,比如说蜂鸣器啊,大功率的LED什么的可以,如果要驱动继电器,还差点东西。
屏蔽自感电压
一般而言,屏蔽自感电压只需要一个小小的二极管就可以来做到反向续流,抑制浪涌。
最终原理图就是这样。
R1限流电阻一般2-5K,R2的下拉电阻阻值在10K,二极管可以选择1N4148,三极管一般选取VCBO≈VCEO≥24V,放大倍数β一般选择在120~240之间,推荐8050,继电器淘宝搜一下5V继电器一抓一大把。