yanniwang

揭秘ADuC702X与ADuC706X系列全攻略之(三)----ADC

0
阅读(4236)

简介

ADuC702x

ADuC7026中集成了一个12位16路A/D转换器。此模块可在2.7~3.6V电压下工作,在时钟频率为41.78MHz时,可提供高达1MSPS的吞吐量。此模块为用户提供多通路复用器、差分跟踪保持电路、片内参考电压和模—数转换器。

ADuC706x

在ADuC706x中集成了两个独立的多通道Σ-ΔADC。主ADC是24位的,提供5通道A/D转换。辅助ADC也是24位的,最大提供8通道A/D转换。

在ADuC706x的主ADC的输入级中有一个可编程增益放大器,可以对小信号进行放大,而无需外接放大电路,主通道可以配置成两个全差分输入通道或4个单端输入通道。辅助ADC结合了一个输入缓冲器,其中两个通道的ADC拥有数字滤波,可以测量动态范围宽、频率低的信号。

注意事项

(1)关于参考电压,aduc7026可以使用内部2.5V参考电压,也可以使用外部参考,例如使用1.2V外部基准,则只需将1.2V电平连接VREF,共地即可。aduc7060可以使用内部1.2V参考电压,当需要使用外部参考时,不应高于2.5V.如需使用外部2.5V参考时,将2.5V电平接到+VREF,地接到-VREF。

(2)关于转换模式,2种芯片都支持单端或差分输入,aduc7026使用单端时将传感器输出的模拟信号接到采样接口,传感器与aduc7026共地连接即可,而aduc7060则不同,例如有些需要将传感器的地线接到ADC5。

比较

总的来说ADuC706x的ADC性能优于ADUC202X,表现在高分辨率,高转换速率,灵活的增益设置,以及滤波等多项功能,这与其应用背景也是分不开的,当然,这些功能的使用相对aduc7026对初学者来讲需要花费更多的时间

应用例子

#include <ADuC7026.h>

 

void senddata(short);

void ADCpoweron(int);

char hex2ascii(char);

 

int main (void)  {

       ADCpoweron(20000);                   // ADC上电                           

      ADCCP = 0x00;                            // 选择ADC0通道

       REFCON = 0x01;                          // 连接内部2.5V参考电压到VREF引脚

 

       GP0CON = 0x010100000;             // 在P0.7使能ECLK输出,P0.5 ADC忙

       GP4DAT = 0x04040000;                // 设定P4.2输出,LED 闪烁     

 

       GP1CON = 0x011;                     // 设置TX ,RX分别为P1.0 ,P1.1引脚

   //设置UART 波特率为9600bps  (CD=0)

       COMCON0 = 0x80;                      // 设置DLAB

       COMDIV0 = 0x88;                     

     COMDIV1 = 0x00;

     COMCON0 = 0x07;                      // 清除DLAB

       while(1)

       {

              ADCCON = 0x7E3;                // 设置ADC时钟频率为fADC/2,采样时间为16 个时钟,ADC 速率为1MSPS,工作在伪差分模式,软件启动转换。

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

              senddata (ADCDAT >> 16);   // 发送数据

              GP4DAT ^= 0x00040000;       // 补充P4.2引脚

       }

}

/******************************发送数据子程序**********************************/

void senddata(short to_send)

{

       while(!(0x020==(COMSTA0 & 0x020))){}

              COMTX = 0x0A;                   // 输出LF

       while(!(0x020==(COMSTA0 & 0x020))){}

              COMTX = 0x0D;                   // 输出CR

       while(!(0x020==(COMSTA0 & 0x020))){}          // 发送ADC0(12位)转换结果

              COMTX = hex2ascii ((to_send >> 8) & 0x0F);   // 发送低4位

       while(!(0x020==(COMSTA0 & 0x020))){}

              COMTX = hex2ascii ((to_send >> 4) & 0x0F);   // 发送中间4位

       while(!(0x020==(COMSTA0 & 0x020))){}

              COMTX = hex2ascii (to_send & 0x0F);         // 发送高4位

}

/******************将十六进制ADC转换结果换算为ASCII输出*********************/

char hex2ascii(char toconv)

{

       if (toconv<0x0A)

       {

              toconv += 0x30;

       }

       else

       {

              toconv += 0x37;

       }

       return (toconv);

}

/*******************************ADC上电子程序********************************/

void ADCpoweron(int time)

{

       ADCCON = 0x20;                     // ADC上电

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

    time--;

}

/******************************************************************************/