历史上的今天
返回首页

历史上的今天

今天是:2025年01月11日(星期六)

2020年01月11日 | 详解avr单片机的io原理及作用

2020-01-11 来源:elecfans

为搞清IO结构,首先看看上拉和下拉电阻的作用。


一、上拉电阻

20171124091453607.jpg?imageView2/2/w/550

 

上拉就是将不确定的信号通过一个电阻钳位在高电平!电阻同时起限流作用!下拉同理!

上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流。


1、在用TTL电路驱动CMOS电路时,若TTL的高电平低于CMOS要求的高电平的门限值(1,TTL电平: 输出高电平>2.4V,输出低电平<0.4V。在室温下,一般输出高电平是3.5V,输出低电平 是0.2V。最小输入高电平和低电平:输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是 0.4V。 2,CMOS电平: 1逻辑电平电压接近于电源电压,0逻辑电平接近于0V。而且具有很宽的噪声容限。),此时需用上拉电阻来提升输出高电平的电压值 。

2、OC门必须外加上拉电阻,才能使用。(OC门:三极管的叫集电极开路,场效应管的叫漏极开路,简称开漏输出。具备"线与"能力,有0得0。 )

3、为加大输出管脚的驱动能力,单片机的引脚常接入上拉电阻,(AVR单片机可配置是否接上拉,51单片机P1 P2 P3均带上拉,P0口不带,所以用P0口做按键,液晶等应用时要自己加上上拉电阻,否则无法使用切记)

4、CMOS芯片上为防止静电破坏,不用的管脚不能悬空,需要接上拉电阻降低输入阻抗,提供泄荷通路。

5、提高总线的搞电磁干扰能力,悬空就容易就电磁干扰。


二、上拉电阻阻值的选择

1、为节约功耗或使灌电流足够大,阻值要大,电流小。

2、为确保足够的驱动电流,阻值要小,电流大。

3、对于高速电路,过大的上拉电阻可能导致边沿变得平缓。

基于以上三点,一般选取上拉阻值为1K-10K。


三、上拉阻值的计算

OC门输出高电平时是一个高阻态,其上拉电流要由上拉电阻来提供,设输入端每端口不大于100uA,设输出口驱动电流约500uA,标准工作电压是5V,输入口的高低电平门限为0.8V(低于此值为低电平);2V(高电平门限值)。


选上拉电阻时:
500uA x 8.4K= 4.2即选大于8.4K时输出端能下拉至0.8V以下,此为最小阻值,再小就拉不下来了。如果输出口驱动电流较大,则阻值可减小,保证下拉时能低于0.8V即可。
当输出高电平时,忽略管子的漏电流,两输入口需200uA
200uA x15K=3V即上拉电阻压降为3V,输出口可达到2V,此阻值为最大阻值,再大就拉不到2V了。选10K可用。COMS门的可参考74HC系列
设计时管子的漏电流不可忽略,IO口实际电流在不同电平下也是不同的,上述仅仅是原理,一句话概括为:输出高电平时要喂饱后面的输入口,输出低电平不要把输出口喂撑了(否则多余的电流喂给了级联的输入口,高于低电平门限值就不可靠了)
在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。 


四、51型单片机IO口

AVR的IO是真正双向IO结构,由于大部分网友都是从标准51转过来的,受标准51的准双向IO和布尔操作概念影响,没能掌握AVR的IO操作,所以有必要撰文说明一下

其实采用真正双向IO结构的新型MCU很多,常用的有 增强型51,PIC,AVR等,

 

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

 

20171124091453271.gif?imageView2/2/w/550

 

20171124091456541.gif?imageView2/2/w/550

 

 

这种准双向IO结构的特点是

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

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

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


五、AVR单片机IO口(千呼万唤始出来)

端口引脚配置

0              0                        X                输入       No          高阻态 (Hi-Z)
0              1                        0                输入      Yes         被外部电路拉低时将输出电流
0              1                        1                输入       No          高阻态(Hi-Z)
1              0                        X                输出       No          输出低电平 ( 漏电流)
1              1                        X                输出       No          输出高电平 ( 源电流)

//////////////////////////////////////////

 

20171124091456742.gif?imageView2/2/w/550

 

输入状态:
一、上拉输入状态:
1、在IO口线悬空时读入PINxn的值为1,状态稳定
2、在IO口线外接输入信号时读入PINxn的值随外部信号高低电平变化而变化


二、高阻输入状态:
1、在IO口线悬空时读入PINxn的值为0,且极易受到干挠,状态很不稳定
2、外接上拉电阻,在IO口线外接输入信号时读入PINxn的值随外部信号高低电平变化而变化(等同于内接上拉电阻)
输出状态:
在输出状态下,PORTxn=0则输出为低电平,PORTxn=1则输出为高电平
1、输出低电平,IO口线悬空时读入PINxn的值为0
2、输出低电平,IO口线连接VCC或强上拉(指上拉阻值很小,相当于直接连接VCC,能提供足够的上拉电流)时读入PINxn的值为1
3、输出高电平,IO口线悬空时读入PINxn的值为1
4、输出高电平,IO口线连接GND或强下拉(指下拉阻值很小,相当于直接连接GND,能吸收足够的下拉电流)时读入PINxn的值为0由于无论如何配置DDRxn,我们都可以读取PINxn值,综上所述,我们在读取PINxn的值时,要想获得正确且稳定的值,应该选择在内部上拉输入或高阻输入且外部上拉这两种方式中进行。当然在选择内部上拉输入且外部也上拉的方式也是可以的,只是内部和外部都加上拉(重复上拉)没有什么意义。
还有一点就是我们在读取软件赋予的电平时,读PINxn值之前,要插入一个NOP。
也就是说在IO口输出逻辑电平之后再读入这个输出的值中间应插入一个NOP。
//////////////////////////////////////////////

AVR的真正双向IO结构就复杂多了,单是控制端口的寄存器也有4个 PORTx.DDRx,PINx,SFIOR(PUD位),不过功能也强劲多了

作为通用数字I/O 使用时,所有AVR I/O 端口都具有真正的读- 修改- 写功能。
这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会无意地改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
并有保护二极管与VCC 和地相连。
*   (很多数字器件都有保护二极管,在低功耗应用时要考虑保护二极管的电流倒灌的影响)

每个端口都有三个I/O 存储器地址:
     数据寄存器     – PORTx
     数据方向寄存器 – DDRx
     端口输入引脚   – PINx。
数据寄存器PORTx和数据方向寄存器DDRx为读/ 写寄存器,而端口输入引脚PINx为只读寄存器。


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


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


在( 高阻态) 三态({DDxn, PORTxn} = 0b00) 输出高电平({DDxn, PORTxn} = 0b11) 两种状态之间进行切换时,上拉电阻使能({DDxn, PORTxn} = 0b01) 或输出低电平({DDxn,PORTxn} = 0b10) 这两种模式必然会有一个发生。


通常,上拉电阻使能是完全可以接受的,因为高阻环境不在意是强高电平输出还是上拉输出。


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


在上拉输入和输出低电平之间切换也有同样的问题。
用户必须选择高阻态({DDxn,PORTxn} = 0b00) 或输出高电平({DDxn, PORTxn} = 0b10) 作为中间步骤。


在从高阻态切换到输出高电平转换时,应先将PUD置1,然后再将PORTxn置1,最后再将DDRxn置1,也就是在转换的过程中先进入高阻态(这样才可避免上拉电阻使能和输出低电平两种模式的发生)
在从输出高电平切换到高阻态转换时,应先将PUD置1,然后再将DDRxn置0,最后再将PORTxn置0,也就是在转换的过程中先进入高阻态(这样才可避免上拉电阻使能和输出低电平两种模式的发生)
在上拉输入切换到输出低电平转换时,应先将PORTxn置0,然后再将DDRxn置1,也就是在转换的过程中先进入高阻态(这样才可避免输出高电平模式发生)
在输出低电平切换到上拉输入转换时,应先将DDRxn置0,然后再将PORTxn置1,也就是在转换的过程中先进入高阻态(这样才可避免输出高电平模式发生)
综上所述,如果我们在转换的过程中有严格的电平状态要求的话,为了避免其它短暂的状态发生,一定要在转换过程中先进入高阻态

///////////////////////////////

不论如何配置DDxn,都可以通过读取PINxn 寄存器来获得引脚电平
PINxn寄存器的各个位与其前面的锁存器组成了一个同步器。
这样就可以避免在内部时钟状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。


其缺点是引入了延迟。

AVR IO具备多种IO模式:

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

   2 弱上拉状态(Rup=20K~50K),输入用。为低电平信号输入作了优化,省去外部上拉电阻,例如按键输入,低电平中断触发信号输入

   3 推挽强输出状态,驱动能力特强(>20mA),可直接推动LED,而且高低驱动能力对称.最大灌电流可达40mA.但最好选取电阻值时按20mA计算。

使用注意事项:

写用PORTx,读取用PINx

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

作输入时:

1通常要使能内部上拉电阻,悬空(高阻态)将会很容易受干扰。(表面看好像是51的抗干扰能力强,是因为51永远有内部电阻上拉,)

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

3读取软件赋予的引脚电平时需要在赋值指令out 和读取指令in 之间有一个时钟周期的间隔,如nop 指令。(这点要切记否则程序会出问题的)

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

5用于高阻模拟信号输入,切记不要使能内部上拉电阻,影响精确度。例如ADC数模转换器输入,模拟比较器输入    ,

复位时:

复位时内部上拉电阻将被禁用。如果应用中(例如电机控制)需要严格的电平控制,请使用外接电阻固定电平

休眠时:

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

作输入的,一般无效,但如果使能了第二功能(中断使能),其输入功能有效。例如 外部中断的唤醒功能。

 

AVR的C语言IO操作:
AVR的C语言基于ANSI C,没有像51那样扩展了位操作(布尔操作),虽然汇编指令里面有SBI/CBI/SBIC/SBIS指令
所以需要采用 位逻辑运算 来实现,这是必须要掌握的。
IO口和功能寄存器的操作方法一样,但对于部分功能寄存器的读写有特殊要求,请参看手册。


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


例如 iom16.h 里面定义了 #define PA7 7 
(这标准头文件定义了MCU的所有官方定义(包括寄存器,位,中断入口等),但管脚的第二功能没有定义)
想PA7为1 PORTA"=(1<想PA7为0 PORTA&=~(1<想PA7取反 PORTA^=(1<想检测PA7是否为1 if (PINA&(1<想检测PA7是否为0 if !(PINA&(1<* << 为左移运算符,不懂的就要好好复习C语言基础了。


注意IO操作的顺序:
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
假设PA口驱动LED的负极,低电平灯亮
初始化方法1:
PORTA=0xFF; //内部上拉,高电平
DDRA=0xFF; //输出高电平---------灯一直是灭的
初始化方法2:
DDRA=0xFF; //输出低电平--------灯被错误点亮了
PORTA=0xFF; //输出高电平--------马上被熄灭了,时间很短(1个指令不到uS时间),灯闪了一下,眼睛无法察觉

但要是这个IO口是控制炸药包的点火信号呢?工控场合要考虑可靠性的问题 
  
模拟OC结构的IIC总线的技巧:
虽然AVR大多带有硬件IIC接口,但也有需要使用软件模拟IIC的情况
可以通过使用外部上拉电阻+控制DDRx的方法来实现OC结构的IIC总线。
IIC的速度跟上拉电阻有关,内部的上拉电阻阻值较大(Rup=20K~50K),只能用于低速的场合
#define SDA 0 //PC0
#define SCL 1 //PC1
(程序初始化设定 SDA和SCL都是 PORT=0,DDR=0)
#define SDA_0() DDRA|=(1<#define SDA_1() DDRA&=~(1<#define SCL_0() DDRA|=(1<#define SCL_1() DDRA&=~(1<
使用上面的SDA_0()/SDA_1()/SCL_0()/SCL_1()宏即可,直观,而且效率跟汇编是一样的

推荐阅读

史海拾趣

登丰微(GSTEK)公司的发展小趣事

歌普电子科技有限公司以自有品牌(GEPU歌普)创立于2006年,公司最初在台湾设立,随后逐步扩展至江苏和东莞,形成了跨区域的研发、生产和销售网络。公司自创立之初便专注于各式线对板连接器、板对板连接器、网络连接器等产品的研发与设计。通过不断的技术积累和市场需求洞察,歌普逐渐在连接器领域建立了自己的市场地位。

Aplus Integrated Circuits公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些挑战,Aplus Integrated Circuits公司积极调整战略,加大研发投入,推动产品创新。公司成功开发出多款适应市场需求的新型集成电路产品,不仅满足了客户的多样化需求,还为公司带来了可观的收益。

Hamlin ( Littelfuse )公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些挑战,Aplus Integrated Circuits公司积极调整战略,加大研发投入,推动产品创新。公司成功开发出多款适应市场需求的新型集成电路产品,不仅满足了客户的多样化需求,还为公司带来了可观的收益。

Apacer公司的发展小趣事

随着业务的不断发展,Apacer宇瞻科技开始在全球范围内布局。除了在台湾设立总部外,公司还在上海设立了宇瞻电子(上海)有限公司,并在美国、欧洲、日本、印度等地设立了分公司。这一全球布局使得宇瞻科技能够更好地服务全球客户,拓展市场份额。

Fujitsu America公司的发展小趣事

为了更好地服务北美市场的客户,Fujitsu America实施了一系列本地化服务策略。公司不仅在当地建立了完善的销售和服务网络,还积极培养本地化的技术和服务团队,以更好地满足客户的实际需求。同时,Fujitsu America还注重与当地政府和行业协会的沟通与合作,积极参与行业标准的制定和推广工作,为公司在北美市场的长期发展奠定了坚实的基础。通过这些本地化服务策略的实施,Fujitsu America在北美市场树立了良好的品牌形象和市场地位。

Gemmy Electronics Co Ltd公司的发展小趣事
电子捕鼠器首先通过电源电路将家用交流电(如220V)转换为适合捕鼠器工作的低压直流电(如6V)。

问答坊 | AI 解惑

使DC/DC变换器限流特性线性化的热敏电阻器网络

核心器件: MAX1714 最近推出的各种集成式降压   DC/DC变换器均已采取对外接低侧MOSFET同步整流器的电压降采样的方法,无需高侧电流检测电阻器。这种拓扑节省了检测电阻器的成本和印制电路板的空间,也适当提高了电路效率。但是,MOS ...…

查看全部问答>

电子系统设计基本知识

本文有模拟电路、数字电路、单片机电路、ARM硬件、ARM编程等基础知识,里面还有电阻、电容、半导体二级管三极管等元器件的介绍,还有电源电路、电路设计、通信系统等。欢迎想学电子基础知识的人下载。…

查看全部问答>

我的超声波带原理图与PCB

本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 我的超声波带原理图与PCB  …

查看全部问答>

大家A有整体方案了没有

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 大家A有整体方案了没有  …

查看全部问答>

单片机实现液晶显示的开发方案

我们的产品希望用液晶屏显示,不知各位高人有什么比较好的实现方法吗?(接口可以是232或者485)…

查看全部问答>

三星S3C241O的中断问题

我最近在学华恒ARM9,用的是三星S3C2410当做到中断这个问题的时候,遇到了问题,还请各位大虾帮忙 问题如下: 1、不管我把中断置一还是置零都没看到区别,和芯片资料有出入,为什么会这样 2、我把中断待决寄存器和源待决寄存器的值读出来,发现 ...…

查看全部问答>

请问哪里有无线协议的详细文档下载?

刚学GPRS开发,想找些无线通讯协议看看,google了一下,没找到,所以想请教一下,哪里有这一类的完整文档下载,谢谢!…

查看全部问答>

超新手弱弱问题----关于定时器的问题

这几天在看书,发现里面说到定时器a和定时器b,我想问一下,定时器是不是属于单片机里面一个硬件呢?应该不是在msp430芯片里面的吧???…

查看全部问答>

求助。。。。

用iar for msp430怎么下载程序到430里? 求具体过程,最好能有×××××× 还有就是怎么看程序是否在下载?单片机是否在运行? 本人初学,只有一点51的基础,还请各位多多指教…

查看全部问答>

液晶屏初始化时花屏了,求助!

液晶屏初始化时花屏了!(LCD12864带字库的)LCD12864 带字库的。在我对液晶屏初始化时,设置到“进入设定点”这一步,用api函数SSIDataPut(SSI_BASE, data) 发送命令字0x06,就花屏了!这是为什么? …

查看全部问答>