×
单片机 > 单片机程序设计 > 详情

AD9850与单片机波形生成程序及设计

发布时间:2020-06-08 发布时间:
|

 

概述=================================================
AD9850/AD9851模块是采用ADI应用最广泛的DDS(AD9850和AD9851)制作的模块。ADI的性能就不用多说了。模块主要参考AD9850和AD9851的资料做的。
  主要功能特点:
  *  模块能够输出正弦波和方波,2个正弦波和2个方波输出。

AD9850: 0-40MHz

AD9851: 0-70MHz

频率在20-30MHz后谐波越来越大,波形会越来越不干净。
方波:     0-1MHz
  *  采用70MHz的低通滤波器,使波形的SN比更好
  *  比较器的基准输入端电压由可变电阻产生,调节该电阻可以得到不同的占空比方波
    注:在输出正弦波的情况下,接线到方波输出的IO口,直接调节蓝色的电位器可输出方波。
  * AD9850模块采用125MHz的有源晶振,AD9851模块采用30MHZ的有源晶振
AD9850和AD9851主要区别
  *  AD9850的时钟频率最高125MHz,AD9851的时钟频率最高180MHz。输出最高频率AD9851要比AD9850高。
  * AD9850没有6倍频,AD9851有


功能框图============================================================

1:下载对应的HEX程序

   见AD9850_1_V4_C程序文件夹

   OUT1和OUT2端能测试到对应输出1KHz信号。如需测试方波,调节可变电位器,可在方波1和方波2端测试到方波。


单片机源程序如下:

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

//函数1:           ad9851_reset()                    //

//函数2:           ad9851_reset_serial()             //

//函数3:           ad9851_wr_parrel(unsigned char w0,double frequence)//

//函数4:           ad9851_wr_serial(unsigned char w0,double frequence)//

//版本:              V1.1                            //

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

//                  子程序说明                       //

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

//函数1:  ad9851_reset()

//        复位ad9851,之后为并口写入模式        

//函数2:  ad9851_reset_serial()

//        复位ad9851,之后为串口写入模式

//函数3:  ad9851_wr_parrel(unsigned char w0,double frequence)

//        并口写ad9851数据,w0为ad9851中w0的数据,frequence

//        为写入的频率        

//函数4:  ad9851_wr_serial(unsigned char w0,double frequence)

//        串口写ad9851数据,w0为ad9851中w0的数据,frequence

//        为写入的频率        

//需定义的位:

         //ad9851_w_clk    ;

         //ad9851_fq_up    ;

         //ad9851_rest     ;

         //ad9851_bit_data ;

//例:

         //sbit ad9851_w_clk    =P2^2;

         //sbit ad9851_fq_up    =P2^1;

         //sbit ad9851_rest     =P2^0;

         //sbit ad9851_bit_data =P1^7;

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

//                 写数据说明                        //

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

//写数据例:

//       ad9851_reset()

//       wr_lcd02_data(unsigned char x)

//       ad9851_wr_parrel(0x01,1000)

//       ad9851_wr_serial(0x01,1000)

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

//---------------------------------------------------//

//                   程序                            //

//---------------------------------------------------//

# include

# include

# include

sbit ad9851_w_clk    =P2^2;  //P2.2口接AD9851的w_clk脚/PIN7

sbit ad9851_fq_up    =P2^1;  //P2.1口接AD9851的fq_up脚/PIN8

sbit ad9851_rest     =P2^0;  //P2.0口接AD9851的rest脚/PIN12

sbit ad9851_bit_data =P1^7;  //P1.7口接AD9851的D7脚/PIN25

//P1为8位数据口

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

//              ad9851复位(并口模式)                 //

//---------------------------------------------------//

void ad9851_reset()

{

ad9851_w_clk=0;

ad9851_fq_up=0;

//rest信号

ad9851_rest=0;

ad9851_rest=1;

ad9851_rest=0;

}

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

//              ad9851复位(并口模式)                 //

//---------------------------------------------------//

void ad9851_reset_serial()

{

ad9851_w_clk=0;

ad9851_fq_up=0;

//rest信号

ad9851_rest=0;

ad9851_rest=1;

ad9851_rest=0;

//w_clk信号

ad9851_w_clk=0;

ad9851_w_clk=1;

ad9851_w_clk=0;

//fq_up信号

ad9851_fq_up=0;

ad9851_fq_up=1;

ad9851_fq_up=0;

}

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

//          向ad9851中写命令与数据(并口)             //

//---------------------------------------------------//

void ad9851_wr_parrel(unsigned char w0,double frequence)

{

unsigned char w;

long int y;

double x;

//计算频率的HEX值

x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)

//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!

frequence=frequence/1000000;

frequence=frequence*x;

y=frequence;

//写w0数据

w=w0;   

P1=w;      //w0

ad9851_w_clk=1;

ad9851_w_clk=0;

//写w1数据

w=(y>>24);

P1=w;      //w1

ad9851_w_clk=1;

ad9851_w_clk=0;

//写w2数据

w=(y>>16);

P1=w;      //w2

ad9851_w_clk=1;

ad9851_w_clk=0;

//写w3数据

w=(y>>8);

P1=w;      //w3

ad9851_w_clk=1;

ad9851_w_clk=0;

//写w4数据

w=(y>>=0);

P1=w;      //w4

ad9851_w_clk=1;

ad9851_w_clk=0;

//移入始能

ad9851_fq_up=1;

ad9851_fq_up=0;

}

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

//          向ad9851中写命令与数据(串口)             //

//---------------------------------------------------//

void ad9851_wr_serial(unsigned char w0,double frequence)

{

unsigned char i,w;

long int y;

double x;

//计算频率的HEX值

x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)

//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz  !!!

frequence=frequence/1000000;

frequence=frequence*x;

y=frequence;

//写w4数据

w=(y>>=0);

for(i=0;i<8;i++)

{

ad9851_bit_data=(w>>i)&0x01;

ad9851_w_clk=1;

ad9851_w_clk=0;

}

//写w3数据

w=(y>>8);

for(i=0;i<8;i++)

{

ad9851_bit_data=(w>>i)&0x01;

ad9851_w_clk=1;

ad9851_w_clk=0;

}

//写w2数据

w=(y>>16);

for(i=0;i<8;i++)

{

ad9851_bit_data=(w>>i)&0x01;

ad9851_w_clk=1;

ad9851_w_clk=0;

}

//写w1数据

w=(y>>24);

for(i=0;i<8;i++)

{

ad9851_bit_data=(w>>i)&0x01;

ad9851_w_clk=1;

ad9851_w_clk=0;

}

//写w0数据

w=w0;   

for(i=0;i<8;i++)

{

ad9851_bit_data=(w>>i)&0x01;

ad9851_w_clk=1;

ad9851_w_clk=0;

}

//移入始能

ad9851_fq_up=1;

ad9851_fq_up=0;

}

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

//                   测试程序1000Hz                  //

//---------------------------------------------------//

main()

{

P0=0x00;

P1=0x00;

P2=0x00;

P3=0x00;

//---------------------------------------------------//

……………………




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍