在使用MCU时,常看到配置IO口为推挽输出、开漏输出,以STM32为例,IO口有一下集中模式,单片机的内部电路简化图如下:
1.推挽输出
2.开漏输出
3.复用推挽输出
4.复用开漏输出
一、推挽输出
推挽电路的示意图:
当IN输入低电平时,P-MOS导通,N-MOS截止,此时OUT输出的电压是VDD,高电平;
当IN输入高电平时,N-MOS导通,P-MOS截止,此时OUT输出的电压是VSS,低电平;
用推挽输出模式,可以得到一个明确的高电平或者低电平,可以实现高低电平的快速切换。在实际使用时,经常用IO口的高低电平去驱动一个LED或者是蜂鸣器,使用的就是MCU的推挽输出模式。
推挽输出驱动LED时,LED接地,此时电流的方向是从MCU往外输出,这个电流称为拉电流
反之,推挽输出驱动LED时,LED接电源,此时电流的方向是从外往MCU输入,这个电流成为灌电流。
不管是灌电流还是拉电流,都是针对IO口作为输出模式而言的,它们是衡量电路驱动能力的重要参数,数据手册上可以看到这个两个参数,在实际设计电路时使用的上拉电阻或者是下拉电阻,要根据这两个参数选择阻值,从而匹配电路的输出能力。
再以实际的STM32 为例,推挽输出模式,如果MCU的IO口要输出高电平,则P-mos导通,N-mos截止,此时IO引脚上的电压就是VDD高电平。
如果MCU的IO口要输出低电平,则N-mos导通,P-mos截止,此时IO引脚可以看做直接接了GND,所以是低电平。
二、开漏输出
开漏电路的示意图:
开漏指的是场效应管的“漏极”,开漏输出就是把场效应管的漏极直接引出来作为输出引脚。
开漏输出最重要的作用是:电平匹配,在设计电路时不论是单片机还是外设芯片或是负载,每个个体的逻辑电平可能是不一样的,这种情况时就需要作电平的匹配,就用到了开漏输出模式。
开漏输出模式,因为场效应管的漏极直接引出,是需要加一个外置电源的,我们可以通过外接电源的方式得到想要的电平。因为外接电源的方式,从MCU的角度来说,减轻了MCU的负担。
例如在使用MCU自带的IIC模块时,就要求配置想要的管脚为开漏输出模式, 多个开漏输出被接在了同一个线上,下图中如果其中的某个引脚的漏极为低电平,则整个总线上都是低电平,这是“与逻辑”,所以被成为“线与”。因为IIC总线可以接很多个设备,MCU就是通过这种方式判断当前总线的状态。
再以STM32为例:
当N-MOS与P-MOS都截止时,此时的引脚就相当于连接了一个无穷大的电阻,所有IO引脚对外呈现的是高阻态,当MCU供电为3.3V,开漏输出引脚上接外部5V电源时,因为N-MOS的阻值无穷大,所以此时IO引脚上的电压就接近与5V电压。
开漏的线与特性:当多个开漏输出链接到一起,当它们全部都输出高电平时,总线上才是高电平,但凡有一个开漏输出引脚上是低电平,总线就会被拉低。
三、复用输出模式
复用模式输出连接的是MCU的内部外设,例如PWM、USART、IIC。具体用复用开漏输出还是复用推挽输出,这个就要根据外设需求来设置,例如IIC在使用时需要用到线与特性,就必须在程序里配置IO引脚为复用开漏输出;像UART或者PWM功能,需要IO口高速变化确定的高低电平,则必须配置为复用推挽输出。