1.4 I/O引脚驱动继电器

在一些51单片机的应用系统中,需要使用I/O引脚来控制一些大电流设备的启动或者停止,如电磁铁等,此时需要使用继电器作为中间介质,用单片机的I/O引脚来控制继电器的通/断,然后再用继电器来控制这些设备的启动或者停止。

1.4.1 继电器的工作原理

继电器是一种电子控制器件,它由控制系统(又称输入回路)和被控制系统(又称输出回路)组成,通常应用于自动控制电路中,其实质是用较小的电流去控制较大电流的一种“自动开关”,在应用系统中起着自动调节、安全保护、转换电路等作用,在51单片机系统中常常用于通/断控制。其基本参数如下。

额定工作电压/电流:继电器工作时线圈需要的电压/电流,决定了51单片机驱动这个继电器接通或者闭合所需要的电压/电流。

直流电阻:线圈的直流电阻,是指当继电器被接入电路之后其等效电阻的大小,也就是说其在电路中的实际效果和多少欧姆的电阻相同。

吸合电流:继电器能够产生吸合动作的最小电流,51单片机系统要想控制继电器闭合,所提供的控制电流必须高于这个电流。

释放电流:继电器产生释放动作的最大电流,当51单片机系统的控制电流小于这个电流时,继电器释放。

触点负荷:继电器触点上允许通过的电压或电流,决定了继电器能否用于控制外部设备。

封装和控制形式:前者是指继电器的体积大小、引脚分布;后者是指一对控制点能控制几对线圈。

图1.11是常见的继电器实物图,其在单片机系统中的具体用法和LED的区别不大,需要特别注意的是继电器的额定工作电压和吸合电流这两个参数。由于51单片机I/O引脚承受的电压最高只能达到5V,而很多继电器的额定工作电压达到了12V、24V甚至更高,并且前面已经介绍过51单片机I/O引脚的驱动电流能力有限,此时就需要外加功率驱动器件来驱动继电器。

图1.11 常见的继电器实物图

1.4.2 功率驱动器件的工作原理

功率驱动器件是将小信号(电压/电流)放大的器件,常见的功率驱动器件有三极管、达林顿管和功率光耦等。

1. 三极管工作原理

半导体三极管是一种用电流来控制电流的半导体器件,是51单片机系统中最常用的功率驱动器件,其作用是把微弱信号放大成辐值较大的电信号,也常常用做无触点开关(如用做多位数码管的选择控制器件)。三极管可以按材料分为锗管和硅管,而每一种按照电流结构又有NPN和PNP两种形式,但使用最多的是硅NPN管和锗PNP管两种。图1.12是常见的三极管实物图。

图1.12 三极管实物图

三极管有多种型号,最常用的是9013和8550,前者为NPN型三极管,后者为PNP型三极管,使用这两种三极管来驱动外围器件的典型电路图如图1.13所示。当控制端输出高电平时,三极管导通,在继电器两端形成电压差,继电器闭合;当控制端输出低电平时,继电器断开。需要注意的是控制端上的电阻必须选取合适,因为较小的电流不足以使三极管导通。

图1.13 使用三极管驱动外围器件的典型电路

2. 达林顿管工作原理

达林顿管又称复合管,其原理是将两只三极管适当地连接在一起,组成一只等效的新的三极管,该等效三极管的放大倍数是前两只三极管之积。达林顿管常用于驱动需要较大驱动电流的器件。常见的达林顿集成器件有ULN2003和ULN2803,图1.14是ULN2003的内部结构和外部引脚示意图。

图1.14 ULN2003的内部结构和外部引脚

ULN2803和ULN2003的内部结构类似,只是ULN2003为7路而ULN2803为8路,ULN2803的引脚说明如下。

IN1~IN8:输入引脚,可以直接由51单片机的I/O引脚控制。

OUT1~OUT8:输出引脚,其逻辑是输入引脚的输入逻辑取反,当输入为逻辑“1”时输出为逻辑“0”;且需要加上拉电阻,该上拉电阻的上拉电压必须和VCC(COM-MON)引脚上的电压相同。

GND:电源地引脚。

VCC:也称为COMMON,电源正输入引脚,该引脚外加电压可以为0~50V,由被驱动的通道决定。

ULN2803一共有8个通道,可以任意使用其中多个通道。图1.15是ULN2803驱动继电器的典型应用电路,外部的控制信号连接到ULN2803的输入引脚,输出引脚加上拉电阻,然后使用“灌电流”驱动方式连接到继电器两端。需要注意的是ULN2803的逻辑是相反的,也就是说如果输入为逻辑高电平,则输出为逻辑低电平。另外,这个VCC可以修改为0~50V之间的电压,用于驱动不同额定工作电压的继电器。

图1.15 ULN2803驱动继电器的典型应用电路

3. 光电隔离器工作原理

光电隔离器是51单片机系统中最常用的避免外界干扰的器件,同时也是用于驱动小功率的外围器件。其原理是将电信号转变为光信号,把光信号传输到接收侧之后再转化为电信号。由于光信号的传送不需要共地,由此可以将两侧的地信号隔离,从而杜绝干扰信号通过信号地的传输。光电隔离器件又称为光耦器件(Optical Coupler),是一种以中间媒介来传输电信号的器件,通常将发光器件和光检测器封装在器件内部,当输入端加上电信号之后发光器件发出光信号,光检测器接收到光信号之后产生电信号从输出端输出,从而实现“电-光-电”的转化。典型的光电隔离器原理如图1.16所示,它由左边的发光二极管和右边的光敏三极管构成。当左端的输入为“0”时,发光二极管上没有电流通过,不发光,右边的三极管处于截止状态,输出高电平“1”;反之,当左端输入为“1”时,发光二极管发光,右边的三极管导通,输出低电平“0”。

图1.16 典型的光电隔离器原理

光电隔离器件可以在传输信号的同时有效地抑制尖峰脉冲和各种噪声干扰,大大地提高了开关通道上的信噪比,其工作原理如下。

光电隔离器件的输入阻抗只有几百欧,比较小,而相对来说干扰源的阻抗一般都在几兆欧,比较大,由分压原理可知,即使干扰电压的幅度很大,反馈到光电隔离器件的噪声电压也会比较小,不足以使发光二极管发光,从而被抑制。

光电隔离器件的输入回路和输出回路之间没有物理上的连接,分布电容极小,而绝缘电阻极大,所以各侧的干扰很难传递到另外一侧,从而可以有效地避免干扰信号的传递。

光电隔离器件的选择需要考虑以下几个参数。

发光二极管的工作电流:决定MCS51单片机用多大的输出电流能使发光二极管发光,光电隔离器件的三极管导通。

电流输出比:常用直流电流传输比来表示,是指发光二极管加上额定电流IF时,激发三极管导通,此时三极管工作在线性区的集电极输出电流为IC,则电流传输比为IC/IF,此参数决定了光电隔离器件的驱动能力。常用光电隔离器件的电流传输比一般为0.5~0.6,而某些复合的光电隔离器件的电流传输比可以达到20~30。

传输速度:光电隔离器件在工作过程中要进行“电-光-电”的转化,这种转化的速度决定了数据的传输速度。常见低速光电隔离器件的传输速度一般在几十到几百千赫,而类似6N137之类的高速光电隔离器件的速度可以达到几兆赫。

耐压值:由于光电隔离器件的两侧属于两个不同的地信号,在某些工作场合下这两个地信号之间的电位差可以达到几千伏,而这些电位差最终都加在光电隔离器件的两端,为了避免被击穿,一定要选择有足够耐压的光电隔离器件。

此外,在实际使用过程中还需要考虑光电隔离器件的其他电气指标,如电压、功耗等。

1.4.3 应用实例——轮流加热显示系统

轮流加热显示系统是一个用51单片机控制3个继电器轮流接通、给3个设备加热5s并且使用一位数码管来显示当前正在加热的设备编号的应用实例。

图1.17是轮流加热显示系统实例的应用电路,51单片机用P2端口通过ULN2803驱动3个工作电压为5 V的继电器,用P1口驱动一个数码管用于显示当前接通的继电器编号。表1.6是实例中涉及的典型器件说明。

图1.17 轮流加热显示系统实例应用电路

表1.6 轮流加热显示系统器件列表

【例1.6】 轮流加热显示系统实例的应用代码,使用3个位变量来控制继电器的通/断,分别对应P2.0、P2.1、P2.2引脚。为了便于阅读,使用宏定义对继电器的通/断和显示数字等进行预定义操作。由于继电器是使用“灌电流”驱动方式来驱动的,所以当对应的I/O引脚输出低电平时该继电器闭合。在代码的编写中使用宏定义#define ON 0来代表继电器闭合以增强代码的可读性;同理,有代表继电器断开的宏定义#define OFF 1。在主函数中使用Delayms函数来控制延时。

        #include <AT89X52.h>
        #define ON  0
        #define OFF 1                        //定义继电器开关常量,注意ULN2803是反向的
        #define NO0 0xC0
        #define NO1 0xF9
        #define NO2 0xa4
        #define NO3 0xb0                     //定义数码管显示的字形编码,0、1、2、3
        sbit R1 =P2 ^0;
        sbit R2=P2 ^1;
        sbit R3=P2 ^2;                    //定义3个继电器的控制引脚
        void Delayms(unsigned int MS)     //延时MS函数
        {
            unsigned int i,j;
            for(i=0;i<MS;i++)
                for(j=0;j<1141;j++);
        }
        main()
        {
            unsigned char SegLED;          //数码管显示内容
          R1 =OFF;
          R2=OFF;
          R3=OFF;                          //初始化为关闭
          SegLED=NO0;                      //输出显示0
          while(1)
          {
            Delayms(5000);
            R1 =ON;                       //接通继电器1
            SegLED=NO1;
            P1 =SegLED;                   //数码管显示1
            Delayms(5000);              //对1 号设备加热5s
            R2=ON;                        //接通继电器2
            SegLED=NO2;
            P1 =SegLED;                   //数码管显示2
            Delayms(5000);              //对2号设备加热5s
            R3=ON;                        //接通继电器3
            SegLED=NO3;
            P1 =SegLED;                   //数码管显示3
            Delayms(5000);              //对3号设备加热5s
          }
        }