yanniwang

揭秘ADuC702X与ADuC706X系列全攻略之(四)----DAC

0
阅读(3451)

ADuC702x

ADuC7026集成了4个12位电压输出的DAC,每个DAC都有一个可以驱动5 kΩ/100 pF的缓冲器。它有三个可选择的量程,0V~VREF (内部带隙2.5V参考电压),0V~DACREF和0V~AVDD。DACREF同外部的DAC参考电压是等效的,其信号的范围为0V~AVDD

 DAC0CON寄存器位描述

 

名称

描述

6

5

 

4

 

3

2

1:0

 

 

 

 

 

 

 

 

 

0 0

0 1

1 0

1 1

 

DACCLK

 

DACCLR

 

 

保留

DAC更新速率,用户置位时使用定时器1对DAC进行更新。用户清零则使用HCLK,(内核时钟)对DAC进行更新。

DAC使能位,用户设置此位使能正常的DAC操作,清除此位DAC数据寄存器将复位为0

保留,此位应设置为0

保留,此位应设置为0

DAC量程位

掉电模式,DAC为三态输出

0 − DACREF 量程

0 − VREF (2.5 V)量程

0 − AVDD 量程

 ADuC706x

ADuC706x集成了一个12位电压输出DAC。该DAC具有轨对轨电压输出缓冲能力,可驱动5kΩ/100pF负载。
    该DAC有四个可选范围:
    •0 V~VREF(内部1.2 V的带隙参考电源)
    • VREF- ~ VREF+
    •EXT_REF2- ~ EXT_REF2 +
    •0 V~AVDD
    最高信号范围为0 V至AVDD。

DAC0CON控制寄存器描述

 

名称

描述

15:10

 

DACPD

保留

9

 

DACBUFLP

DAC输出禁用(DAC为三相输出)。
清除此位,使能DAC

8

 

OPAMP

置1在低功率模式设置DAC输出缓冲区。对正常模式和运算放大器模式用于进一步的描述见电气规范。
清除此位,使能DAC的缓冲区。

7

 

OPAMP

置1放在运算放大器的模式设置DAC输出缓冲。
清除此位,使正常工作模式下使能DAC输出缓冲区。

6

 

DACBUFBYPASS

置1旁路输出缓冲区并直接发送DAC输出结果至输出引脚。
清除此位来缓冲DAC输出。

5

 

DACCLK

置1,在HCLK下降沿来临时更新DAC。
置0,在Timer1下降沿来临时更新DAC。这种模式适用于在定时器1期间那些在波形的下一个值写入DAC0DAT时波形产生。

4

 

/DACCLR

设置为0以清除DAC输出和将DACDAT置0。对此位进行写操作,则对DAC输出立即产生影响。

3

 

DACMODE

设置为1,以启用16位DAC插值模式。
设置为0,使能DAC正常的12位模式

2

 

RATE

插值模式使用。
设置为1,配置插值时钟为UCLK/16。
设置为0,配置插值时钟为UCLK/32。

1:0

1 1

1 0

0 1

0 0

DAC

Range bits

0 V~AVDD。
EXT_REF2-~ EXT_REF2 +。
VREF-~ VREF +。
0 V~VREF(1.2 V)。(内部参考源)

比较

ADUC7026和ADUC7060的DAC使用方法基本相同,只是7060的分辨率更高,这也是它在仪表领域备受青睐的原因。

应用的例子

下面举一个ADUC7026使用DAC 的例子,用于实现产生一个正弦波

#include<ADuC7026.h>

int main (void)

{

       // 在Flash/EE中制表

       const static unsigned short TableS[64] = {

      0x07FF, 0x08C8, 0x098E, 0x0A51, 0x0B0F, 0x0BC4, 0x0C71, 0x0D12,

      0x0DA7, 0x0E2E, 0x0EA5, 0x0F0D, 0x0F63, 0x0FA6, 0x0FD7, 0x0FF5,

      0x0FFF, 0x0FF5, 0x0FD7, 0x0FA6, 0x0F63, 0x0F0D, 0x0EA5, 0x0E2E,

      0x0DA7, 0x0D12, 0x0C71, 0x0BC4, 0x0B0F, 0x0A51, 0x098E, 0x08C8,

      0x07FF, 0x0736, 0x0670, 0x05AD, 0x04EF, 0x043A, 0x038D, 0x02EC,

      0x0257, 0x01D0, 0x0159, 0x00F1, 0x009B, 0x0058, 0x0027, 0x0009,

      0x0000, 0x0009, 0x0027, 0x0058, 0x009B, 0x00F1, 0x0159, 0x01D0,

      0x0257, 0x02EC, 0x038D, 0x043A, 0x04EF, 0x05AD, 0x0670, 0x0736 

};                       // 一个周期完整正弦波信号表

int   i = 0;

       DAC1CON = 0x13;       // 使能DAC,内核时钟,参考电压范围AGND~AVDD

       DAC1DAT = 0x08000000;   // 开始测量

 

       while(1)

{

         DAC1DAT = (TableS[i] << 16); 

         i++;

         i &= 0x03f;             // 循环发送上表中的64个数据

       }

       return (0);

}