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通道12位ADC。其工作电压范围为2.7V-3.6V,当时钟源频率为41.78MHz时,其转换速度最高可以达到1MSPS。同时ADC还提供给用户多通道多路复用器、微分保持器、片内参考。
ADuC7026的ADC为基于双电容DAC的12位逐次逼近转换器。通过编程配置,ADC可以工作在三种不同的输入模式下:(1)差分模式,用于小信号和平衡信号的输入;(2)单端模式,用于任何单端信号的输入;(3)伪差分模式,用于任何单端信号输入,可以较好的抑制共模信号。当工作在单端模式或伪差分模式下时,ADC可以接受的模拟输入范围为0~VREF;在差分模式下,输入信号一定要稳定在共模电压VCM附近,其范围为0V到AVDD,最大幅值为2VREF。
ADuC7026片内提供一个高精度、低漂移、出厂设定为2.5V的参考源,在使用该参考时需要将外部管脚VREF通过0.47μF接地。也可以直接连接一个外部参考。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />ADuC7026的ADC可以实现单一或连续等多种转换方式,方式选择可在初始化软件中设定。而转换的触发可以有外部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之间;
GNDREF:ADC模拟电源地参考;
REFGND:参考地;
VREF:2.5V内部参考。
6.2模拟信号输入与转换
6.2.1模拟输入的电路结构
ADuC7026芯片ADC模拟输入内部结构等效电路如图6.1所示,图中4个二极管为模拟输入提供ESD保护;电容C1为4pF,电阻R1为开关内阻,大小为100Ω左右;电容C2为ADC采样电容,经典数值为4pF。注意,这里一定要确保模拟输入不要超过模拟电源电压300mV,否则将使二极管前向导通,导通电流可达到10mA,而不会导致不可修复性的毁坏。
图6.1 等效模拟输入电路
输入为交流信号时,建议在信号输入ADuC7026之前使用RC低通滤波器滤波,以消除模拟输入信号的高频成份。在对谐波失真和信噪比要求严格的应用中,由于高阻抗的模拟输入会影响ADC的交流特性,一般接低阻抗的模拟输入。通常使用运放构成输入缓冲放大器,如图6.2和6.3所示。
图6.2 单端及伪差分输入
图6.3 差分输入
当不使用运放来放大模拟输入信号时,输入阻抗应限制在1kΩ以内。最大的模拟输入阻抗取决于总谐波失真(THD),该谐波失真必须在可容许的范围内。总的谐波失真会随着输入源阻抗的增加而增大,而ADC的性能也将变差。
6.2.2 转换操作
ADuC7026的ADC是基于两个逐次逼近容性DAC设计的,其转换过程主要包括两个阶段:采样阶段和转换阶段。下面针对输入信号的三种模式分别介绍转换操作。
(一) 差分模式
在差分模式下,差分信号的幅值为输入引脚VIN+和输入引脚VIN-输入信号的差值,即VIN+-VIN-,因此差分输入信号的最大幅值为-VREF~+VREF,即2×VREF,这里忽略了共模信号的影响。共模信号为两个输入信号的平均值,也就是两个输入电压的中间值,即(VIN++VIN-)/2,这样每一个输入信号的范围为VCMVREF/2。这一输入电压必须在外部设定,并且它的范围随着VREF而变化。
在差分模式下,代码转换发生在每一次整数LSB值的中点(即1/2LSB,3/2LSB,5/2LSB…FS-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闭合,SW1和SW2都闭合于A上,比较器保持在平衡状态,采样电容阵列充电,采集输入的差分信号。
图6.5 ADC采样阶段
当ADC启动转换,如图6.6所示,SW3断开,而SW1和SW2连接到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 |
(二)伪差分和单端模式
在伪差分或单端模式中,输入电压范围为0V到VREF,输出编码为二进制编码,转换结果1LSB=FS/4096,其中FS为满刻度电压。在VREF=2.5V时,1LSB=2.5V/4096=0.61mV。ADC每次代码的有效转换都发生在每一整数LSB值的中点,即1/2LSB、3/2LSB、5/2LSB、…、FS-3/2LSB,输入/输出转换特征如图6.7所示。
图6.7 伪差分或单端模式下ADC转换
在伪差分模式中,如图6.8所示,模拟输入负通道(channel-)连接在ADuC7026的VIN-上,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转换时序
ADuC7026的ADC转换时序如图6.10所示。用户可以通过配置控制寄存器ADCCON来控制ADC时钟速度和转换所需时钟个数。默认情况下,所需要的转换时间是八个时钟周期,时钟为两分频。附加时钟个数可以被设定为19,这样采样频率为774KSPS。而温度传感器的转换,ADC所需时间被自动设定为16个时钟,并且ADC设为32分频。
图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 输入端选择寄存器ADCCP、ADCCN
输入端选择寄存器共两个,即ADCCP、ADCCN,分别控制输入信号正相输入端和反相输入端。在差分输入的情况下,两寄存器分别控制控制输入差分信号的正反相端的来源;在伪差分情况下,输入信号的正相端由ADCCP寄存器控制选择,反相端直接连接到ADCNEG管脚;在单端输入情况下,输入信号的正相端由ADCCP寄存器控制选择,反相端直接在芯片内部连接到模拟地。ADCCP和ADCCN两寄存器各位功能见表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
ADCSTA是ADC的状态寄存器,指示ADC转换结果的准备好状态。ADCSTA寄存器只有一个位Bit 0,该位反映ADC的转换状态。在ADC转换完成后该位置1,并且产生ADC中断;当读取ADCDAT数据寄存器时,该位自动清零。在ADC进行转换时,也可以通过外部ADCBUSY引脚读取ADC的工作状态。在转换期间,该引脚上为高电平;当转换结束后,ADCBUSY引脚变为低电平。如果使能ADCCON寄存器对应位,则可以在P0.5管脚输出ADCBUSY的状态。
6.3.4 ADC数据寄存器ADCDAT
ADCDAT为32位数据寄存器,里面存放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
ADCGN和ADCOF都是10位校正寄存器。二者分别控制增益校正和偏移校正。
一般情况下,在ADCOF和ADCGN参数寄存器为出厂设定值时,单次操作的输出端点误差和线性度可以达到较优的效果。如果需要进行系统校正,可以通过修改偏移和增益系数的出厂值来改善端点误差。但任何对ADCOF和ADCGN出厂值的修改都会降低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的片内带隙参考源,它可用于ADC和DAC,也可以输出到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; // 配置 tx和rx引脚到 P1.0和P1.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; // 配置 tx和rx引脚到 P1.0和P1.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的转换结果的稳定性和精度稍差。这是由于外部直流电压的稳定性和精度比内部电压基准源稍差所造成的,但这属于合理偏差范围内并不影响应用。
文章评论(0条评论)
登录后参与讨论