连接电路如下
图中滤波器如果没有条件制作就可以省略。
有源晶振最高可接125M,那么输出最高频率为125M/2 (有采样定律可知)
写控制字部分就连接就是D0~D7与单片机的一个IO口连接,另外就是写控制端W_CLK,频率更新控制端FQ_UD,还有复位端Rest。三个端口也连接上单片机IO口。
电路连接好确定无误,就编写程序,首先掌握DDS的基本原理,这里不详细说了,最主要掌握他的频率控制字是怎么算出来的,很简单由F out=CLK * K /2^32
可得K=2^32 * F out / CLK
这里K就是需要的频率控制字用来写入芯片,F out是所要输出的频率,
CLK是芯片的时钟频率我用的有源晶振100MHz。
掌握datasheet的时序图就可以写出控制程序了
由上写出:
for(i=0;i<5;i++) //循环5次
{
DATAOUT=word[i]; //控制字输出到IO口
W_CLK=1;_nop_(); //如时序图一个上升沿使芯片读入数据word[i]
W_CLK=0;_nop_(); //
}
PQ_UD=1;_nop_(); //5个写完后,频率控制端一个上升沿,是AD9850更新频率
PQ_UD=0;_nop_();
}
这个没问题剩下的就简单了。
另外程序开始可以加个复位
RET=1;
delay_1ms(100);
W_CLK=0;
PQ_UD=0;
RET=0;
制作完成看看,是够丑的
看看波形,可能是示波器太先进了所以看起来不太平滑,但是用模拟滤波器肯定平滑,从频谱可以看出,不错够纯净
而且控制很精准,当控制输入为10MHz时,看右上角的显示10.012MHz。误差原因暂不分析,先就这水平。
没加滤波器,结果波形很数字化的感觉。
剩下的根据情况加上键盘输入和显示就OK了。
付一个程序,没有加键盘和现实的:
#include
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit W_CLK= P1^0;
sbit PQ_UD= P1^1;
sbit RET= P1^2;
uchar word[5]={0x00,0x00,0x00,0x00,0x00};
unsigned long int k=42.94967296*1500000; //15000000就是所要输出的频率值,
//若晶振不同为其他频率更改数值就行了
void chang(unsigned long int t)
{
word[1]=k>>24;
word[2]=k>>16;
word[3]=k>>8;
word[4]=k;
}
delay_1ms(uint t)
{
uint i,j;
for(i=0;i for(j=0;j<120;j++); } main() { uint i; RET=1; delay_1ms(100); W_CLK=0; PQ_UD=0; RET=0; chang(k); while(1) { for(i=0;i<5;i++) { P0=word[i]; W_CLK=1; _nop_(); W_CLK=0; _nop_(); } PQ_UD=1;_nop_(); PQ_UD=0;_nop_(); } }