IO口结构详解.docx

上传人:b****1 文档编号:2080183 上传时间:2022-10-26 格式:DOCX 页数:12 大小:170.50KB
下载 相关 举报
IO口结构详解.docx_第1页
第1页 / 共12页
IO口结构详解.docx_第2页
第2页 / 共12页
IO口结构详解.docx_第3页
第3页 / 共12页
IO口结构详解.docx_第4页
第4页 / 共12页
IO口结构详解.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

IO口结构详解.docx

《IO口结构详解.docx》由会员分享,可在线阅读,更多相关《IO口结构详解.docx(12页珍藏版)》请在冰豆网上搜索。

IO口结构详解.docx

IO口结构详解

1.什么就是源型、漏型?

什么就是上拉电阻?

下拉电阻?

什么就是线驱动输出、集电极开路输出、推挽式输出?

我们先来说说集电极开路输出得结构。

集电极开路输出得结构如图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得上拉电阻来增加驱动能力。

但就是,上拉电阻又不能取得太小,因为当开关闭合时,将产生电流,由于开关能流过得电流就是有限得,因此限制了上拉电阻得取值,另外还需要考虑到,当输出低电平时,负载可能还会给提供一部分电流从开关流过,因此要综合这些电流考虑来选择合适得上拉电阻。

如果我们将一个读数据用得输入端接在输出端,这样就就是一个io口了(51得io口就就是这样得结构,其中p0口内部不带上拉,而其它三个口带内部上拉),当我们要使用输入功能时,只要将输出口设置为1即可,这样就相当于那个开关断开,而对于p0口来说,就就是高阻态了。

对于漏极开路(od)输出,跟集电极开路输出就是十分类似得。

将上面得三极管换成场效应管即可。

这样集电极就变成了漏极,oc就变成了od,原理分析就是一样得。

另一种输出结构就是推挽输出。

推挽输出得结构就就是把上面得上拉电阻也换成一个开关,当要输出高电平时,上面得开关通,下面得开关断;而要输出低电平时,则刚好相反。

比起oc或者od来说,这样得推挽结构高、低电平驱动能力都很强。

如果两个输出不同电平得输出口接在一起得话,就会产生很大得电流,有可能将输出口烧坏。

而上面说得oc或od输出则不会有这样得情况,因为上拉电阻提供得电流比较小。

如果就是推挽输出得要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,avr单片机得一些io口就就是这种结构。

2、AVR单片机IO口得结构分析

AVR得IO就是真正双向IO结构,由于大部分网友都就是从标准51转过来得,受标准51得准双向IO与布尔操作概念影响,没能掌握AVR得IO操作,所以有必要撰文说明一下,其实采用真正双向IO结构得新型MCU很多,常用得有增强型51,PIC,AVR等。

先简单得回顾一下标准51得准双向IO结构

这种准双向IO结构得特点就是:

1、输出结构类似OC门,输出低电平时,内部NMOS导通,驱动能力较强(800uA);输出高电平靠内部上拉电阻,驱动能力弱(60uA)。

2、永远有内部电阻上拉(P0口除外),高电平输出电流能力很弱,所以即使IO口长时间短路到地也不会损坏IO口

(同理,IO口低电平输出能力较强,作低电平输出时不能长时间短路到VCC)

3、作输入时,因为OC门有"线与"特性,必须把IO口设为高电平(所以按键多为共地接法)

4、作输出时,输出低电平可以推动LED(也就是很弱得),输出高电平通常需要外接缓冲电路(所以LED多为共阳接法)

5、软件模拟OC结构得总线反而比较方便-----例如IIC总线

*P0口比较特殊,做外部总线时,就是推挽输出,做普通IO时没有内部上拉电阻,所以P0口做按键输入需要外接上拉电阻。

*OC门:

三极管得叫集电极开路,场效应管得叫漏极开路,简称开漏输出。

具备"线与"能力,有0得0。

*为什么设计成输出时高电平弱,低电平强----就是考虑了当年流行得TTL器件输入特性

相信我们大多数人都接触过51单片机,51单片机得I/O口就是准双向I/O口。

其实这种说法就是不严谨得,我们知道,51单片机有4个I/O口,分别就是P0、P1、P2、P3,这4个I/O口得结构并不完全一致,其中P0口就是标准得双向I/O口,而P1、P2、P3则就是准双向I/O口。

关于准双向I/O口与双向I/O口得区别请瞧另一篇文章“准双向I/O口与标准双向I/O口得区别”

AVR单片机得I/O口就是标准得双向I/O口,它得IO结构就就比51得I/O口复杂多了,单就是控制端口得寄存器就有3个 PORTx(数据寄存器)、DDRx(数据方向寄存器)、PINx(端口输入引脚);另外还有一个SFIOR(特殊功能I/O寄存器),这个寄存器中得PUD位控制全部I/O口得上拉电阻就是允许还就是被禁止。

下图就是AVR单片机通用I/O口结构示意图:

从图中可以瞧出,每组I/O口配备三个8位寄存器,它们分别就是数据方向寄存器DDRx,数据寄存器PORTx,与输入引脚寄存器PINx(x表示端口序号)。

I/O口得工作方式与表现特征由这3个I/O口寄存器控制。

数据方向寄存器DDRx用于控制I/O口得输入输出方向,即控制I/O口得工作方式为输出方式还就是输入方式。

当DDRx=1时,I/O口处于输出工作方式。

此时数据寄存器PORTx中得数据通过一个推挽电路输出到外部引脚,如下图。

AVR得输出采用推挽电路提高了I/O口得输出能力,当PORTx=1时,I/O引脚呈现高电平,同时可提供输出20mA得电流;而当PORTx=0时,I/O引脚呈现低电平,同时可吸纳20mA电流。

因此,AVR得I/O在输出方式下提供了比较大得驱动能力,可以直接驱动LED等小功率外围器件。

当DDRx=0时,I/O处于输入工作方式。

此时引脚寄存器PINx中得数据就就是外部引脚得实际电平,通过读I/O指令可将物理引脚得真实数据读入MCU。

此外,当I/O口定义为输入时(DDRx=0),通过PORTx得控制,可使用或不使用内部得上拉电阻,如下图:

AVR单片机通用I/O端口得主要特点为:

双向可独立位控得I/O口

ATmega16得PA、PB、PC、PD四个端口都就是8位双向I/O口,每一位引脚都可以单独得进行定义,相互不受影响。

如用户可以在定义PA口第0、2、3、4、5、6位用于输入得同时定义第1、7位用于输出,互不影响。

Push-Pull大电流驱动(最大40mA)

可控制得引脚内部上拉电阻

每一位引脚内部都有独立得,可通过编程设置得,设定为上拉有效或无效得内部上拉电阻。

当I/O口被用于输入状态,且内部上拉电阻被激活(有效)时,如果外部引脚被拉低,则构成电流源输出电流(uA量级)。

DDRx可控得方向寄存器。

AVR得I/O端口结构同其它类型单片机得明显区别就是,AVR采用3个寄存器来控制I/O端口。

一般单片机得I/O仅有数据寄存器与控制寄存器,而AVR还多了一个方向控制器,用于控制I/O得输入输出方向。

由于输入寄存器PINx实际不就是一个寄存器,而就是一个可选通得三态缓冲器,外部引脚通过该三态缓冲器与MCU得内部总线连接,因此,读PINx时就是读取外部引脚上得真实与实际逻辑值,实现了外部信号得同步输入。

这种结构得I/O端口,具备了真正得读-修改-写(Read-Modify-Write)特性。

AVR单片机通用I/O口设计注意事项:

数据寄存器PORTx与数据方向寄存器DDRx为读/写寄存器,而端口输入引脚PINx为只读寄存器。

但就是需要特别注意得就是,对PINx寄存器某一位写入逻辑"1“将造成数据寄存器相应位得数据发生"0“与“1“得交替变化。

当寄存器MCUCR 得上拉电阻禁止位PUD置位时所有端口引脚得上拉电阻都被禁止。

在高阻态与输出高电平两种状态之间进行切换时,上拉电阻使能或输出低电平这两种模式必然会有一个发生。

编写程序时要注意两者得顺序。

通常,上拉电阻使能就是完全可以接受得,因为高阻状态下强高电平输出还就是上拉输出都就是可以接受得。

如果使用情况不就是这样,可以通过置位SFIOR寄存器得PUD来禁止所有端口得上拉电阻。

在上拉输入与输出低电平之间切换也有同样得问题。

用户必须选择高阻态或输出高电平作为中间步骤。

不论如何配置DDxn,都可以通过读取PINxn寄存器来获得引脚电平

PINxn寄存器得各个位与其前面得锁存器组成了一个同步器。

这样就可以避免在内部时钟状态发生改变得短时间范围内由于引脚电平变化而造成得信号不稳定。

其缺点就是引入了延迟。

AVRIO具备多种IO模式:

1、高阻态,多用于高阻模拟信号输入,例如ADC数模转换器输入,模拟比较器输入

2、弱上拉状态(Rup=20K~50K),输入用。

为低电平信号输入作了优化,省去外部上拉电阻,例如按键输入,低电平中断触发信号输入

3、推挽强输出状态,驱动能力特强(>20mA),可直接推动LED,而且高低驱动能力对称、

使用注意事项:

写用PORTx,读取用PINx

实验时,尽量不要把管脚直接接到GND/VCC,当设定不当,IO口将会输出/灌入80mA(Vcc=5V)得大电流,导致器件损坏。

作输入时:

1、通常要使能内部上拉电阻,悬空(高阻态)将会很容易受干扰。

(表面瞧好像就是51得抗干扰能力强,就是因为51永远有内部电阻上拉,)

2、尽量不要让输入悬空或模拟输入电平接近VCC/2,将会消耗太多得电流,特别就是低功耗应用场合------CMOS电路得特点

3、如果先前I/O口为输出状态,设置为输入状态后,必须等待1个时钟周期后才能正确得读到外部引脚PINx得值。

4、功能模块(中断,定时器)得输入可以就是低电平触发,也可以就是上升沿触发或下降沿触发。

5、用于高阻模拟信号输入,切记不要使能内部上拉电阻,影响精确度。

例如ADC数模转换器输入,模拟比较器输入

作输出时:

采用必要得限流措施,例如驱动LED要串入限流电阻

复位时:

复位时内部上拉电阻将被禁用。

如果应用中(例如电机控制)需要严格得电平控制,请使用外接电阻固定电平

休眠时:

作输出得,依然维持状态不变

作输入得,一般无效,但如果使能了第二功能(中断使能),其输入功能有效。

例如 外部中断得唤醒功能。

AVR得C语言IO操作:

AVR得C语言基于ANSI C,没有像51那样扩展了位操作(布尔操作),虽然汇编指令里面有SBI/CBI/SBIC/SBIS指令,         所以需要采用 位逻辑运算来实现,这就是必须要掌握得。

IO口与功能寄存器得操作方法一样,但对于部分功能寄存器得读写有特殊要求,请参瞧手册。

不必考虑代码效率得问题,如果可能,GCCAVR会自动优化为SBI/CBI/SBIC/SBIS指令,跟汇编得效率就是一样得。

例如iom16、h里面定义了#definePA77

(这标准头文件定义了MCU得所有官方定义(包括寄存器,位,中断入口等),但管脚得第二功能没有定义)

想PA7为1PORTA|=(1<<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1