AD9850是一种低功耗的直接数字合成器(DDS),于2003年由美国ADI公司开发出来,广泛应用于无线电、电子测量和医学成像等领域。
AD9850自带65-bits寄存器和可编程的相位调节器,可以产生高精度的正弦波和余弦波,并支持多种输出波形。其可编程的频率输出范围为0-40MHz,相位调节范围为0-360度。
在AD9850的寄存器控制中,W0表示频率寄存器的最低有效位,也就是频率分辨率的一部分。AD9850的频率寄存器是一个32位的累加器,在每个时钟周期内,其数值按照预设的频率步进进行累加,最终转化成为输出波形。
具体来讲,W0可以影响AD9850的输出精度。随着W0取值的不同,AD9850输出波形的最小分辨率也在改变。例如,当W0取1时,AD9850的最小输出分辨率为1Hz,当W0取2时,最小分辨率变成2Hz,以此类推。
AD9850的频率控制信号是由串行数据输入的方式传输进去的,W0位于16位控制字节(byte2)中的最后一位。当控制字节送入芯片后,W0的取值就确定了。如下面的代码所示,W0就是bit0,也就是最后一个二进制位:
DigitalWrite(AD9850_FQ_UD, LOW); // AD9850复位DigitalWrite(AD9850_W_CLK, LOW);
DigitalWrite(AD9850_FQ_UD, LOW); // 准备写入控制字节
for (i = 0; i < 4; ++i) {
if (control_byte & 0x01 == 1) {
DigitalWrite(AD9850_DATA, HIGH);
} else {
DigitalWrite(AD9850_DATA, LOW);
}
DigitalWrite(AD9850_W_CLK, HIGH);
DigitalWrite(AD9850_W_CLK, LOW); // 数据移位
control_byte >>= 1;
DigitalWrite(AD9850_FQ_UD, HIGH); // 确认写入
DigitalWrite(AD9850_FQ_UD, LOW); // 结束写入
以一个简单的例子来说明W0的应用。我们想要产生一个100kHz的正弦波,并且频率分辨率要达到1Hz。这时候,W0的取值应当为1,这样在100kHz的范围内,AD9850可以每1Hz输出一次正弦波。
我们可以使用Arduino控制AD9850进行如下编码:
#define AD9850_FQ_UD 13#define AD9850_W_CLK 12
#define AD9850_DATA 11
void AD9850_Setup()
pinMode(AD9850_FQ_UD, OUTPUT);
pinMode(AD9850_W_CLK, OUTPUT);
pinMode(AD9850_DATA, OUTPUT);
digitalWrite(AD9850_FQ_UD, LOW);
digitalWrite(AD9850_W_CLK, LOW);
digitalWrite(AD9850_DATA, LOW);
void AD9850_Send_Frequency(unsigned long Freq)
unsigned long long tuning_word;
byte ctrl_byte;
AD9850_Setup();
ctrl_byte = 0x00;
tuning_word = Freq * (pow(2, 32) / 125E6);
ctrl_byte = (tuning_word & 0xFF000000) >> 24; // MSB
AD9850_Write_Control(ctrl_byte);
ctrl_byte = (tuning_word & 0x00FF0000) >> 16;
AD9850_Write_Control(ctrl_byte);
ctrl_byte = (tuning_word & 0x0000FF00) >> 8;
AD9850_Write_Control(ctrl_byte);
ctrl_byte = (tuning_word & 0x000000FF);
AD9850_Write_Control(ctrl_byte); // 写入频率数据
digitalWrite(AD9850_FQ_UD, HIGH);
digitalWrite(AD9850_FQ_UD, LOW); // 确认写入
void AD9850_Write_Control(byte ctrl_byte)
byte i;
for (i = 0; i < 8; ++i) {
if (ctrl_byte & 0x80 == 0x80) {
digitalWrite(AD9850_DATA, HIGH);
} else {
digitalWrite(AD9850_DATA, LOW);
}
ctrl_byte <<= 1;
digitalWrite(AD9850_W_CLK, HIGH);
digitalWrite(AD9850_W_CLK, LOW);
}
}
在上述代码中,我们先将要输出的频率经过运算变换成为AD9850的控制字节,然后使用AD9850_Write_Control函数逐步写入,最后在AD9850_Send_Frequency函数中进行确认和复位。最终,我们就可以得到100kHz频率、1Hz分辨率的正弦波。