基于单片机I/O口实现A/D转换方法

2010-06-22 08:18周渡海何此昂
单片机与嵌入式系统应用 2010年9期
关键词:发射极三极管门限

周渡海,何此昂

(1.北京建筑工程学院 电信学院,北京100044;2.华中科技大学 电气学院)

引 言

在某些特定的场合(主要是在数字电子应用方面),需要一个模拟信号输入来进行一些基本模拟量的测量,或者是提供可控的方式使用外部电位器。像这样的需求,由一个内置A/D(模/数)转换器的单片机就能很好地实现;当然,也可以使用一些经济的外部器件,由一个标准的数字Ⅰ/O口来实现简单的A/D转换功能。本文以Holtek系列单片机为对象,介绍使用标准的施密特输入口或CMOSⅠ/O作为基本A/D转换口的使用方法,为对A/D转换精度要求不高的应用提供了一种低成本的A/D转换实用方案。

1 I/O口A/D转换原理

Ⅰ/O口A/D转换的原理是:对某一电容充电达到某个固定的电压值,然后以恒定电流进行放电,通过测量放电时间来获得当前输入信号的强弱。通过设置Ⅰ/O口为输出高电平可以迅速地对电容进行充电,在输出口与电容之间建议串接一个100Ω的小电阻来限流,防止大电流损坏。电容充电的表达公式如下:

式中:VC是电容电压,VO是Ⅰ/O口输出电压(与单片机实际工作电压有关)。将输出口置高开始对电容充电后仅需短时间的延时,充电电压即可达到VO的98%(这里需要的时间大约为39μs)。充电过程完成后,即可将控制口设置为输入状态。这是因为其输入状态为高阻态,此时电容就只能通过三极管的发射极对地以恒定的电流放电。电流大小与发射极上串联的电阻有关,改变放电电流的大小即可改变放电斜率。

电流大小与电容电量之间的关系式如下:

式中:C是元件的电容,单位是F;dV/dt是电容上的电压变化率,单位是V/s;I是流过电容的电流,单位为A。如图1所示,如果流经电容的电流是恒定的,那么充电时电容电压上升的速率也是恒定的。也就是说,对电容的充放电曲线的斜率是由电容参数值和充放电电流值决定的,电压的变化率dV/dt等于1/C。

图1 电量与充放电时间关系图

在放电时,如果电容与一个CMOS输入端相连接,那么随着电容电压幅度的减小,当其幅度降低到CMOS输入的开关极限值时,CMOS输入端将从高电平变为低电平。使用内部定时器/计数器从放电周期开始对输入端进行监测。当输入端出现下降沿时,如果定时器/计数器停止计数,则定时器寄存器的剩余值是与放电电流成比例的。放电电流大小是由发射极的两个电阻决定的,其中一个电阻是电位器。

2 硬件设计

图2 硬件设计图

硬件电路由极少的标准元器件组成,如图2所示。用一个红色的LED(D1)提供一个大约1.8V的参考电压,同时具有上电指示的功能(也可使用不同颜色的LED或串联几个低功耗的二极管,如1N4148)。LED的正向电压与Q1(2N2222)基极到射极之间的电压相减,便得出串联电阻R1和R2上的电压,从而在Q1的发射极产生一个恒流源。这将在Q1的集电极产生一个恒定的电流,该电流即为放电电流。三极管的集电极电流同基极电流的关系,是由三极管的放大倍数值决定的,与外部电路的精确度无关。几乎所有的NPN型三极管都可以应用到该电路中。单片机的Ⅰ/O引脚经一个100Ω的电阻与电容C1连接,当充电时,这个电阻对电容具有限流保护作用。在放电期间,Ⅰ/O口具有高输入阻抗,所以不会影响A/D转换的精确度。R1的作用是当R2电位计在最小值时,确保三极管Q1工作在非饱和区,并维持电流源工作。如果R1为1.2kΩ,那么提供的电流源的值大约为1mA,选取较小的电阻值以便于计算。选取R2为10kΩ的目的是,当其在较大值时可降低功耗,并且可以防止外界干扰。

使用Holtek公司的HT48F06E的Flash Ⅰ/O型单片机来设计Ⅰ/O口A/D输入方式。事实上任何一款带有施密特触发、CMOS Ⅰ/O结构的Holtek单片机都可以使用。注意,NMOS型Ⅰ/O引脚不适合于该应用。如果电容放电电压的下降沿下降得相对比较缓慢,非施密特型的CMOS输入也不适用于该应用,因为缓慢的下降沿输入在电压降到门限电压时不能产生一个明确的逻辑转换。检查电路将会发现,电容电压从Vdd开始放电到输入引脚的门限电压Vth之间的时间,可由电压的变化量除以电压的变化率求得。方程式如下:

式中:Vth是输入引脚的门限电压值,C是电容值,I是恒定的放电电流值。I可由三极管Q1发射极的电压Ve除以R2与R3之和得出,代入方程式可得出:

式中:Ve是发射极电压值,它可由LED的正向电压减去三极管的Vbe得出。

3 软件设计

A/D转换编码很简单,它是由连续地对电容充放电来实现的。对电容充电,通过设置Ⅰ/O为输出,并设置一个较长的固定时间周期以确保电容满充。一个100nF的电容和一个100Ω的电阻可以达到10μs的固定时间周期,它可以作为一个计算合适充电时间的标准。对电容充电的合适时间应不小于10倍的RC充电时间常数。当Ⅰ/O口由低输出变为高输入状态,放电过程即可开始,同时定时计数器也开始计时。该系统使用3.58MHz的晶振,如果设置定时器预分频器的值为16,将得到一个约4.47 μs的时钟周期。此时,TMR寄存器的溢出周期为(255×4.47μs)=1.14ms。若该溢出周期远小于电容由满充到输入门限电压值的放电时间,A/D转换值将会是大于8位二进制的数据。如果增加预分频器值到64,将会得到一个足够长的时钟周期,允许A/D转换值在8位(即255)以内。软件设计流程如图3所示。

图3 软件设计流程

由于Holtek单片机的指令和处理方式与很多公司(如Atmel、TⅠ、NXP等)的微处理器类似,所以 Holtek单片机程序可以很方便移植到各类单片机中。

编者注:源代码见本刊网站 www.mesnet.com.cn。

4 实验验证

图4为使用泰克公司示波器测试的电容两端的电压波形。可以清楚地看到电容充电整个过程的指数上升曲线。上升时间比预计值长,这可能是由于单片机CMOS输出口的电压驱动能力没有理想中的好。这一点在充电周期起始阶段、充电电流值比较大时,表现得尤为明显。注意,电流源将不断地从CMOS输出口吸收电流,这对上升时间产生一些影响,可通过在电容充电时加一个较长延时来解决。这条曲线表明,在这个范例中,允许电容充电时间的编程值明显长于所必需的时间,并且可以缩短整个A/D转换的时间。至于比较重要的放电斜率,尽管没有测量,但看起来线性度非常好。施密特触发Ⅰ/O输入口的转换也很明显,而且没有检测到干扰信号。另外,由高到低变化的门限电压值为1.62V,这个值依赖于处理过程,而且随着选择的芯片不同而有所变化,它对A/D转换值有着重要的影响。

图4 实际测试波形

由于该应用范例只是提供一个A/D转换的基本形式,因此不适用于精确的测量,只适用于转换精度有限的领域。绝对误差的主要来源在于所使用电容的实际值和输入电压的门限值。尽管使用的电容为0.1μF,但它的容限可能会大。如果采用软件校准对绝对误差进行补偿,那么将获得一个合理的精确度。另外,还存在一些小误差,其中一个就是电容放电时,由于三极管Vce电压值不断变化引起的放电电流的微弱变化。其他误差可能是由不很理想的电源电压引入的。注意:要确保没有上拉电阻与Ⅰ/O引脚相连,否则将会产生误差,影响到放电斜率的线性度,尤其在放电电流较小的情况下。

结 语

本文介绍如何用一个标准逻辑Ⅰ/O引脚与内部定时器/计数器,以及一些低成本的器件来实现A/D转换功能。虽然不是针对高精度的A/D转换应用,但这个构思实际上可以实施于低分辨率、低成本的A/D转换功能。在示波器曲线上随意测量放电斜率,虽然测量方式比较简单,但可以看到很好的线性度。目前,只使用了一个Ⅰ/O引脚,但很容易应用于多通道模拟输入。本文使用一个电位计提供模拟信号输入,也可以用一个固定电阻来代替,并使用一个缓冲电压源与三极管的基极连接,从而来提供模拟信号的输入。虽然这个电压源可以用来控制放电电流,但是对三极管保持导通并工作在线性区域的输入电压范围加大了限制。使用外部中断作为模拟测量输入脚,可以实现更高效率的程序代码,在A/D转换过程中程序可以继续执行其他的任务。

本文介绍的方法可以广泛地应用于低成本的温度检测场合,诸如室外温度计、电热水器温度检测、空调温度监测等场合,具有一定的实用价值。

[1]何此昂,等.Freescale 08系列单片机开发与应用实例[M].北京:北京航空航天大学出版社,2009.

猜你喜欢
发射极三极管门限
基于发射极耦合逻辑结构的低相噪鉴频鉴相器设计
基于规则的HEV逻辑门限控制策略
激光推进纳米硼浆在N型高效晶硅电池制作选择性发射极中的应用研究
随机失效门限下指数退化轨道模型的分析与应用
基于Neyman-Pearson准则的自适应门限干扰抑制算法*
基于晶体三极管的放大电路分析
UPS的使用安装维护和运行
三极管引脚折弯机双凸轮机构的分析与仿真
三极管放大电路的研究
三极管单管放大电路的失真分析