漏极开路(OD)原理说解

漏极开路(od)原理说解
漏极开路(od),它与集电极开路(oc)是一致的,就是把下图的三极管改成cmos管就是了。
集电极开路(oc)输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输入为“0”时,前面的三极管截止(即集电极c跟发射极e之间相当于断开),所以5v电源通过1k电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于开关断开)。
为了方便理解,我们把上面的图1改写成图2的样子。
图2中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出电平为0。而当开关断开时,则输出端悬空了,即高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。也就是说这个输出端的电平是受负载的影响的。这样是很不稳定的,要避免这种情况。最多的就是使用上拉电阻。
再看图三。图三中那个1k的电阻即是上拉电阻。如果开关闭合,则有电流从1k电阻及开关上流过,但由于开关闭和时电阻为0(方便我们的讨论,实际情况中开关电阻不为0,另外对于三极管还存在饱和压降),所以在开关上的电压为0,即输出电平为0。如果开关断开,则由于开关电阻为无穷大(同上,不考虑实际中的漏电流),所以流过的电流为0,因此在1k电阻上的压降也为0,所以输出端的电压就是5v了,这样就能输出高电平了。但是这个输出的内阻是比较大的(即1kω),如果接一个电阻为r的负载,通过分压计算,就可以算得最后的输出电压为5*r/(r+1000)伏,即5/(1+1000/r)伏。所以,如果要达到一定的电压的话,r就不能太小。如果r真的太小,而导致输出电压不够的话,那我们只有通过减小那个1k的上拉电阻来增加驱动能力(所谓的驱动力,往往与电流有关的)。但是,上拉电阻又不能取得太小,因为当开关闭合时,将产生电流,由于开关能流过的电流是有限的,因此限制了上拉电阻的取值,另外还需要考虑到,当输出低电平时,负载可能还会给提供一部分电流从开关流过,因此要综合这些电流考虑来选择合适的上拉电阻。
p.s:说到oc门的话,大家都能想到三态门,那么就不得不提起它的“线与”功能了,这个功能是很方便的。操作上面也很简单。如下附图:
另一种输出结构是推挽输出。推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起oc或者od来说,这样的推挽结构高、低电平驱动能力都很强。如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的oc或od输出则不会有这样的情况,因为上拉电阻提供的电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,有些单片机的一些io口就是这种结构。
总结:从上面也可以知道了,i/0输出有两种方式。那么现在的难点就是如何让i/0口输入数据。其实上面已经讲过了,就是只需要把输出设置为高阻状态就可以了。那么有些新人就会问了,都设成高阻状态了,数据还怎么输入啊?这其实是一个误区,其根本是没有理解i/o口的结构。
如果我们将一个读数据用的输入端接在输出端(这就是上面疑惑的答案了),这样就是一个io口了(51的io口就是这样的结构,其中p0口内部不带上拉,而其它三个口带内部上拉),如图4所示。当我们要使用输入功能时,只要将输出口设置为1即可,也就是要把下面的z=1,这样就相当于那个开关断开,而对于p0口来说,就是高阻态了。
到现在为止,已经把输入输出端口原理已经讲明了了。如果理解了上面所讲的,那么写程序也就是的把对应的端口进行设置就ok了,比较简单的。如果不明白,可以问我,qq或者邮件都可以,最后我会留下联系方式的。
那么下面我们开始讲解一下相应的程序语言吧。我用的单片机芯片是加强型的51单片机c8051f020,它都外扩了一些功能,如ad、da、温度传感器,但是核心还是没有改变的。要与fpga进行通信,我用quartus ii的vhdl语言进行编程。也就是说,单片机与fpga都要进行相应的端口设置。
先讲解一下fpga方面的编程,如图5,这是在quartus ii界面里的图形
其中端口含义如下:in_num[15..0]——代表要从fpga向单片机传输的数据总线
out_num[15..0]——代表要从单片机传送给fpga的数据总线,它与in_num[15..0]在直
接与其它的端口(软件界面里面)直接与其它端口连接
mcu[15..0]——代表硬件上要与单片机连接的端口。
clk---则是时钟信号,
en--使能信号,当它为高的时候,则单片机向fpga传输数据,否则传输方向相反。
对应的vhdl放言如下:
library ieee;
use ieee.std_logic_1164.all;
entity interface2 is
port(mcu:inout std_logic_vector(15 downto 0);
in_num:in std_logic_vector(15 downto 0);
out_num:out std_logic_vector(15 downto 0);
clk:in std_logic;
en:in std_logic);
end interface2;
architecture rtl of interface2 is
signal a,b:std_logic_vector(15 downto 0);
begin
common: process(clk)
begin
if(clk'event and clk='1')then
a<=in_num;
out_num<=b;
end if;
end process;
wri_read:process(en,mcu)
begin
if(en='1')then
mcu'z'); --
b<=mcu;
else
mcu<=a; --当en='0'的时候,就作为输出端口
end if;
end process;
end rtl;
这里有几个注意点:一、首先最好只用一个双向口,也就是我这里的mcu[15..0],另外一个“双向口”则等效成一个输入口与一个输出口,也就是这里in_num[15..0]与out_num[15..0].否则会有麻烦的。因为如果不这么做,那么在quartus里面与这个双向口相连的端口必须都要设成双向口,这样的话,嘿嘿...
二、与那个mcu[15..0]相联系的端口必须是双向口的,具体图解如下。
最后,进行单片机方面的设置了,其中最重要的就是端口初始化了。如下:
//这个是fpga要求的,当从fpga里读取数据时所要满足的条件
//众所周知,在双向口的设置中,对于端口的输入与输出的设置是最重要的
//输入时一定要记得把双向口的输出设置为高阻状态,在单片机中要记得设置为漏极开路
//当输出要记得把单片机设置为推挽输出,否则设置为漏极开路的话是达不到效果 的
void readdata(void)
{
en=0; //这部分要与fpga联合起来设置 p1mdout=0x00; //此时单片机设置为漏极开路,在对端口写1时才能呈现高阻状态
p74out=0x00; //这里我用的单片机是用p1口与p4口用来传输数据的
p1=0xff; //对应端口写1,设置成高阻状态
p4=0xff; //对应端口写1,设置成高阻状态
}
//这个也是fpga要求的,当往fpga里写入数据时所要满足的条件
void writedata(void)
{
en=1; //当en=1时,我要向fpga里面写数据了,
p1mdout=0xff; //写数据的时候,别忘记把对应的端口改成用推挽方式
p74out=0x03; //不用的引脚设成漏极开路的状态.当输出的方式时才把它设为推挽输出
}

工程能力是关键,自动驾驶无图方案加速进入前装量产
卫星射频前端的性能、功能要求及应用解决方案
科大讯飞语音控制模块怎么用
5G风生水起,中国主动权话语权显著提升
采用PCA82C250芯片的照明控制系统及短距离无线通信介绍
漏极开路(OD)原理说解
高超声速飞行器输入受限反步控制研究探讨
曝小米11 Pro将首发业内最大的传感器
掌握这些技巧,你也能成为电路板大牛
谷景告诉你功率电感损坏会怎么样
智能家居行业,终端销售的核心因素是什么
一项基于人工智能和无人机的研究——利用无人机拍摄人群的影像
高压放大器在改良电形成装置参数优化中的应用
威刚发布新款XPGSX8200Pro2TB容量版本 售价约合人民币2050-2460元不等
装什么老司机?这些按钮有一半你都不会用!
企业为什么要在刷脸支付上为难自己
中华人民共和国国家标准蓄电池名词术语
宁德时代有望在下半年重新夺回动力电池出货量冠军位置
回顾AliOS助力重庆实现转型的相关介绍
工业园区智慧住房建设管理软件系统开发