使用一个使用一个I/O口实现A/D转换输入文件编码:文件编码:HA0128S
简介
功能说明在某些特定的场合,主要是在数字电子应用方面,需要一个模拟信号
输入来做一些基本的模拟量的测量或者是提供可控的方式使用外部电位器。当然,
像这样的需求,由一个内置A/D转换的MCU就能极好地实现,但是也可以使用一
些经济的外部器件,由一个标准的数字I/O口来实现一个简单的模数转换功能。此
篇应用将以HOLTEK系列MCU为对象,介绍如何使用标准的施密特输入口或
CMOSIO口做为基本的A/D转换口使用,为对A/D转换精度要求不高的应用提供
一种超低成本的A/D转换实用方案。
这种模数转换的原理就是通过对某一电容充电达到某个固定的电压值,然后以
恒定电流进行放电,我们可以通过测量放电时间来获得当前输入信号的强弱。通过
设置I/O口为输出高电平可以迅速对电容进行充电,在输出口与电容之间建议串接
一个100欧姆的小电阻来限流,防止大电流损坏。电容充电的表达公式如下:
Vc=Vo(1-e-t/RC
此处Vc是电容电压,Vo是IO口输出电压(与MCU实际工作电压有关),
将输出口置高开始对电容充电后仅需仅短时间的延时,充电电压即可达到Vo的
98%,此案中需要的时间大约为39μs。完成充电过程后即可将控制口设置为输入
状态,因为其输入状态为高阻态,此时电容就只能通过三极管的发射极对地以恒定
的电流放电,电流大小与发射极上串拉的电阻有关。改变放电电流的大小即会改变
放电斜率。
1
电流大小与电容电量之间的关系式如下:
I=CdV
dt
此处C是元件的电容,单位是法拉。dV/dt是电容上电压变化率,单位是伏特/
每秒。I是流过电容的电流,单位为安培。如下图所示,如果流经电容的电流是恒
定的,那么充电时电容电压上升的速率也是恒定的,实际上也就是说对电容的充放
电斜坡的斜率是由电容参数值和充放电电流值决定的,电压的变化率dV
dt等于I
C。
CapacitorCharged
Time
PA.0
ModeTime
在放电时,如果电容与与一个CMOS输入端相连接,随着电容电压幅度的减
小,当其幅度降低到CMOS输入的开关极限值,CMOS输入端将从高电平变为低
电平。使用内部定时/计数器从放电周期开始对输入端进行监测。当输入端出现下
降沿时,如果定时计数器停止计数,定时器寄存器的剩余值是与放电电流成比例
的,放电电流大小是由发射极的两个电阻决定的,其中一个电阻是电位器。
2
硬件部分
硬件电路很简单,由极少的标准元器件组成。用一个红色的LED提供一个大
约1.8V的参考电压,它还具有上电指示的功能。当然,不同颜色的LED或串联几
个低功耗的二极管,如IN4148,也可以作为选择。这个LED的正向电压,与Q1
基极到射极之间的电压相减,便得出串联电阻R2和R3上的电压,从而在Q1的发
射极产生一个恒流源。这将在三极管的集电极产生一个恒定的电流,该电流即为放
电电流。三极管的集电极电流同基极电流的关系,是由三极管的hfe值决定的,
与外部电路的精确度无关。几乎所有的NPN型三极管都可以应用到该电路中。一
个I/O引脚经一个100欧姆的电阻与电容连接,当充电时,这个电阻对电容具有限
流保护作用。在放电期间,I/O口具有高输入阻抗,所以不会影响A/D转换的精确
度。R2的作用是当R3电位计在最小值时,确保三极管工作在非饱和区,并维持电
流源工作。如果选择R2为1.2K,提供的电流源的值大约为1mA,选取较小的电
阻值以便于计算。选取R3为10K是有作用的,当其在较大值时可减少功耗,并且
可以防止外界干扰。
该例使用HT48F06EFlashI/O型单片机,事实上任何一款带有施密特触发,
CMOSI/O结构的Holtek单片机都可以使用。注意,NMOS型I/O引脚不适合于该
应用。如果电容放电电压的下降沿下降相对比较缓慢,非施密特型的CMOS输入
也不适用于该应用,因为缓慢的下降沿输入在电压降到门限电压时不能产生一个明
确的逻辑转换。
3
检查电路将会发现,电容电压从Vdd开始放电到输入引脚的门限电压之间的
时间可由电压的变化量/电压的变化率求得,方程式如下:
Time=(Vdd−VthC
I
Vth是输入引脚的门限电压值,C是电容值,I是恒定的放电电流值。但I可
由发射极的电压/(R2+R3)得出,代入上面方程式,可得出:
(Vdd−Vth(R2+R3C
VeTime=
Ve是发射极电压值,它可由LED的正向电压减去三极管的Vbe得出。
4
软件部分
模数转化编码很简单,它是由连续地对电容充放电来实现的。对电容充电是通
过设置I/O为输出,并设置一个较长的固定时间周期以确保对电容满充。一个100
nF的电容和一个100欧姆的电阻可以达到10us的固定时间周期,它可以作为一个
计算合适充电时间的标准。推荐对电容充电的合适时间应不小于10倍的RC充电
时间常数。当I/O口由低输出变为高输入状态,放电过程即可开始,同时定时计数
器也开始计时。该系统使用3.58MHz的晶体振荡,如果设置定时器预分频器的值
为16,将得到一个约4.47us的时钟周期。此时TMR寄存器的溢出周期为
(255×4.47us)1.14ms。当该溢出周期远小于电容由满充到输入门限电压值的放电
时间,模数转换值将会是大于8位二进制的数据。如果增加预分频器值到64,将
会得到一个足够长的时钟周期,允许模数转换值在8位以内即255以内。
5
使用一个I/0口实现A/D转换输入结果如下示波器图形为电容电压,可以清
楚地看到电容充电整个过程的指数上升曲线。可见上升时间比预计值长,这可能
是由于单片机CMOS输出口的电压驱动能力没有理想中的好。这一点在充电周期
起始阶段,当充电电流值比较大时,表现得尤为明显。注意,电流源将不断地从
CMOS输出口吸收电流,这对上升时间产生一些影响。这些问题通过在电容充电
时加一个较长延时便可解决。这条曲线表明,在这个范例中,允许电容充电时间的
编程值明显长于所必需的时间,并且可以缩短整个模数转换的时间。至于比较重
要的放电斜率,尽管没有测量,但看起来线性度非常好。施密特触发I/O输入口
的转换也很明显,而且没有检测到干扰信号。在该例中,曲线表明,由高到低变
化的门限电压值为1.62V,当然,这个值依赖于处理过程,而且随着选择的芯片不
同而有所不同,对模数转换值有着重要的影响。6
使用一个I/0口实现A/D转换输入误差由于该应用范例只是提供一个模数转
换的基本形式,并不适用于做精确的测量,但是适用于转换精度有限的领域。绝
对误差的主要来源存在于所使用电容的实际值和输入电压的门限值。尽管使用的
电容为0.1uF,但它的容限可能会大。如果采用软件进行校准,对绝对误差进行补
偿,那么将获得一个合理的精确度。另外,还存在一些小误差,如其中一个就是
由于电容放电时,三极管Vce电压值不断变化引起放电电流的微弱变化。其它误
差可能是由不很理想的电源电压引入的。确保没有上拉电阻与I/O引脚相连,否
则将会产生误差,因为这将影响放电斜率的线性度,尤其在放电电流较小的情况
下。结论该应用范例已说明了如何用一个标准逻辑I/O引脚与内部定时/计数器,
和一些低成本的器件来实现A/D转换功能。虽然不是针对高精度的A/D转换应
用,但这个构思实际上可以实施于低分辨率,低成本的A/D转换功能。在示波器
曲线上随意测量放电斜率,虽然测量方式比较粗糙,但可以看到很好的线性。目
前的应用范例只使用了一个I/O引脚,但很容易适用于多通道模拟输入。该应用
范例使用一个电位计提供模拟信号输入,但可以用一个固定电阻来代替,并使用一
个缓冲电压源与晶体管的基极连接,从而来提供模拟信号的输入。虽然这个电压源
可以用来控制放电电流,但是对三极管保持导通并工作在线性区域的输入电压范
围加强了限制。使用外部中断作为模拟测量输入脚可以实现更高效率的程序规
划,即在模数转化过程中,程序可以继续执行其他的任务。7
本文发布于:2022-11-12 16:43:52,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/5459.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |