原创 ADuC7026的模数转换器

2009-5-30 11:08 2853 1 1 分类: MCU/ 嵌入式

6  ADC<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


6.1 ADuC7026 ADC简介


ADuC7026的模拟-数字转换器主要特点:


·12位精度;


·±0.5LSB精确度


·16通道;


·转换速度最高可达1MSPS


·7种可编程触发方式;


·输入全差分、伪差分和单端三种模式;


·多转换结束中断输出方式;


·内置2.5V参考源。


ADuC7026的模拟-数字转换器(ADC)集成了一个快速16通道12ADC。其工作电压范围为2.7V-3.6V,当时钟源频率为41.78MHz时,其转换速度最高可以达到1MSPS。同时ADC还提供给用户多通道多路复用器、微分保持器、片内参考。


ADuC7026ADC为基于双电容DAC12位逐次逼近转换器。通过编程配置,ADC可以工作在三种不同的输入模式下:(1)差分模式,用于小信号和平衡信号的输入;(2)单端模式,用于任何单端信号的输入;(3)伪差分模式,用于任何单端信号输入,可以较好的抑制共模信号。当工作在单端模式或伪差分模式下时,ADC可以接受的模拟输入范围为0~VREF;在差分模式下,输入信号一定要稳定在共模电压VCM附近,其范围为0VAVDD,最大幅值为2VREF


ADuC7026片内提供一个高精度、低漂移、出厂设定为2.5V的参考源,在使用该参考时需要将外部管脚VREF通过0.47μF接地。也可以直接连接一个外部参考。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />ADuC7026ADC可以实现单一或连续等多种转换方式,方式选择可在初始化软件中设定。而转换的触发可以有外部CONVSTART引脚、片内PLA的输出、定时器0或定时器1的溢出等多种触发方式,每种方式都可以产生重复触发而连续进行多次ADC转换。


另外从片内带宽参考输出的与绝对温度成比例的电压也可以通过前置ADC多路复用器连接到ADC模拟输入通道,这样就可以很方便的形成一个内部温度传感器通道,用于测量死区温度,测量精度为<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3


ADuC7026芯片上同模数转换器相关的管脚主要有:


ADC0~ADC15:模拟信号输入管脚;


ADCNEG:偏压输入,伪差分模式下的负输入端,应连接到输入通道的反相输入端。偏压点在0~1V之间;


GNDREFADC模拟电源地参考;


REFGND:参考地;


VREF2.5V内部参考。


6.2模拟信号输入与转换


6.2.1模拟输入的电路结构


ADuC7026芯片ADC模拟输入内部结构等效电路如图6.1所示,图中4个二极管为模拟输入提供ESD保护;电容C14pF,电阻R1为开关内阻,大小为100Ω左右;电容C2ADC采样电容,经典数值为4pF。注意,这里一定要确保模拟输入不要超过模拟电源电压300mV,否则将使二极管前向导通,导通电流可达到10mA,而不会导致不可修复性的毁坏。



6.1 等效模拟输入电路


输入为交流信号时,建议在信号输入ADuC7026之前使用RC低通滤波器滤波,以消除模拟输入信号的高频成份。在对谐波失真和信噪比要求严格的应用中,由于高阻抗的模拟输入会影响ADC的交流特性,一般接低阻抗的模拟输入。通常使用运放构成输入缓冲放大器,如图6.26.3所示。



6.2 单端及伪差分输入



6.3 差分输入


当不使用运放来放大模拟输入信号时,输入阻抗应限制在1kΩ以内。最大的模拟输入阻抗取决于总谐波失真(THD),该谐波失真必须在可容许的范围内。总的谐波失真会随着输入源阻抗的增加而增大,而ADC的性能也将变差。


6.2.2 转换操作


ADuC7026ADC是基于两个逐次逼近容性DAC设计的,其转换过程主要包括两个阶段:采样阶段和转换阶段。下面针对输入信号的三种模式分别介绍转换操作。


(一) 差分模式


在差分模式下,差分信号的幅值为输入引脚VIN+和输入引脚VIN-输入信号的差值,即VIN+-VIN-,因此差分输入信号的最大幅值为-VREF~+VREF,即2×VREF,这里忽略了共模信号的影响。共模信号为两个输入信号的平均值,也就是两个输入电压的中间值,即(VIN++VIN-/2,这样每一个输入信号的范围为VCMVREF/2。这一输入电压必须在外部设定,并且它的范围随着VREF而变化。


在差分模式下,代码转换发生在每一次整数LSB值的中点(即1/2LSB3/2LSB5/2LSBFS-3/2LSB),理想的输入/输出转换特征如图6.4所示。转换输出编码1LSB=2 VREF/4096,当VREF=2.5V时,1LSB=2×2.5V/4096=1.22mV。输出结果为12位,其中最高位为符号位。



6.4 差分模式下ADC转换


在信号采样阶段,如图6.5所示,SW3闭合,SW1SW2都闭合于A上,比较器保持在平衡状态,采样电容阵列充电,采集输入的差分信号。



6.5 ADC采样阶段


ADC启动转换,如图6.6所示,SW3断开,而SW1SW2连接到B上。这使得比较器变得不平衡。一旦转换开始,两个输入将会断开。控制逻辑和电荷重分配DAC会加上或减去采样电容阵列中的电荷数量,使得比较器恢复到平衡状态。当比较器重新平衡后,转换就已经完成,控制逻辑产生ADC的输出结果代码。注意:这里驱动VIN+VIN-引脚的输出源阻抗一定要匹配,否则由于两个输入的调节时间不同会产生转换误差。



6.6 ADC转换阶段


另外在全差分工作模式下,共模电压VCM有严格的限制,它的大小取决于参考源和输入电压,表6.1给出了不同条件下VCM的最大值和最小值。


6.1 VCM的范围




AVDD


VREF


VCM Min


VCM Max


信号峰峰值


3.3V


2.5V


1.25V


2.05V


2.5V


2.048V


1.024V


2.276V


2.048V


1.25V


0.75V


2.55V


1.25V


3.0V


2.5V


1.25V


1.75V


2.5V


2.048V


1.024V


1.976V


2.048V


1.25V


0.75V


2.25V


1.25V


(二)伪差分和单端模式


在伪差分或单端模式中,输入电压范围为0VVREF,输出编码为二进制编码,转换结果1LSB=FS/4096,其中FS为满刻度电压。在VREF=2.5V时,1LSB=2.5V/4096=0.61mVADC每次代码的有效转换都发生在每一整数LSB值的中点,即1/2LSB3/2LSB5/2LSBFS-3/2LSB,输入/输出转换特征如图6.7所示。



6.7 伪差分或单端模式下ADC转换


在伪差分模式中,如图6.8所示,模拟输入负通道(channel-)连接在ADuC7026VIN-上,SW2开关在A(Channel-)B(VREF)之间进行切换,一般情况下VIN-要接地或者接一较低电压。VIN+上的输入信号的范围为VIN-~VREF+ VIN-。注意这里VIN-一定要选择恰当,不要使VREF+ VIN-超过AVDD



6.8 ADC伪差分模式


在单端模式中,如图6.9所示,模拟输入负通道内部直接接地,VIN-引脚悬空。VIN+引脚上的输入信号的范围为0V~VREF



6.9 ADC单端模式


6.2.3转换时序


ADuC7026ADC转换时序如图6.10所示。用户可以通过配置控制寄存器ADCCON来控制ADC时钟速度和转换所需时钟个数。默认情况下,所需要的转换时间是八个时钟周期,时钟为两分频。附加时钟个数可以被设定为19,这样采样频率为774KSPS。而温度传感器的转换,ADC所需时间被自动设定为16个时钟,并且ADC32分频。



6.10 ADC时序


6.3 ADC相关寄存器


ADuC7026中与ADC相关的寄存器共有9个,包括:控制寄存器ADCCON、正相输入端选择寄存器ADCCP、反相输入端选择寄存器ADCCN、状态寄存器ADCSTA、数据寄存器ADCDAT、复位寄存器ADCRST、增益校正寄存器ADCGN、偏移校正寄存器ADCOF、参考源控制寄存器REFCON。各寄存器地址及访问信息如表6.2所示。


6.2 ADC相关寄存器




名称


地址


默认值


访问


ADCCON


0xFFFF0500


0x0600


R/W


ADCCP


0xFFFF0504


0x00


R/W


ADCCN


0xFFFF0508


0x01


R/W


ADCSTA


0xFFFF050C


0x00


R


ADCDAT


0xFFFF0510


0x00000000


R


ADCRST


0xFFFF0514


0x00


R/W


ADCGN


0xFFFF0530


0x0200


R/W


ADCOF


0xFFFF0534


0x0200


R/W


REFCON


0xFFFF048C


0x00


R/W


下面依次介绍每个寄存器的位信息和使用方法。


6.3.1 控制寄存器ADCCON


ADCCON是一个16位的ADC控制寄存器,用户可以通过它使能ADC外设,选择ADC的工作模式(单端模式,伪差分模式,全差分模式)和转换类型等。该寄存器各位功能如表6.3所示。


6.3 ADCCON各位功能描述






描述


15:13


----


保留


12:10


 


 


 


 


 


----


ADC时钟速度选择


000


fADC/1。当外部时钟小于41.78MHz时,可以得到1MSPS


001


fADC/2(默认值)


010


fADC/4


011


fADC/8


100


fADC/16


101


fADC/32


9:8


 


 


 


 


----


ADC转换时间


00


2个时钟


01


4个时钟


10


8个时钟(默认值)


11


16个时钟


7


 


----


 


启动转换使能。置1启动任意类型的转换;清0转换不使能(清0该位不能使正进行的连续转换停止)


6


----


使能ADCBUSY。置1使能ADCBUSY引脚;清0则不使能该引脚


5


 


----


ADC电源控制。置1,置ADC于正常模式(ADC在上电至少5


 


微秒之后才能正确转换);清零ADC进入掉电模式


4:3


 


 


 


 


----


转换模式


00


单端模式


01


全差分模式


10


伪差分模式


11


保留


2:0


----


转换触发方式选择


000


CONVSTART引脚输入作为转换触发信号


001


定时器1的输出作为转换触发信号


010


定时器0的输出作为转换触发信号


011


 


 


单次软件转换。在转换后设为000(为了避免CONVSTART引脚再一次触发转换,ADDCON的第7位在启动单独软件转换后应清零)


100


连续软件转换


101


PLA输出作为转换触发信号


其他


保留


例子:


ADCCON=0x0DA4; // ADC时钟8分频;转换时间4个时钟周期;使能转换,电压为正


常模式;转换模式为单端模式,连续软件转换


6.3.2 输入端选择寄存器ADCCPADCCN


输入端选择寄存器共两个,即ADCCPADCCN,分别控制输入信号正相输入端和反相输入端。在差分输入的情况下,两寄存器分别控制控制输入差分信号的正反相端的来源;在伪差分情况下,输入信号的正相端由ADCCP寄存器控制选择,反相端直接连接到ADCNEG管脚;在单端输入情况下,输入信号的正相端由ADCCP寄存器控制选择,反相端直接在芯片内部连接到模拟地。ADCCPADCCN两寄存器各位功能见表6.4、表6.5


6.4 ADCCP控制位描述






描述


7:5


----


保留


4:0


----


正相输入端选择位


00000


ADC0


00001


ADC1


00010


ADC2


00011


ADC3


00100


ADC4


00101


ADC5


00110


ADC6


00111


ADC7


01000


ADC8


01001


ADC9


01010


ADC10


01011


ADC11


01100


DAC0/ADC12


01101


DAC1/ADC13


01110


DAC2/ADC14


01111


DAC3/ADC15


10000


温度传感器


10001


AGND(自诊断特征)


10010


内部参考源(自诊断特征)


10011


AVDD/2


其他


保留


 


6.5 ADCCP控制位描述






描述


7:5


----


保留


4:0


----


反相输入端选择位


00000


ADC0


00001


ADC1


00010


ADC2


00011


ADC3


00100


ADC4


00101


ADC5


00110


ADC6


00111


ADC7


01000


ADC8


01001


ADC9


01010


ADC10


01011


ADC11


01100


DAC0/ADC12


01101


DAC1/ADC13


01110


DAC2/ADC14


01111


DAC3/ADC15


10000


内部参考(自诊断特征)


其他


保留


6.3.3 ADC状态寄存器ADCSTA


ADCSTAADC的状态寄存器,指示ADC转换结果的准备好状态。ADCSTA寄存器只有一个位Bit 0,该位反映ADC的转换状态。在ADC转换完成后该位置1,并且产生ADC中断;当读取ADCDAT数据寄存器时,该位自动清零。在ADC进行转换时,也可以通过外部ADCBUSY引脚读取ADC的工作状态。在转换期间,该引脚上为高电平;当转换结束后,ADCBUSY引脚变为低电平。如果使能ADCCON寄存器对应位,则可以在P0.5管脚输出ADCBUSY的状态。


6.3.4 ADC数据寄存器ADCDAT


ADCDAT32位数据寄存器,里面存放12位的ADC转换结果数据ADC每次转换完后,会把一个12位的数据存储在这个32位的ADC数据寄存器中。ADC数据寄存器前四位是符号位,12位转换结果数据从最低位到最高位依次存放在寄存器中的16位到27位,存储格式如图6.11所示。注意,在全差分模式下,数据以补码形式存储,而在伪差分和单端模式中,数据直接以二进制格式表示。数据寄存器DACxDAT存储格式与此相同。



6.11 ADC数据格式


6.3.5 ADC复位寄存器ADCRST


ADCRST可以复位ADC,通过向ADCRST中写入任意数据,可恢复所有ADC寄存器到默认值。


6.3.6 增益校正寄存器ADCGN、偏移校正寄存器ADCOF


ADCGNADCOF都是10位校正寄存器。二者分别控制增益校正和偏移校正。


一般情况下,在ADCOFADCGN参数寄存器为出厂设定值时,单次操作的输出端点误差和线性度可以达到较优的效果。如果需要进行系统校正,可以通过修改偏移和增益系数的出厂值来改善端点误差。但任何对ADCOFADCGN出厂值的修改都会降低ADC的线性性能。


在校正系统偏移误差时,将ADC输入通道连接在AGND上,用软件控制实现连续转换。在转换过程中不断修改ADCOF的值,直到ADC转换结果数据ADCDAT寄存器值从0变为1。如果ADCDAT中的值大于1,应该降低ADCOF中的值直到ADCDAT寄存器值从0变为1。这种数字化校正偏移误差的分辨率可以达到0.25LSB,偏移范围可以达3.125%×VREF


当校正系统增益误差时,将ADC输入通道连接在VREF上,用软件控制实现连续转换。在转换过程中不断修改ADCGN的值,直到ADC转换结果数据ADCDAT寄存器值从4094变为4095。如果ADCDAT中的值小于4095,应该增加ADCGN中的值直到ADCDAT寄存器值从4094变为4095。同偏移误差校正一样,这种数字化校正偏移误差的分辨率也可以达到0.25LSB,偏移范围也可以达3.125%×VREF


6.3.7 参考源控制寄存器REFCON


ADuC7026片内置有一个2.5V的片内带隙参考源,它可用于ADCDAC,也可以输出到VREF引脚上。当采用内部参考源时,外部VREF引脚与AGND之间必须接上0.47uF的电容,以确保ADC转换时的稳定性和快速响应。片内参考源也可以输出作为系统其它电路的参考源。但是由于VREF输出的驱动能力较低,一般在作为外部电路参考时需要连接一个外部缓冲器;在使用外部参考源时,可以通过软件编程设置,使外部参考从VREF输入。内外参考源的选择可以通过写带隙参考源寄存器REFCON来实现。该寄存器共8位,各位功能描述如表6.6


6.6 REFCON寄存器各位功能




功能


7:2


保留


1


 


内部参考源掉电使能。置1内部参考源进入掉电模式,使用外部参考源;清0内部参考源进入正常工作模式,则内部参考源用于ADC转换。


0


内部参考输出使能。置1为内部2.5V参考源接在VREF上输出,参考源可用于外部组件,但需要增加缓冲;清0为内部2.5V参考源断开与VREF的连接,管脚上不输出。


6.4 应用实例


6.4.1 实例1


本实例完成的功能是对内部2.5v参考电压源进行ADC转换,并将转换结果通过串口发送到计算机显示。因此需要用到串行通信,具体内容可参考UART实例部分。


注意:名为serial.c的文件一定要在工程中。


实验参考程序清单如下:


#include < AnalogDevices/ioaduc7026.h >


#include<stdio.h>


void ADCpoweron(int time)


{


       ADCCON = 0x20;                        //  ADC上电启动


       while (time >=0)                             // 等待 ADC 完全上电


  time--;


}


void SysClkInit(void)


{


 PLLKEY1=0xAA;


 PLLCON=0x01;   //PLL配置 


 PLLKEY2=0x55;


 POWKEY1=0x01;


 POWCON=0x00;  //CPU时钟配置为41.78MHz


 POWKEY2=0xF4;


}


unsigned long int   i = 0;


int a="1";


unsigned short int num[3]; // 注意:一定要定义为整型数组


float b; // 变量b用于存放最后的电压值,因其为小数形式,所以b必须为实型。


void main (void) 


{


       SysClkInit();                    // CPU时钟初始化


       ADCpoweron(20000);                     // ADC上电                   


      ADCCP = 0x12;                           // 选择内部2.5v参考源


       REFCON = 0x01;                           // 连接 2.5V 参考到 Vref 引脚


       GP1CON = 0x011;                        // 配置 txrx引脚到 P1.0P1.1


        // 配置 UART 波特率为 115200 (CD=0)


       COMCON0 = 0x80;                       // 置位 DLAB


       COMDIV0 = 0x00B;                       // 配置波特率


   COMDIV1 = 0x00;


   COMCON0 = 0x07;                       // 清空 DLAB


       while(a)


       { ADCCON = 0x7E3; // ADC 配置, fADC/2 time = 16 clocks => ADC Speed = 1MSPS,使能启动转换,使能ADCBusy,单次软件转换,ADC工作在正常模式。


         while (!ADCSTA){}                     // 等待转换结束


         num=(ADCDAT>>16);     // 将转换值存到数组中


         i++;


         if(i==5)


         {i =0 ;a=0;}   


       }


       for(i=0;i<5;i++)


       { b="num"*2.5/4096;  // 通过公式转换为电压值输出


        printf("%0.3f\n",b);


       }


}


配合UART使用,可在计算机中看到如下显示结果:


0.000


2.499


2.499


2.499


2.499


6.4.2 实例2


本实例完成的功能是对外部直流电压进行ADC转换,并将转换结果通过串口发送到计算机显示。实验板上该部分的连接图如图6.12所示。



6.12 ADC结构图


       从图中所示可知通过调节电位器可以调整ADC0的输入电压,但注意不能超过2.5V,因为ADC通道的电压参考为2.5V。本例选择调整电位器为2.5V。做实验前需将J3跳线。


注:ADC1的连接结构图与ADC0完全一样,做实验时只需将程序中转换连接通道改为1通道即可,同时将J4跳线。


实验参考程序清单如下:


#include < AnalogDevices/ioaduc7026.h >


#include<stdio.h>


void ADCpoweron(int time)


{


       ADCCON = 0x20;                        // ADC上电启动


       while (time >=0)                             // 等待ADC完全上电


  time--;


}


void delay(int lengh)


{


  while(lengh>0)


    lengh--;


}


void SysClkInit(void)


{


 PLLKEY1=0xAA;


 PLLCON=0x01;   //PLL配置 


 PLLKEY2=0x55;


 POWKEY1=0x01;


 POWCON=0x00;  //CPU时钟配置为41.78MHz


 POWKEY2=0xF4;


}


unsigned long int   i = 0;


int a="1";


float num[4];


float b;


void main ()  {


       SysClkInit(); 


       ADCpoweron(20000);                     // ADC上电                                                               


      ADCCP = 0x00;                          // 连接ADC0


       GP1CON = 0x011;                    // 配置 txrx引脚到 P1.0P1.1


        // 配置 UART 波特率为 115200 (CD=0)


       COMCON0 = 0x80;                       // 置位DLAB


       COMDIV0 = 0x0B;                         // 配置波特率


   COMDIV1 = 0x00;


   COMCON0 = 0x07;                       // 清空DLAB


       while(a)


       {


ADCCON = 0x7E3;              // ADC 配置, fADC/2 time = 16 clocks => ADC Speed = 1MSPS,使能启动转换,使能ADCBusy,单次软件转换,ADC工作在正常模式。


   


         while (!ADCSTA){}                     // 等待转换结束


         num=(ADCDAT>>16);     // 将转换值存到数组中


         i++;


         if(i==4)


         {a=0;}   


       }


       for(i=0;i<4;i++)


       {


        b=num*2.5/4096;           // 通过公式转换为电压值输出


        printf("%0.3f\n",b);


       }


}


配合UART使用,可在计算机中看到如下显示结果:


2.492


2.503


2.496


2.491


       与实例1的结果相比较不难看出,实例2的转换结果的稳定性和精度稍差。这是由于外部直流电压的稳定性和精度比内部电压基准源稍差所造成的,但这属于合理偏差范围内并不影响应用。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条