ad转换_ad转换实验 - CSDN
ad转换 订阅
模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。与模数转换相对应的是数模转换,数模转换是模数转换的逆过程,接下来本文将主要介绍几种模数转换的方法以及模数转换器的参数等。 展开全文
模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的。与模数转换相对应的是数模转换,数模转换是模数转换的逆过程,接下来本文将主要介绍几种模数转换的方法以及模数转换器的参数等。
信息
别    称
模拟一数字转换
作    用
信号数字化
中文名
模数转换
外文名
analogue-to-digital conversion;ADC
模数转换简介
与传统无线电不同,软件无线电要求尽可能地以数字形式处理无线信号,因此必须将A/D和D/A转换器尽可能地向天线端推移,这就对A/D和D/A转换器的性能提出了更高的要求。主要体现在两个方面。(1)采样速率。依据采样定理,A/D转换器的抽样频率fs应大于2Wa(Wa为被采样信号的带宽)。在实际中,由于A/D转换器件的非线性、量化噪声、失真及接收机噪声等因素的影响,一般选取fs>2.5Wa。(2)分辨率。采样值的位数的选取需要满足一定的动态范围及数字部分处理精度的要求,一般分辨率80dB的动态范围要求下不能低于12位。
收起全文
精华内容
参与话题
  • 12、AD模数转换

    千次阅读 2019-03-01 17:18:04
    一、A/D转换器的主要技术指标 1、分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位,或者说分辨率为满刻度的1/(2^12)。 一个10...

    一、A/D转换器的主要技术指标
        1、分辨率
             ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位,或者说分辨率为满刻度的1/(2^12)。
            一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V×1/(2^12 )=2.4mV。
        2、量化误差
             ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。量化误差是ADC的有限位数对模拟量进行量化而引起的误差。实际上,要准确表示模拟量,ADC的位数需很大甚至无穷大。一个分辨率有限的ADC的阶梯状转换特性曲线与具有无限分辨率的ADC转换特性曲线(直线)之间的最大偏差即是量化误差。 
        3、偏移误差
            偏移误差是指输入信号为零时,输出信号不为零的值,所以有时又称为零值误差。假定ADC没有非线性误差,则其转换特性曲线各阶梯中点的连线必定是直线,这条直线与横轴相交点所对应的输入电压值就是偏移误差。
        4、满刻度误差
            满刻度误差又称为增益误差。ADC的满刻度误差是指满刻度输出数码所对应的实际输入电压与理想输入电压之差。
        5、线性度
            线性度有时又称为非线性度,它是指转换器实际的转换特性与理想直线的最大偏差。    
        6、绝对精度
             在一个转换器中,任何数码所对应的实际模拟量输入与理论模拟输入之差的最大值,称为绝对精度。对于ADC而言,可以在每一个阶梯的水平中点进行测量,它包括了所有的误差。
        7、转换速率
             ADC的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。



    二、逐次逼近式ADC的转换原理


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

     

     

     

    三、控制命令寄存器值的选择
        如果要检测转换电位器模拟信号,控制字命令寄存器值为0X94或者0XB4.
        如果要检测转换热敏电阻模拟信号,控制字命令寄存器值为0XD4.
        如果要检测转换光敏电阻模拟信号,控制字命令寄存器值为0XA4.
        如果要检测转换AIN3通道上模拟信号,控制字命令寄存器值为0XE4.

     

    电位器AD的值(同样的光敏电阻,热敏电阻,外部输入的代码类似,只要修改命令寄存器的值)

    主函数部分

    /**************************************************************************************
    *		              电位器AD实验												  *
    实现现象:下载程序后数码管后4位显示电位器检测的AD值,范围是0-4095,一般达不到最大,这个受
    			你供电电压的影响.
    注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。																				  
    ***************************************************************************************/
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    #include"XPT2046.h"	
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 disp[4];
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能		   : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函数名         :datapros()
    * 函数功能		 :数据处理函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void datapros()
    {
    	u16 temp;
    	static u8 i;
    	if(i==50)
    	{
    		i=0;
    		temp = Read_AD_Data(0x94);		//   AIN0 电位器
    	}
    	i++;
    	disp[0]=smgduan[temp/1000];//千位
    	disp[1]=smgduan[temp%1000/100];//百位
    	disp[2]=smgduan[temp%1000%100/10];//个位
    	disp[3]=smgduan[temp%1000%100%10];		
    }
    
    
    /*******************************************************************************
    * 函数名         :DigDisplay()
    * 函数功能		 :数码管显示函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void DigDisplay()
    {
    	u8 i;
    	for(i=0;i<4;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSA=0;LSB=0;LSC=0; break;//显示第0位
    			case(1):
    				LSA=1;LSB=0;LSC=0; break;//显示第1位
    			case(2):
    				LSA=0;LSB=1;LSC=0; break;//显示第2位
    			case(3):
    				LSA=1;LSB=1;LSC=0; break;//显示第3位	
    		}
    		P0=disp[3-i];//发送数据
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	while(1)
    	{
    		datapros();	 //数据处理函数
    		DigDisplay();//数码管显示函数		
    	}		
    }
    
    

     

    数据处理函数部分

    #include"XPT2046.h"
    
    /****************************************************************************
    *函数名:SPI_Write
    *输  入:dat:写入数据
    *输  出:无
    *功  能:使用SPI写入数据
    ****************************************************************************/
    
    void SPI_Write(uchar dat)
    {
    	uchar i;
    	CLK = 0;
    	for(i=0; i<8; i++)
    	{
    		DIN = dat >> 7;  	//放置最高位
    		dat <<= 1;
    		CLK = 0;			//上升沿放置数据
    
    		CLK = 1;
    
    	}
    }
    /****************************************************************************
    *函数名:SPI_Read
    *输  入:无
    *输  出:dat:读取 到的数据
    *功  能:使用SPI读取数据
    ****************************************************************************/
    
    uint SPI_Read(void)
    {
    	uint i, dat=0;
    	CLK = 0;
    	for(i=0; i<12; i++)		//接收12位数据
    	{
    		dat <<= 1;
    
    		CLK = 1;
    		CLK = 0;
    
    		dat |= DOUT;
    
    	}
    	return dat;	
    }
    
    /****************************************************************************
    *函数名:Read_AD_Data
    *输  入:cmd:读取的X或者Y
    *输  出:endValue:最终信号处理后返回的值
    *功  能:读取触摸数据
    ****************************************************************************/
    uint Read_AD_Data(uchar cmd)
    {
    	uchar i;
    	uint AD_Value;
    	CLK = 0;
    	CS  = 0;
    	SPI_Write(cmd);
    	for(i=6; i>0; i--); 	//延时等待转换结果
    	CLK = 1;	  //发送一个时钟周期,清除BUSY
    	_nop_();
    	_nop_();
    	CLK = 0;
    	_nop_();
    	_nop_();
    	AD_Value=SPI_Read();
    	CS = 1;
    	return AD_Value;	
    }
    

     

    头文件函数

    #ifndef	  __XPT2046_H_
    #define   __XPT2046_H_
    
    //---包含头文件---//
    #include<reg52.h>
    #include<intrins.h>
    
    //---重定义关键词---//
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    #ifndef uint
    #define uint  unsigned int
    #endif
    
    #ifndef ulong
    #define ulong  unsigned long
    #endif
    
    //---定义使用的IO口---//
    sbit DOUT = P3^7;	  //输出
    sbit CLK  = P3^6;	  //时钟
    sbit DIN  = P3^4;	  //输入
    sbit CS   = P3^5;	  //片选
    
    uint Read_AD_Data(uchar cmd);
    uint SPI_Read(void);
    void SPI_Write(uchar dat);
    
    #endif
    
    
    
    
    
    

     

    展开全文
  • 51单片机 AD转换

    万次阅读 多人点赞 2016-08-06 17:15:52
    在数逻的课程中,已经学习过AD转换的概念:将模拟信号采样、量化、编码后转换为数字信号。但是未学习过通过单片机编程,显示结果。 编码分有舍有入、只舍不入两种,量化误差前者更小。=2Vm/(2^n+1 - 1 ) 注意...

    在数逻的课程中,已经学习过AD转换的概念:将模拟信号采样、量化、编码后转换为数字信号。但是未学习过通过单片机编程,显示结果。

    编码分有舍有入、只舍不入两种,量化误差前者更小。=2Vm/(2^n+1  - 1 )

    注意,为了达到精确度高、稳定性好的目的,最好将所有器件的模拟地和数字分别连接,最后将模拟地和数字地仅在一点相连。

     

    此处,使用的是STC12C5A60S2内部的AD转换。


    /* 功能:使用12C5A60S2内部AD读取外部电压,显示在1602上       */
    
    #include "STC12C5A60S2.H"
    #include <intrins.h>
    sbit RS = P2^6;   //1602定义口  //HZ:EN=P2.2  RS=P2.0  RW=P2.1
    sbit RW = P2^5;
    sbit EN = P2^7;
    #define uchar unsigned char;
    #define uint unsigned int;
    
    #define RS_CLR RS=0 
    #define RS_SET RS=1
    #define RW_CLR RW=0 
    #define RW_SET RW=1 
    #define EN_CLR EN=0
    #define EN_SET EN=1
    
    #define DataPort P0   //连接1602数据口 P0             
    
    uchar da1=0,da2=0,da3=0;
    double Data,c;
    char a[5]="";         
    uchar ADC_Chanul_Turn=0;
    
    
    void DelayUs2x(unsigned char t)
    {   
     while(--t);
    }
    
    
    void DelayMs(unsigned char t)
    {
         
     while(t--)
     {
         //大致延时1mS
         DelayUs2x(245);
         DelayUs2x(245);
     }
    }
    /*------------------------------------------------
                  判忙函数
    ------------------------------------------------*/
     bit LCD_Check_Busy(void) 
     { 
     DataPort= 0xFF; 
     RS_CLR; 
     RW_SET; 
     EN_CLR; 
     _nop_(); 
     EN_SET;
     return (bit)(DataPort & 0x80);   
     }
    /*---------
    ------------------------------------------------*/
     void LCD_Write_Com(unsigned char com) 
     {  
     while(LCD_Check_Busy()); //忙则等待
     RS_CLR; 
     RW_CLR; 
     EN_SET; 
     DataPort= com;          //
     _nop_(); 
     EN_CLR;
     }
    /*------------------------------------------------
                  写入数据函数
    ------------------------------------------------*/
     void LCD_Write_Data(unsigned char Data) 
     { 
     while(LCD_Check_Busy()); //忙则等待
     RS_SET; 
     RW_CLR; 
     EN_SET; 
     DataPort= Data; 
     _nop_();
     EN_CLR;
     }
    
    /*------------------------------------------------
                    清屏函数
    ------------------------------------------------*/
     void LCD_Clear(void) 
     { 
     LCD_Write_Com(0x01); 
     DelayMs(5);
     }
    /*------------------------------------------------
                  写入字符串函数
    ------------------------------------------------*/
     void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)//y为行数,x为横坐标,最后一个是字符 
     {     
     if (y == 0) 
         {     
         LCD_Write_Com(0x80 + x);     //表示第一行
         }
     else 
         {      
         LCD_Write_Com(0xC0 + x);      //表示第二行
         }        
     while (*s) 
         {     
     LCD_Write_Data( *s);     
     s ++;     
         }
     }
    /*------------------------------------------------
                  写入字符函数
    ------------------------------------------------*/
     void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
     {     
     if (y == 0) 
         {     
         LCD_Write_Com(0x80 + x);     
         }    
     else 
         {     
         LCD_Write_Com(0xC0 + x);     
         }        
     LCD_Write_Data( Data);  
     }
    /*------------------------------------------------
                  初始化函数
    ------------------------------------------------*/
     void LCD_Init(void) 
     {
       LCD_Write_Com(0x38);    /*显示模式设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38);  
       LCD_Write_Com(0x08);    /*显示关闭*/ 
       LCD_Write_Com(0x01);    /*显示清屏*/ 
       LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x0C);    /*显示开及光标设置*/
       }
       
    /*------------------------------------------------
                      ADC函数
    ------------------------------------------------*/ 
    void InitADC()//初始AD寄存器
    {
             P1ASF=0x03;     //0xff设置P1口全部为ADC通道,P10 P11为输出口
            ADC_RES=0x00;    //清除高8位缓冲数据
            if(ADC_Chanul_Turn%2==0)
            {
                ADC_CONTR=0xF0;    //P10口
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                ADC_CONTR=0xE8;
                    
             }
            if(ADC_Chanul_Turn%2==1)   //P11口
            {
                ADC_CONTR=0xF1; 
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                ADC_CONTR=0xE9;    
             }                              
    }     
    
    void timer0() interrupt 1      //interrupt 1: 定时器0,interrupt3:定时器3
    {
        TH0=(65536-20000)/256;       //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)
        TL0=(65536-20000)%256;     //低八位
        InitADC();
        
    }
    
    void adc_isr() interrupt 5      //FLAG标志位置位触发中断,没有设优先级,但是同优先级下定时器0更高
    {  
       
       //V_5REF=V_1REF*256/da_ref;
       if(ADC_Chanul_Turn%3==0)                     //外部基准电压
       {    
           da1=ADC_RES;                                   //获取转换结果
           Data=((double)da1/256)*5;     //取八位计算基准电压Data,
           c =Data;
           } 
       if(ADC_Chanul_Turn%3==1)
       {
           da2=ADC_RES;                                  //获取转换结果
           Data=((double)da2/256)*5;     //取八位计算实际值Data,
           c =Data;
           }
       if(ADC_Chanul_Turn%3==2)
       {
           da3=ADC_RES;                                  //获取转换结果
           Data=((double)da3/256)*5;     //取八位计算实际值Data,
           c =Data;
           }
          
       a[0]=((int)c%10+0x30);//个位(电压<5,仅有个)     //0x30: ASCAI码里代表“0”,必须转换成字符存在字符型数组里才可以在1602液晶屏上显示
       a[1]=0x2e;                    //小数点
       a[2]=((int)(c*10)%10+0x30); // 十分位
       a[3]=((int)(c*100)%10+0x30);// 百分位
       a[4]='\0';                  //  加了串尾符才成了字符串哦
    
       if(ADC_Chanul_Turn%3==0)  LCD_Write_String(0,0,a);
       if(ADC_Chanul_Turn%3==1)  LCD_Write_String(5,0,a);
       if(ADC_Chanul_Turn%3==2) LCD_Write_String(0,1,a); 
       
       ADC_CONTR&=0xEF;               //标志位清零
       
       ADC_Chanul_Turn++;
       if(ADC_Chanul_Turn==252) 
          ADC_Chanul_Turn=0;    
    }
    void main()
    {
        LCD_Init(); 
        LCD_Clear();                     //清屏
        DelayMs(255);
        TH0=(65536-20000)/256;           //开定时器0
        TL0=(65536-20000)%256;
        EA=1;                             //开全局中断
        ET0=1;                             //允许定时器零中断
        EADC=1;                          //允许ADC中断 
        TR0=1;       
        while(1);
    }


    展开全文
  • AD转换原理,器件与参数

    万次阅读 2018-01-13 18:28:43
    2 模数转换2.1 转换原理类别AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、压频变换型。A/D转换器是用来通过一定的电路将模拟量...

    1 内容简介

    对AD芯片基本原理,分类与关键技术参数指标进行整理介绍。

    2 模数转换

    2.1 转换原理类别

    AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。

    2.1.1 积分类型

    一个积分型ADC是一种通过使用积分器将未知的输入电压转换成数字表示的一种模-数转换器。在它最基本的实现中,这个未知的输入电压是被施加在积分器的输入端,并且持续一个固定的时间段(所谓的上升阶段)。然后用一个已知的反向电压施加到积分器,这样持续到积分器输出归零(所谓的下降阶段)。这样,输入电压的计算结果实际是参考电压的一个函数,定时上升阶段时间和测得的下降阶段时间。下降阶段时间的测量通常是以转换器的时钟为单位,所以积分时间越长,分辨率越高。同样的,转换器的速度可以靠牺牲分辨率来获得提升。这种类型的AD转换器可以获得高分辨率,但是通常这样做会牺牲速度。因此,这些转换器不适用于音频或信号处理的场合应用。 他们通常的典型应用就是数字电压计和其他需要高精度测量的仪表。
    如图2.1与图2.2所示,转换过程分两个阶段:上升阶段和下降阶段。在上升阶段,积分器的输入是被测电压,在下降阶段,积分器的输入是已知的参考电压。在上升阶段中,开关选择被测电压进入积分器,积分器持续一个固定的时间段进行积分,在积分电容上面积累电荷。在下降阶段,开关选择参考电压进入积分器,在这阶段测量积分器输入归零的时间。
    图2.1 ADC基本原理示意图
    图2.1 ADC基本原理示意图

    这里写图片描述
    图2.2 采样电路充放电过程电压变化图示

    2.1.2 逐次逼近类型

    逐次逼近型adc由比较器、D/A转换器、缓冲寄存器和若干控制逻辑电路构成。原理是从高位到低位逐位比较,首先将缓冲寄存器各位清零;转换开始后,先将寄存器最高位置1,把值送入D/A转换器,经D/A转换后的模拟量送入比较器,称为 Vo,与比较器的待转换的模拟量Vi比较,若Vo

    2.1.3 并行比较类型

    一种典型的3位并行比较型A/D转换器原理电路如下图所示。它由电阻分压器、电压比较器、寄存器及编码器组成。
    图中的8个电阻将参考电压VREF分成8个等级,其中7个等级的电压分别作为7个比较器 C1~C7 的参考电压,其数值分别为VREF/15、3VREF/15…、13VREF/15。输入电压为v1,它的大小决定各比较器的输出状态,如当0≤v1< VREF/15时,C7~C1的输出状态都为0;当3VREF/15≤v1<5VREF/15时,比较器C6和C7的输出CO6=CO7=1,其余各比较器的状态均为0。根据各比较器的参考电压值,可以确定输入模拟电压值与各比较器输出状态的关系。比较器的输出状态由D触发器存储,经优先编码器编码,得到数字量输出。优先编码器优先级别最高是I7 ,最低的是I1。设v1变化范围是 0~VREF,输出3位数字量为D2D1D0,3位并行比较型A/D转换器的输入、输出关系如图2.4所示所示。
    这里写图片描述
    图2.3 三位并行比较ADC示意图

    这里写图片描述
    图2.4 三位并行比较ADC输出示意图

    这类型芯片具有以下特点:
     由于转换是并行的,其转换时间只受比较器、触发器和编码电路延迟时间的限制,因此转换速度最快。
     随着分辨率的提高,元件数目要按几何级数增加。一个n位转换器,所用比较器的个数为2n-1,如8位的并行A/D转换器就需要28-1=255个比较器。由于位数愈多,电路愈复杂,因此制成分辨率较高的集成并行A/D转换器是比较困难的。
     精度取决于分压网络和比较电路。
     动态范围取决于VREF。

    2.1.4 sigma类型

    我们要解释∑-ΔADC的原理,这包含了几个基本理论:过采样(over sampling),量化噪声整形(quantization),数字滤波(digital filtering),抽取(decimation)。Σ-Δ转换器中的模拟部分非常简单(类似于一个1bit ADC),而数字部分要复杂得多,按照功能可划分为数字滤波和抽取单元。由于更接近于一个数字器件,Σ-ΔADC的制造成本非常低廉。
    过采样:首先,考虑一个传统ADC的频域传输特性。输入一个正弦信号,然后以频率fs采样–按照 Nyquist定理,采样频率至少两倍于输入信号。从FFT分析结果可以看到,一个单音和一系列频率分布于DC到fs /2间的随机噪声。这就是所谓的量化噪声,主要是由于有限的ADC分辨率而造成的。单音信号的幅度和所有频率噪声的RMS幅度之和的比值就是信号噪声比(SNR)。对于一个Nbit ADC,SNR可由公式:SNR=6.02N+1.76dB得到。为了改善SNR和更为精确地再现输入信号,对于传统ADC来讲,必须增加位数。
    这里写图片描述
    图 N位ADC以fs采样单频点信号频谱图

    如果将采样频率提高一个过采样系数k,即采样频率为kfs,再来讨论同样的问题。FFT分析显示噪声基线降低了,SNR值未变,但噪声能量分散到一个更宽的频率范围。Σ-Δ转换器正是利用了这一原理,具体方法是紧接着1bit ADC之后进行数字滤波。大部分噪声被数字滤波器滤掉,这样,RMS噪声就降低了,从而一个低分辨率ADC,Σ-Δ转换器也可获得宽动态范围。
    这里写图片描述
    图 N位ADC以K*fs采样单频点信号频谱图

    那么,简单的过采样和滤波是如何改善SNR的呢?一个1bit ADC的SNR为7.78dB(6.02+1.76),每4倍过采样将使SNR增加6dB,SNR每增加6dB等效于分辨率增加1bit。这样,采用1bit ADC进行64倍过采样就能获得4bit分辨率;而要获得16bit分辨率就必须进行415倍过采样,这是不切实际的。Σ-Δ转换器采用噪声成形技术消除了这种局限,每4倍过采样系数可增加高于6dB的信噪比。
    这里写图片描述
    图 数字滤波器对噪声信号的减弱效果

    量化噪声整形:Σ-Δ调制器包含1个差分放大器、1个积分器、1个比较器以及1个由1bit DAC(1个简单的开关,可以将差分放大器的反相输入接到正或负参考电压)构成的反馈环。反馈DAC的作用是使积分器的平均输出电压接近于比较器的参考电平。调制器输出中”1”的密度将正比于输入信号,如果输入电压上升,比较器必须产生更多数量的”1”,反之亦然。积分器用来对误差电压求和,对于输入信号表现为一个低通滤波器,而对于量化噪声则表现为高通滤波。这样,大部分量化噪声就被推向更高的频段。和前面的简单过采样相比,总的噪声功率没有改变,但噪声的分布发生了变化。
    这里写图片描述
    图 Σ-Δ调制器

    现在,如果对噪声成形后的Σ-Δ调制器输出进行数字滤波,将有可能移走比简单过采样中更多的噪声。这种调制器(一阶)在每两倍的过采样率下可提供9dB的SNR改善。
    在Σ-Δ调制器中采用更多的积分与求和环节,可以提供更高阶数的量化噪声成形。例如,一个二阶Σ-Δ调制器在每两倍的过采样率下可改善SNR 15dB。图2显示了Σ-Δ调制器的阶数、过采样率和能够获得的SNR三者之间的关系。
    这里写图片描述
    图 量化噪声整形示意图

    这里写图片描述
    图 SNR与过采样率的关系

    数字滤波:Σ-Δ调制器以采样速率输出1bit数据流,频率可高达MHz量级。数字滤波和抽取的目的是从该数据流中提取出有用的信息,并将数据速率降低到可用的水平。Σ-ΔADC中的数字滤波器对1bit数据流求平均,移去带外量化噪声并改善ADC的分辨率。数字滤波器决定了信号带宽、建立时间和阻带抑制。
    抽取:由于带宽被输出数字滤波器降低,输出数据速率可低于原始采样速率,但仍满足Nyquist定律。这可通过保留某些采样而丢弃其余采样来实现,这个过程就是所谓的按M因子”抽取”。M因子为抽取比例,可以是任何整数值。在选择抽取因子时应该使输出数据速率高于两倍的信号带宽。这样,如果以fs的频率对输入信号采样,滤波后的输出数据速率可降低至fs /M,而不会丢失任何信息。

    2.2 关键技术参数

    2.2.1 分辨率

    简单点说,“精度”是用来描述物理量的准确程度的,而“分辨率”是用来描述刻度划分的。从定义上看,这两个量应该是风马牛不相及的。简单做个比喻:有这么一把常见的塑料尺(中学生用的那种),它的量程是10厘米,上面有100个刻度,最小能读出1毫米的有效值。那么我们就说这把尺子的分辨率是1毫米,或者量程的1%;而它的实际精度就不得而知了(算是0.1毫米吧)。当我们用火来烤一下它,并且把它拉长一段,然后再考察一下它。我们不难发现,它还有有100个刻度,它的“分辨率”还是1毫米,跟原来一样!然而,您还会认为它的精度还是原来的0.1毫米么?

    2.2.2 转换速率

    转换速率(Conversion Rate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率(Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。

    2.2.3 精度与误差

    常用的A/D转换器主要存在:失调误差、增益误差和线性误差。

    2.2.3.1 基准误差

    采用内部或外部基准的ADC的一个最大潜在误差源是参考电压。很多情况下,内置于芯片内部的基准通常都没有足够严格的规格。为了理解基准所带来的误差源,有必要特别关注一下三项指标:温漂,电压噪声,和负载调整。

    2.2.3.2 量化误差

    量化误差(Quantizing Error) 由于AD的有限分辩率而引起的误差,即有限分辩率AD的阶梯状转移特性曲线与无限分辩率AD(理想AD)的转移特性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。

    2.2.3.3 失调误差与增益误差

    失调误差与增益误差用数学公式可表达为:y=ax+b。其中,a为增益误差,b为失调误差。失调误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。

    2.2.3.4 线性度

    线性度指标有两个:INL:翻译过来叫“积分非线性”,指的是ADC整体的非线性程度。DNL:翻译过来叫“微分非线性”,指的是ADC局部(细节)的非线性程度。
    模数器件的精度指标是用积分非线性度(Interger NonLiner)即INL值来表示。也有的器件手册用 Linearity error 来表示。他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。也就是,输出数值偏离线性最大的距离,单位是LSB(即最低位所表示的量)。比如12位ADC 的INL值为1LSB。那么,如果基准4.095V,测某电压得的转换结果是1000,那么,真实电压值可能分布在0.999~1.001V之间。
    下面再说DNL值。理论上说,模数器件相邻量个数据之间,模拟量的差值都是一样的。就相一把疏密均匀的尺子。但实际并不如此。一把分辨率1毫米的尺子,相邻两刻度之间也不可能都是1毫米整。那么,ADC相邻两刻度之间最大的差异就叫差分非线性值(Differencial NonLiner)。DNL值如果大于1,那么这个ADC甚至不能保证是单调的,输入电压增大,在某个点数值反而会减小。这种现象在SAR(逐位比较)型ADC中很常见。举个例子,某12位ADC,INL=8LSB,DNL=3LSB(性能比较差),基准4.095V,测A电压读数1000,测B电压度数1200。那么,可判断B点电压比A点高197~203mV。而不是准确的200mV。
    总结:(1)INL(Interger NonLinear,Linearity error)精度。理解为单值数据误差,对应该点模拟数据由于元器件及结构造成的不能精确测量产生的误差。(2)DNL(Differential NonLinear)差分非线性值。理解为刻度间的差值,即对每个模拟数据按点量化,由于量化产生的误差。

    2.2.3.5 信噪比

    这里写图片描述
    这里写图片描述
    图 信噪比

    2.2.3.6 有效位数

    这里写图片描述

    2.2.3.7 动态范围

    这里写图片描述

    3 参考文献

    [1] 《A Glossary of Analog-to-Digital Specifications and Performance Characteristics》;
    [2] 《理解AD转换器的性能参数》;
    [3] 《Demystifying Sigma-Delta ADCs》;
    [4] 《揭开Σ-ΔADC的神秘面纱》;

    展开全文
  • AD转换

    2020-05-17 21:48:27
    AD转换 1.AD转换就是模拟信号转数字信号 2.我们使用的芯片是:xpt2046 原理图:我们使用的是AIN0 3.引脚的含义: 4.命令字的含义: 5.操作时序: 代码:来源于普中科技单片机教程 void SPI_Write(uchar dat) { ...

    AD转换
    1.AD转换就是模拟信号转数字信号
    2.我们使用的芯片是:xpt2046
    原理图:我们使用的是AIN0
    在这里插入图片描述
    3.引脚的含义:
    在这里插入图片描述
    4.命令字的含义:
    在这里插入图片描述
    5.操作时序:
    在这里插入图片描述
    代码:来源于普中科技单片机教程

    void SPI_Write(uchar dat)
    {
    	uchar i;
    	CLK = 0;
    	for(i=0; i<8; i++)
    	{
    		DIN = dat >> 7;  	//放置最高位
    		dat <<= 1;
    		CLK = 0;			//上升沿放置数据
    
    		CLK = 1;
    
    	}
    }
    
    uint SPI_Read(void)
    {
    	uint i, dat=0;
    	CLK = 0;
    	for(i=0; i<12; i++)		//接收12位数据
    	{
    		dat <<= 1;
    
    		CLK = 1;
    		CLK = 0;
    
    		dat |= DOUT;
    
    	}
    	return dat;	
    }
    
    uint Read_AD_Data(uchar cmd)
    {
    	uchar i;
    	uint AD_Value;
    	CLK = 0;
    	CS  = 0;
    	SPI_Write(cmd);
    	for(i=6; i>0; i--); 	//延时等待转换结果
    	CLK = 1;	  //发送一个时钟周期,清除BUSY
    	_nop_();
    	_nop_();
    	CLK = 0;
    	_nop_();
    	_nop_();
    	AD_Value=SPI_Read();
    	CS = 1;
    	return AD_Value;	
    }
    
    /**************************************************************************************
    *		              电位器AD实验												  *
    实现现象:下载程序后数码管后4位显示电位器检测的AD值,范围是0-4095,一般达不到最大,这个受
    			你供电电压的影响.
    注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。																				  
    ***************************************************************************************/
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    #include"XPT2046.h"	
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 disp[4];
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能		   : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函数名         :datapros()
    * 函数功能		 :数据处理函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void datapros()
    {
    	u16 temp;
    	static u8 i;
    	if(i==50)
    	{
    		i=0;
    		temp = Read_AD_Data(0x94);		//   AIN0 电位器,8bit模式
    	}
    	i++;
    	disp[0]=smgduan[temp/1000];//千位
    	disp[1]=smgduan[temp%1000/100];//百位
    	disp[2]=smgduan[temp%1000%100/10];//个位
    	disp[3]=smgduan[temp%1000%100%10];		
    }
    
    
    /*******************************************************************************
    * 函数名         :DigDisplay()
    * 函数功能		 :数码管显示函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void DigDisplay()
    {
    	u8 i;
    	for(i=0;i<4;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSA=0;LSB=0;LSC=0; break;//显示第0位
    			case(1):
    				LSA=1;LSB=0;LSC=0; break;//显示第1位
    			case(2):
    				LSA=0;LSB=1;LSC=0; break;//显示第2位
    			case(3):
    				LSA=1;LSB=1;LSC=0; break;//显示第3位	
    		}
    		P0=disp[3-i];//发送数据
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	while(1)
    	{
    		datapros();	 //数据处理函数
    		DigDisplay();//数码管显示函数		
    	}		
    }
    
    展开全文
  • AD和DA转换

    万次阅读 多人点赞 2018-01-27 20:32:40
    1 AD转换及其相关背景知识 1.1 基本概念 (1)什么是AD转换?A(A,analog,模拟的,D,digital,数字的) 现实世界是模拟的,连续分布的,无法被分成有限份; 计算机世界是数字的,离散分布的,是可以被分成...
  • AD转换原理

    千次阅读 2018-06-30 22:50:34
    此时,A/D或者D/A转换器的都或许知道其分辨率的定义式( 选择D/A转换器来说明 ): 当模拟量的范围( 如电压范围[ UMIN, UMAX] )确定之后,分辨率就可以用来确定当D/A转换器内部二进制数变化1时对应的模拟信号的...
  • AD转换的一个硬件实现原理

    千次阅读 2018-09-29 16:16:35
    ADC的一个实现原理如下,也就是说利用PWM滤波后得到的电压值作为比较器的正端输入,而模拟输入作为比较器的负端输入,通过判断输出是高还是低,加上不断地改变比较器正端的输入电压(通过改变PWM的占空比),从而...
  • AD转换器的种类介绍

    千次阅读 2019-06-28 21:28:38
    https://www.eefocus.com/yulzhu/blog/11-10/233133_3b078.html ...wd=&eqid=8...
  • 我们经常遇到从AD转到Allegro的情况,但是之前非常麻烦且不容易转换。现在好了,从065号补丁开始,Cadence的Capture CIS可以导入AD软件的原理图,而Cadence的Allegro PCB Editor可以导入AD软件的PCB文档,下面就说下...
  • HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。
  • 常用AD转换芯片比较

    万次阅读 2018-03-23 16:53:44
    1. AD7656(阿尔泰公司用这个实现的采集卡是150ksps,16位,差分16路同步模拟量输入)AD7656: 250 kSPS、6通道、同步采样双极性16位ADAD7656在单芯片内集成了6个16位、快速、低功耗、逐次逼近型ADC。内核采用4.5V...
  • AD转换精度提高方法

    千次阅读 2017-10-23 10:31:45
    在高精度AD转换中,对电源的要求往往很大,若有多路AD转换,则可通过自动数字调零的方式来降低电源波动带来的误差。 先将1通道接地,将2通道接参考电源VCC,3通道接需要测量的值,转换开始时,先测1通道,得N0,测2...
  • 如何将PADS文件转换AD文件?

    千次阅读 2018-12-23 16:23:15
    我们遇到后缀为.PCB的文件,一般是用PADS绘制的,如果要转换AD能打开的文件,需要先使用PADS将文件导出为.asc格式(注意尽量保存成较低版本,高版本的可能会出错),然后再使用AD导入。 曾经遇到一个比较复杂的...
  • 51单片机的AD/DA转换

    万次阅读 2017-02-09 17:31:42
    一、A/D(模数)、D/A(数模)转换 (一)、引脚 AOUT:模拟输出 Vref:参考电压 AGND:模拟地 EXT:接地 OSC:悬空 SCL,SDA:IIC AIN0、AIN1、AIN2:模拟输入口 (二)、电路图 从电路图...
  • AD转换 XPT2046

    万次阅读 热门讨论 2019-11-17 20:35:41
    应用电路 引脚功能描述 控制位命令 控制字节各位描述 单端模式输入配置 差分模式输入配置 ...掉电和内部参考电压选择 ...应用电路 检测转换电位器... 要检测转换AIN3通道上模拟信号,控制字命令寄存器值为0xE4
  • 单片机A/D采样的原理

    万次阅读 多人点赞 2017-09-11 20:55:41
    在A/D转换器中,因为输入的模拟信号在时间上式连续的,而输出的数字信号代码是离散的。所以A/D转换器在进行转换时,必须在一系列选定的瞬间(时间轴上的一些规定点上)对输入的模拟信号采样保持,然后再把这些采样值...
  • 第一:AD芯片的工作几个参数:输入阻抗,是否会对运算放大器造成干扰,比如AD620要求输出接一个电阻10K的,但是我的ADS8509阻抗本身就是6.4K的,进而就会造成很大的分压。造成测的电压不准确,所以选型时一定要注意...
  • STC12C5A60S2 AD 转换详解

    万次阅读 2016-12-14 09:33:00
    STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。ADC转换过程需要17个机器周期。通过对...
  • 51单片机STC89C52 AD模数转换

    万次阅读 2013-11-11 22:59:20
    CSDA BIT P3.2 WRR BIT P3.6 RDD BIT P3.7 WELA BIT P2.7 DULA BIT P2.6 CSAD BIT P0.7 DIOLA BIT P2.5 ORG 0000H LOOP0: MOV P0,#0FFH ;关数码管显示 SETB WELA ...开始转换 CLR CS
  • AD转换的理解

    千次阅读 2016-05-29 18:42:12
    自己学习的单片机也有一段时间了,刚开始接触单片机的时候,就总是强调AD,单片机自带AD不,等一些说法,但是自己从来没有仔细想过AD的过程,只是知道是将模拟量转化为数字量,但是不知道这个采集过来的电压是2.5V,...
1 2 3 4 5 ... 20
收藏数 90,489
精华内容 36,195
关键字:

ad转换