51单片机ADDA数模转换

51单片机ADDA数模转换

概述

模拟量

  • 模拟量是相对于数字量而言的。模拟量是对实际量的模拟,是连续变化的(比如用线圈的偏转来测电流或电压),测到的就是模拟量,指针可以指在两个数字中间的任何地方
  • 从时间上来说,它是随时间连续变化的
  • 从数值上来说,它的数值也是连续变化的。这种连续变化的物理量通称为模拟量

数字量

计算机中处理的是不连续变化的量,离散性的数字量
- 在自然界中,有一类物理量的变化在时间上和数量上都是离散的。也就是说,它们的变化在时间上是不连续的,总是发生在一系列离散的瞬间。同时,它们数值大小和每次的增减变化都是某一个最小数量单位的整数倍。我们把这一类的物理量叫做数字量。

当计算机用于数据采集和过程控制时,采集的对象往往是连续变化的物理量如微怒、压力等,但计算机处理的时离散的数字量,因此需要对连续变化的物理量进行A/D转换为不连续的数字量交给计算机处理、保存等。计算机输出的数字量有时需要D/A转换为模拟量去控制某些执行元件。A/D转换器完成模拟量至数字量的转换,D/A转换器完成数字量对模拟量的转换。

A/D转换器的主要技术指标

  • 分辨率
    ADC的分辨率是指输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位。
  • 量化误差
    ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。量化误差是ADC的有限位数对模拟量进行量化而引起的误差。实际上,要准确表示模拟量,ADC的位数需很大甚至无穷大。一个分辨率有限的ADC的阶梯状转换特性曲线与具有无限分辨率的ADC转换特性曲线(直线)之间的最大偏差即是量化误差。

在这里插入图片描述

  • 偏移误差
    偏移误差是指输入信号为零时,输出信号不为零的值,所以有时又称为零值误差。假定ADC没有非线性误差,则其转换特性曲线各阶梯中点的连线必定是直线,这条直线与横轴相交点所对应的输入电压值就是偏移误差。

  • 满刻度误差
    满刻度误差又称为增益误差。ADC的满刻度误差是指满刻度输出数码所对应的实际输入电压与理想输入电压之差。

  • 线性度
    它时指转换器实际的转换特性与理想直线的最大偏差。

  • 绝对精度
    在一个转换器中,任何数码所对应的实际模拟量输入与理论模拟输入之差的最大值,称为绝对精度。对于ADC而言,可以在每一个阶梯的水平中点进行测量,它包括了所有的误差。

  • 转换速率
    ADC的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。

逐次逼近式ADC的转换原理

在这里插入图片描述
逐次逼近式AD转换器与计数式A/D转换类似,只是数字量由“逐次逼近寄存器SAR”产生。SAR使用“对分搜素法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,即1000 0000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn<Vi,保留最高位,在最高位确定之后,SAR又以对分搜索法确定次高位,即低7位的一半y100 0000B(y为已确定位)试探模拟量Vi的大小。重复上述过程,直到最低位Bit0被确定,转换结束。

PCF9581的介绍

PCF8591 是单电源,低功耗8位CMOS数据采集器件,具有4个模拟输入,一个输出和一个串行IIC总线接口。3个地址引脚A0、A1、A2用于编程硬件地址,允许将最多8个器件连接至IIC总线而不需要额外硬件。PCF8591由于其使用的简单方便和集成度高,在单片机应用系统中得到了广泛的应用。

特点

  • 单电源供电
  • 工作电压2.5V~6V
  • IIC总线串行输入/输出
  • 通过3个硬件引脚编址
  • 采样速率取决于IIC总线传输速率决定
  • 4个模拟输入可编程为单端或差分输入
  • 自动增量通道选择
  • 8位逐次比较型A/D转换

XPT4046 的介绍

XPT2046是一款4线制电阻式触控屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器

特点

  • XPT2046支持1.5V-5.225V的低电压I/O接口。
  • 工作温度范围-40°C-+85°C
  • 工作电压范围1.5V - 5.25V
  • 支持1.5V - 5.25V的数字I/O口
  • 采用三线制SPI通信接口

管脚定义

在这里插入图片描述

在这里插入图片描述

工作原理

XPT2046是一种典型的逐次逼近型数模转换器(SAR ADC),包含了采样/保持,数模转换\串口数据输出等功能.同时芯片集成有一个2.5V的内部参考电压源,温度检测电路,工作时使用外部时钟.XPT2046可以单电源供电,电源电压范围为2.7V - 5.5V.参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V - VCC范围内的参考电压(要求外部参考电压源输出阻抗低).X,Y,ZBAT Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式.选择V BAT,Temp和AUX时应该配置为单端模式.
在这里插入图片描述
在这里插入图片描述

AD的差分输入与单端输入

单端输入,输入信号均已共同的地线为基准,这种输入方法主要应用于输入信号电压较高(高于1V),信号源到模拟输入硬件的导线较短,且所有的输入信号共用一个基准地线.如果信号达不到这些标准,此时应该用差分输入.对于差分输入,每一个输入信号都有自有的基准地线,由于共模噪声可以被导线所消除,从而减小了噪声误差.单端输入时,是判断信号与GND的电压差,差分输入时,是判断两个信号线的电压差.信号受干扰时,差分的两线会同时受到影响,但电压差变化不大(抗干扰性较佳)而单端输入的一线发生变化时,GND不变,所以电压差变化较大(抗干扰性较差).

代码

void SPI_Write(unsigned char DAT)//发送一字节数据
{
    
    
	unsigned char i; 
	for(i=0; i<8; i++) //分别写8次,每次写1位
	{
    
    
		DCLK = 0;//拉低时钟总线,允许DIN变化
		if(DAT & 0x80)//先写数据最高位
			DIN = 1;  //写1
		else
			DIN = 0;  //写0
		DCLK = 1;	  //拉高时钟,让从机读DIN
		DAT <<= 1;	  //为发送下一位左移1位
	}
}
unsigned int SPI_Read()//返回读出的数据
{
    
    
	unsigned char i; 
	unsigned int DAT;
	for(i=0; i<12; i++)//分别读12次,每次读一位
	{
    
    
		DAT <<= 1; //数据左移1位,准备接收一位
		DCLK = 1;   //拉高时钟总线,读取SDA上的数据
		DCLK = 0;   //拉低时钟总线,允许从机控制SDA变化
		if(DOUT)
			DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0
	}
	return(DAT); //返回读出的数据
}
unsigned int ReadAD(uchar cmd)//读指定通道输入的模拟量转为数字量
{
    
    
	unsigned int DAT;
	CS = 0;
	SPI_Write(cmd);
	DCLK = 0;   //拉低时钟总线
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	DAT = SPI_Read();
	CS = 1;
	return(DAT);//返回读出数据
			
}

猜你喜欢

转载自blog.csdn.net/m0_52802869/article/details/114038314