(A/D) 模/数转换
转换原理及参数指标
采样保持、量化、编码。
采样定理
$f_s>=2f_{ i max }$
通常取3-5倍(量化需要时间),$f_s$为采样频率,$f_{i max}$为输入信号的最高频率分量的频率。在满足采样定理的条件下可以使用一个低通滤波器将信号还原出来,该低通滤波器电压传输系数在低于$f_{imax}$的范围内保持不变,在$f_s$-$f_{imax}$以前迅速下降为0
量化和编码
量化:化成一个最小数量单位(量化单位$\bigtriangleup$)的整数倍。(会产生量化误差,最大为$\bigtriangleup$,解决:取中点,缩小为$\bigtriangleup$/2)
编码:把量化的数值用二进制代码表示,即输出信号。
补充:采样保持电路(N沟道MOS管可做采样开关用,高电平T导通)
直接A/D转换器
并行比较型
(电压比较器+寄存器+代码转换器)
单片集成并行比较型A/D转换器如:AD9012(8位)、AD9002(8位)、AD9020(10位)等
特点:①并行,转换时间只受比较器、触发器和编码电路延迟时间限制,转换速度快;②随着分辨率提高,元件数目按几何级数增加;③这种含寄存器的并行A/D转换电路,可以不用附加采样-保持电路(比较器和寄存器兼有采样-保持功能)。
缺点:需要很多的电压比较器和触发器。
反馈比较型
原理:取一个数字量加到D/A转换器上,得到一个对应的输出模拟电压,将这个模拟电压与输入的模拟电压信号比较,如果两者不相等,则调整所取的数字量,直至两个模拟电压相等为止,最后所取的数字量就是转换结果。
计数型
( 比较器C+D/A转换器+计数器+脉冲源+控制门G+输出寄存器等)
使用寄存器原因:转换过程计数器中数字不停变化,不宜将计数器状态直接作为输出信号。
缺点:转换速度低。
逐次比较型
(提高转换速度,在计数型基础上,采用类似天平称重的思路:将输入模拟信号与不同的参考电压做多次比较,使转换所得的数字量在树数值上逐次逼近输入模拟量的对应值)
一次转换时间与其位数和时钟脉冲频率相关。位数越少,时钟频率越高,转换时间越短。
优点:转换速度快,精度高等。
集成逐次比较型A/D转换器如:8位:ADC0804、ADC0808、ADC0809系列;10位:AD575;12位:AD574A等
间接A/D转换器(主要两种)
时间-电压变换型(V-T变换型)
首先把输入的模拟电压信号转换成与之成正比的时间宽度信号,然后在这个时间宽度里对固定频率的时钟脉冲计数,计数结果就是正比于输入模拟电压的数字信号。
电压-频率变换型(V-F变换型)
首先把输入的模拟电压信号转换成与之成正比的频率信号,然后在一个固定的时间间隔里对得到的频率信号计数,所得到的结果就是正比于输入模拟电压的数字量。
A/D转换器的参数指标
分辨率
(对输入信号的分辨能力。以输出二进制的位数表示)
eg:输出8位二进制数,输入信号最大值5V,分辨最小电压:$5V×1/2^8≈19.53mv$
转换误差
(理论与实际输出数字量之间的差别,一般用最低有效位表示)
转换精度
(A/D转换器的最大量化误差和模拟部分精度的共同体现)
最大量化误差:应为分辨率数值的一半(实际还要低些);
模拟处理(如积分器、比较器等)部分的误差:一般与数字转换误差应尽量处于同一数量等级;
总误差:累加和。
eg:10位A/D转换器用其中9位计数,
最大相对量化误差:2^9×0.5≈0.1%,模拟部分也为0.1%,总精度0.2%
转换时间
(转换控制信号来,到输出端得到稳定的数字信号所经过的时间)
时间:并行比较A/D转换器(8位单片集成50ns)<逐次比较型A/D转换型(10-50us,也有几百纳秒的)<间接A/D转换器(双积分A/D转换器时间几十毫秒~几百毫秒)
小结:
①高速:并行;
②高精度:双积分A/D转换器;
③逐次比较型A/D转换器兼有,普遍使用;
④主要技术参数:转换精度、转换速度(决定系统)
ADC0804工作原理及其实现方法
/*********************************************************
11、TX-IC上ADC0804的数模转换使用(逐次比较型)
*********************************************************/
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6; //U1锁存端
sbit wela = P2^7; //U2锁存端
sbit adwr = P3^6; //A/D的WR端口
sbit adrd = P3^7; //A/D的RD端口
uchar code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d ,0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c ,
0x39 , 0x5e , 0x79 , 0x71 };
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
dula = 1;
P0 = table[bai];
dula = 0;
P0 = 0xff; //送位选数据前关闭所有显示,防止打开位选锁存时,原来的段选数据通过位选锁存器造成混乱
wela = 1;
P0 = 0x7e; //送位选数据 0111 1110 (始终保持最高位为0,是下方CS端一直被选中)
wela = 0;
delayms(5);
dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0x7d; //0111 1101
wela = 0;
delayms(5);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0x7b; //0111 1011
wela = 0;
delayms(5);
}
void main()
{
uchar a,A1,A2,A3,adval;
wela = 1;
P0 = 0x7f; //CSAD为0,选通ADCS后不再管ADCS
wela = 0;
while(1)
{
adwr = 1;
_nop_(); //延迟一个机器周期
adwr = 0; //AD启动
_nop_();
adwr = 1;
for(a=10;a>0;a--) //此处A/D工作频率较低,所以启动后要多留时间用来转换(将显示部分放在这里)
{
display(A1,A2,A3);
}
P1 = 0xff; //读取P1口之前全赋1
adrd = 1; //选通ADCS
_nop_();
adrd = 0; //A/D读使能
_nop_();
adval = P1; //将A/D数据赋给P1口
adrd = 1;
A1 = adval/100;
A2 = adval%100/10;
A3 = adval%10;
}