IO口结构详解文档格式.docx
- 文档编号:3907655
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:14
- 大小:149.62KB
IO口结构详解文档格式.docx
《IO口结构详解文档格式.docx》由会员分享,可在线阅读,更多相关《IO口结构详解文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
对于漏极开路(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<
<
PA7);
想PA7为0PORTA&
=~(1<
想PA7取反PORTA^=(1<
想检测PA7是否为1if(PINA&
(1<
PA7)){};
想检测PA7是否为0if!
(PINA&
为左移运算符,不懂的就要好好复习C语言基础了。
注意IO操作的顺序:
//上电默认DDRx=0x00,PORTx=0x00
输入,无上拉电阻
假设PA口驱动LED的负极,低电平灯亮
初始化方法1:
PORTA=0xFF;
//内部上拉,高电平
DDRA=0xFF;
//输出高电平---------灯一直是灭的
初始化方法2:
//输出低电平--------灯被错误点亮了
//输出高电平--------马上被熄灭了,时间很短(1个指令不到uS时间),灯闪了一下,眼睛无法察觉
但要是这个IO口是控制炸药包的点火信号呢?
工控场合要考虑可靠性的问题
模拟OC结构的IIC总线的技巧:
虽然AVR大多带有硬件IIC接口,但也有需要使用软件模拟IIC的情况
可以通过使用外部上拉电阻+控制DDRx的方法来实现OC结构的IIC总线。
IIC的速度跟上拉电阻有关,内部的上拉电阻阻值较大(Rup=20K~50K),只能用于低速的场合
#defineSDA0//PC0
#defineSCL1//PC1
(程序初始化设定SDA和SCL都是PORT=0,DDR=0)
#defineSDA_0()DDRA|=(1<
SDA)//输出低电平
#defineSDA_1()DDRA&
SDA)//输入,外部电阻上拉为高电平
#defineSCL_0()DDRA|=(1<
SCL)//输出低电平
#defineSCL_1()DDRA&
SCL)//输入,外部电阻上拉为高电平
使用上面的SDA_0()/SDA_1()/SCL_0()/SCL_1()宏即可,直观,而且效率跟汇编是一样的
3.PIC单片机端口的概述
PIC单片机的IO口,特别是第二功能的AD口,当端口被配置为AD模拟输入时,误以为端口用作普通的IO口时,去读取相应的端口,然而读进来的数据不确定。
(例如:
用万用表测量该管脚的电压为4.0V,但是读进来的数据始终为低电平),这是由于PIC单片机的IO口有一个弱上拉(用MOS
管的开关代替),当端口被配置为AD模拟输入时,弱上拉disable,则单片机的IO口呈现为高阻状态。
(可参照PIC单片机DATASHEET)
在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。
1、电阻作用:
l接电组就是为了防止输入端悬空
l减弱外部电流对芯片产生的干扰
l保护cmos内的保护二极管,一般电流不大于10ma
l上拉和下拉、限流
l1.改变电平的电位,常用在ttl-cmos匹配
2.在引脚悬空时有确定的状态
3.增加高电平输出时的驱动能力。
4.为oc门提供电流
l那要看输出口驱动的是什么器件,如果该器件需要高电压的话,而输出口的输出电压又不够,就需要加上拉电阻。
l如果有上拉电阻那它的端口在默认值为高电平你要控制它必须用低电平才能控制如三态门电路三极管的集电极,或二极管正极去控制把上拉电阻的电流拉下来成为低电平。
反之,
l尤其用在接口电路中,为了得到确定的电平,一般采用这种方法,以保证正确的电路状态,以免发生意外,比如,在电机控制中,逆变桥上下桥臂不能直通,如果它们都用同一个单片机来驱动,必须设置初始状态.防止直通!
2、定义:
l上拉就是将不确定的信号通过一个电阻嵌位在高电平!
电阻同时起限流作用!
下拉同理!
l上拉是对器件注入电流,下拉是输出电流
l弱强只是上拉电阻的阻值不同,没有什么严格区分
l对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。
3、为什么要使用拉电阻:
l一般作单键触发使用时,如果ic本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在ic外部另接一电阻。
l数字电路有三种状态:
高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定!
l一般说的是i/o端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,i/o端口的输出类似与一个三极管的c,当c接通过一个电阻和电源连接在一起的时候,该电阻成为上c拉电阻,也就是说,如果该端口正常时为高电平,c通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该端口平时为低电平,作用吗:
比如:
当一个接有上拉电阻的端口设为输如状态时,他的常态就为高电平,用于检测低电平的输入。
l上拉电阻是用来解决总线驱动能力不足时提供电流的。
一般说法是拉电流,下拉电阻是用来吸收电流的,也就是你同学说的灌电流
线驱动(差动输出):
线驱动器是一个源电流输出器件。
在导通状态时,线驱动器输出为电源(vcc);
在关断状态时,输出悬空。
因此,线驱动器需要一个灌电流输入接口。
下面表格中给出了一个简单的线驱动器的原理图。
差动输出(欧姆龙称为线性驱动输出)线性驱动输出就是根据rs-422a的数据输送回路。
可通过双股搅合线电缆进行长距离输送
集电极开路:
集电极开路电路是灌电流输出器件。
在关断状态时,集电极开路输出连到地;
在导通状态时,集电极开路输出悬空。
因此,集电极开路输出需要一个源电流输入接口。
下面表格中给出了一个简单的集电极开路输出电路的原理图。
推挽式:
推挽式输出结合了线驱动与集电极开路输出,在关断状态时,推挽式输出接地;
在导通状态时,推挽式输出连到电源(vcc)。
推挽输出(欧姆龙称为互补输出)输出回路有2种,即npn与pnp2种晶体管输出。
根据输出信号h或l,2种晶体管输出互相交叉进行on或off动作,使用时,正电源,0v分别为吸合,拉下互补输出是输出电流流出或流入2种动作,特征是信号的上升、下降速度快,可进行导线的长距离延长。
可与开路集电极输入机器(npn/pnp)连接,另外还可以连接到电压输入机器上。
但是为了能更好的发挥未来的性能,一般推荐在电压输入机器上使用电压输入的编码器。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IO 结构 详解