我在淘宝买了块ad9850的模块,用at89s52控制该模块,程序也是用的例程,为什么模块输出的方波频率跟程序中设定的频率一样,也很稳定,但是正弦波频率一直不稳定啊(输出频率越高,波动范围越大)。
下面是我写10kHz波形的程序
#include<reg52.h>
#include<intrins.h>
sbit ad9850_fq_up =P2^3; //P2.3口接ad9850的fq_up脚/PIN8
sbit ad9850_rest =P2^4; //P2.4口接ad9850的rest脚/PIN12
sbit ad9850_w_clk =P2^5; //2.5口接ad9850的w_clk脚/PIN7
sbit ad9850_bit_data =P3^7; //P3.7口接ad9850的D7脚/PIN25
//***************************************************//
// ad9850复位程序(并口) //
//---------------------------------------------------//
void ad9850_reset()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
}
//***************************************************//
// 向ad9850中写命令与数据(并口) //
//---------------------------------------------------//
void ad9850_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/125;//适合125M晶振
//如果时钟频率不为125MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w0数据
w=w0;
P3=w; //w0
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w1数据
w=(y>>24);
P3=w; //w1
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w2数据
w=(y>>16);
P3=w; //w2
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w3数据
w=(y>>8);
P3=w; //w3
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w4数据
w=(y>>=0);
P3=w; //w4
ad9850_w_clk=1;
ad9850_w_clk=0;
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
void main()
{
ad9850_reset();
ad9850_wr_parrel(0x00,10000);
while(1)
{
}
}
以下AD9850的原理图,输出幅度没有要求,我直接把模块的正弦波输出接到示波器的。
有没有哪位大神指导一下啊!!! |