51单片机学习4


(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工作原理及其实现方法

RiZqCF.md.jpg

/*********************************************************
	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;
	}

D/A(Digital to Analog)数/模转换


文章作者: 旧时南风
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 旧时南风 !
评论
  目录