历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2019年09月06日 | 基于AD9854个和MSP430的波形发生器

2019-09-06 来源:eefocus

AD9854是AD公司推出的DDS波形发生器,可以产生正弦波、方波和调幅波等。亲测,使用20MHz的晶振,可以产生高达60MHz的稳定波形。


#include

#include"ad9854dds.h"

#define uint  unsigned int

#define uchar unsigned char

#define ulong unsigned long

//ulong  Freq_mult_ulong;

//double Freq_mult_doulle;

void DelayXms(unsigned int i);

//extern uchar FreqWord[6];

 

int main( void )

{

 

   double f = 1000000.0;

   unsigned int i;

   // Stop watchdog timer to prevent time out reset

   WDTCTL = WDTPW + WDTHOLD;

 

   AD9854_Init();            //波形发生器初始化

 

   while(1){

     for(i=1;i<60;i++){

       

        AD9854_SetSine(f*i,4000); //产生xxMHz正弦信号

      DelayXms(8000);

     }

  }

  return 0;

}

void DelayXms(unsigned int i){

    unsigned int j;

    for( ; i>0; i--){

      for(j=0;j<200;j++); 

    }

  

}

ad9854.c源文件如下:

#include

#include"ad9854dds.h"

ulong  Freq_mult_ulong  = 1005268;

double Freq_mult_doulle = 1005267.773966629;

uchar FreqWord[6]; //6个字节频率控制字

//================================================================= 

// 函数名称 :void delay (uint us)

// 函数功能 :us级延时,大概2~4 us

// 入口参数 :us  延时时间的长短

// 出口参数 :无

//================================================================= 

//====================================================================================

//函数名称:void AD9854_Init(void)

//函数功能:AD9854初始化

//入口参数:无

//出口参数:无

//====================================================================================

void AD9854_Init(void)

{

        DIROUT_AD9854_DataBus;

        DIROUT_AD9854_AdrBus;

        DIROUT_RD;

        DIROUT_WR;

        DIROUT_RST;

        DIROUT_UDCLK;

SET_9854WR;//将读、写控制端口设为无效

        SET_9854RD;

        CLR_9854UDCLK;

        SET_9854RST;                 //复位AD9854

        CLR_9854RST;

 

AD9854_WR_Byte(0x1d,0x10);     //关闭比较器

AD9854_WR_Byte(0x1e,CLK_Set);    //设置系统时钟倍频            

AD9854_WR_Byte(0x1f,0x00);    //设置系统为模式0,由外部更新

AD9854_WR_Byte(0x20,0x60);    //设置为可调节幅度,取消插值补偿

 

SET_9854UDCLK;                     //更新AD9854输出

        CLR_9854UDCLK;

}

//====================================================================================

//函数名称:void Freq_convert(long Freq)

//函数功能:正弦信号频率数据转换

//入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2

//出口参数:无   但是影响全局变量FreqWord[6]的值

//说明:   该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK

//         得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK

//         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]

//====================================================================================

void Freq_convert(long Freq)   

{

    ulong FreqBuf;

    ulong Temp=Freq_mult_ulong;           

    uchar Array_Freq[4];      //将输入频率因子分为四个字节

    Array_Freq[0]=(uchar)Freq;

    Array_Freq[1]=(uchar)(Freq>>8);

    Array_Freq[2]=(uchar)(Freq>>16);

    Array_Freq[3]=(uchar)(Freq>>24);

 

    FreqBuf=Temp*Array_Freq[0];                  

    FreqWord[0]=FreqBuf;    

    FreqBuf>>=8;

 

    FreqBuf+=(Temp*Array_Freq[1]);

    FreqWord[1]=FreqBuf;

    FreqBuf>>=8;

 

    FreqBuf+=(Temp*Array_Freq[2]);

    FreqWord[2]=FreqBuf;

    FreqBuf>>=8;

 

    FreqBuf+=(Temp*Array_Freq[3]);

    FreqWord[3]=FreqBuf;

    FreqBuf>>=8;

 

    FreqWord[4]=FreqBuf;

    FreqWord[5]=FreqBuf>>8;

}  

//====================================================================================

//函数名称:void AD9854_SetSine(ulong Freq,uint Shape)

//函数功能:AD9854正弦波产生程序

//入口参数:Freq   频率设置,取值范围为0~(1/2)*SYSCLK

//         Shape  幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大 

//出口参数:无

//====================================================================================

void AD9854_SetSine(ulong Freq,uint Shape)

{

uchar count;

uchar Adress;

 

Adress = 0x04;                        //选择频率控制字地址的初值

 

Freq_convert(Freq);            //频率转换

 

for(count=6;count>0;)           //写入6字节的频率控制字  

    {

AD9854_WR_Byte(Adress++,FreqWord[--count]);

    }

AD9854_WR_Byte(0x21,Shape>>8);   //设置I通道幅度

AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8);   //设置Q通道幅度

AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

 

SET_9854UDCLK;                    //更新AD9854输出

        CLR_9854UDCLK;

}

//====================================================================================

//函数名称:void Freq_doublt_convert(double Freq)

//函数功能:正弦信号频率数据转换

//入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2

//出口参数:无   但是影响全局变量FreqWord[6]的值

//说明:   有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数,

//         其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK

//         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]

//注意:   该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确

//         谷雨建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq)

//====================================================================================

void Freq_double_convert(double Freq)   

{

   ulong Low32;

   uint  High16;

    double Temp=Freq_mult_doulle;                //23ca99为2的48次方除以120M

   Freq*=(double)(Temp);

// 1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295

   High16 = (int)(Freq/4294967295);                  //2^32 = 4294967295

   Freq -= (double)High16*4294967295;

   Low32 = (ulong)Freq;

 

    FreqWord[0]=Low32;      

    FreqWord[1]=Low32>>8;

    FreqWord[2]=Low32>>16;

    FreqWord[3]=Low32>>24;

    FreqWord[4]=High16;

    FreqWord[5]=High16>>8;

//====================================================================================

//函数名称:void AD9854_SetSine_double(double Freq,uint Shape)

//函数功能:AD9854正弦波产生程序

//入口参数:Freq   频率设置,取值范围为0~1/2*SYSCLK

//         Shape  幅度设置. 为12 Bit,取值范围为(0~4095) 

//出口参数:无

//====================================================================================

void AD9854_SetSine_double(double Freq,uint Shape)

{

uchar count=0;

uchar Adress;

 

Adress=0x04;      //选择频率控制字1地址的初值

 

Freq_double_convert(Freq);            //频率转换

 

for(count=6;count>0;)                     //写入6字节的频率控制字  

    {

AD9854_WR_Byte(Adress++,FreqWord[--count]);

    }

AD9854_WR_Byte(0x21,Shape>>8);   //设置I通道幅度

AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8);   //设置Q通道幅度

AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

 

SET_9854UDCLK;                    //更新AD9854输出

        CLR_9854UDCLK;

}

 

//====================================================================================

//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)

//函数功能:AD9854并行口写入数据

//入口参数:addr     6位地址

//         dat      写入的数据

//出口参数:无

//====================================================================================

void AD9854_WR_Byte(uchar addr,uchar dat)

{  

AD9854_AdrBus  = addr;

AD9854_DataBus = dat;

CLR_9854WR;

SET_9854WR;

}

ad9854.h头文件如下:

#ifndef _AD9854DDS_H_

#define _AD9854DDS_H_

#ifndef uchar

#define uchar unsigned char

#endif

#ifndef ulong

#define ulong unsigned long

#endif

#ifndef uint

#define uint unsigned int

#endif

//extern uchar FreqWord[6]; //6个字节频率控制字

//**********************以下为系统时钟以及其相关变量设置**************************

 

/* 

      此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个   

      CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ

      Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型

*/

 

/*

#define      CLK_Set            4

const ulong  Freq_mult_ulong  = 3518437;

const double Freq_mult_doulle = 3518437.2088832;

*/

 

/*

#define      CLK_Set            5

const ulong  Freq_mult_ulong  = 2814750;

const double Freq_mult_doulle = 2814749.76710656;

*/

 

/*

#define      CLK_Set            6

const ulong  Freq_mult_ulong  = 2345625;

const double Freq_mult_doulle = 2345624.80592213;

*/

 

/*

#define      CLK_Set            7

const ulong  Freq_mult_ulong  = 2010536;

const double Freq_mult_doulle = 2010535.54793326;

*/

 

/*

#define      CLK_Set            8

const ulong  Freq_mult_ulong  = 1759219;

const double Freq_mult_doulle = 1759218.6044416;

推荐阅读

史海拾趣

CANOPUS公司的发展小趣事

面对激烈的市场竞争,CANOPUS始终保持着创新的精神。公司不断推出新产品、新技术,以满足不同消费者的需求。同时,CANOPUS也注重品牌形象的塑造和提升,通过赞助音乐活动、举办音乐会等方式,提升品牌知名度和影响力。

这些故事只是CANOPUS公司在电子行业中发展的冰山一角。实际上,公司的发展过程充满了挑战和机遇,每一个阶段都离不开创始人的智慧和团队的努力。未来,随着科技的进步和市场的变化,CANOPUS将继续保持创新精神,为音乐爱好者带来更多优质的产品和服务。

Fairview Microwave Inc公司的发展小趣事

在国内市场取得一定成绩后,Fairview Microwave开始将目光投向国际市场。他们积极参加国际电子展会和技术交流活动,与全球各地的客户建立联系。同时,公司还积极开拓海外市场,通过设立分支机构和代理商等方式,将产品销售到全球各地。这些举措不仅为公司带来了更多的商机,也进一步提升了Fairview Microwave的品牌知名度和影响力。

Base Two (2) Systems公司的发展小趣事

Base Two (2) Systems公司自创立之初,便以技术创新为核心竞争力。在创始团队的带领下,公司研发团队不断攻克技术难关,成功研发出一系列具有领先水平的电子产品。这些产品不仅性能卓越,而且具有广泛的应用前景,为公司在市场上赢得了良好的口碑。

Eon公司的发展小趣事

随着全球对环保和可持续发展的关注日益增加,E.ON也开始加快绿色能源转型的步伐。公司加大了对可再生能源的投资力度,积极开发风电、太阳能等清洁能源项目。同时,E.ON还积极推广智能电网技术,提高能源利用效率,降低环境污染。

EMC [ELAN Microelectronics Corp]公司的发展小趣事

为了进一步扩大市场份额,义隆电子积极实施国际化战略。公司在台湾新竹科学园区设立了全球营运总部,并在亚、美等二大洲建立了密集的行销暨技术中心。通过不断拓展国际市场,义隆电子的产品已经销售到全球各地,赢得了广泛的客户认可和信赖。同时,公司还积极寻求与国际知名企业的合作机会,共同推动行业技术的发展和创新。

ALPS公司的发展小趣事

为了进一步扩大市场份额,义隆电子积极实施国际化战略。公司在台湾新竹科学园区设立了全球营运总部,并在亚、美等二大洲建立了密集的行销暨技术中心。通过不断拓展国际市场,义隆电子的产品已经销售到全球各地,赢得了广泛的客户认可和信赖。同时,公司还积极寻求与国际知名企业的合作机会,共同推动行业技术的发展和创新。

问答坊 | AI 解惑

PIC 8位单片机的分类和特点

PIC 8位单片机的分类和特点 …

查看全部问答>

大赛用芯片资料

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 芯片资料  …

查看全部问答>

2010年的汽车电子趋势预测

中国的汽车产业在今年很有可能触及或跨越年产销一千万辆这个门槛,事实上在实现这个目标以前,中国就已经成为仅次于美国的全球第二大汽车市场。在当前的汽车中,汽车电子系统所占的比重越来越大,很多特色化的功能都是依赖汽车电子技术来实现的,如 ...…

查看全部问答>

淘宝上的linux开发板能买不??

我是新手,以前都是跟着导师做单片机的。感觉单片机有点“不过瘾”的感觉,想往高深的学。想学linux下嵌入式编程,但是身边又没有的这方面的资源。于是想买一块开发板子。请问:淘宝上的那种便宜的开发板比如像2410、2440板子能买不?? 问题1:开 ...…

查看全部问答>

请问一般公司会招聘底层开发(驱动开发)的应届生吗

本人在校学生,最近做的项目都用到了一些驱动的开发,感觉底层这方面的编程比普通的软件开发难度大一点。如果是软件公司招聘的话,他们会招聘新手吗?个人感觉做这方面的真正开发,都是有多年经验的老手。…

查看全部问答>

ce下怎么获取ESN码还有怎么获取是手机的型号啊。。

ce下怎么获取ESN码还有怎么获取是手机的型号啊。。 …

查看全部问答>

伺服系统小结(连续上篇)

三、伺服系统调试   接通伺服驱动器的电源, 先进入测试调整模式,测试调整模式可以执行伺服驱动器的测试操作,报警复位和参数编辑等等.其数字操作器的按键说明如表1: 键 出现的情况 MOD 在不同模式 ...…

查看全部问答>

2812调试时关于看门狗的一些问题

2812调试时关于看门狗的一些问题 大家好, 我目前正在调试一块自己做的2812的板子,遇到关于看门狗的一些问题: 一点连续运行按钮程序就跳到3FFC00处(此处应该是复位向量),而点单步运行的时候程序可以走的.点连续运行的时候用示波器观察reset引脚,发 ...…

查看全部问答>

机械电能表到电子式电能表讲义

机械电能表到电子式电能表讲义,从事电能表行业可以看看哦! [ 本帖最后由 aishuang 于 2011-7-16 12:22 编辑 ]…

查看全部问答>

请大家看看我这个串口的程序哪里不对??很多乱码

单片机的接收端是连接的GPS信号, 发送端连接的是GPRS的接收。 单片机就是把收到的经纬度找出来传给GPRS,用UDP发送。 只要不连GPS, 发送的数据就完全正确。 连了GPS之后,数据就乱了,GPS是一直在发送,速度很快 #include #include #incl ...…

查看全部问答>