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

#include<msp430x14x.h>
#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 resetWDTCTL = 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<msp430x14x.h>
#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;                 //复位AD9854CLR_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次方除以120MFreq*=(double)(Temp);
//  1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295High16 = (int)(Freq/4294967295);                  //2^32 = 4294967295Freq -= (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倍倍频,但最大不能超过300MHZFreq_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;
*//*
#define      CLK_Set            9
const ulong  Freq_mult_ulong  = 1563750;
const double Freq_mult_doulle = 1563749.87061476;
*//*
#define      CLK_Set            10
const ulong  Freq_mult_ulong  = 1407375;
const double Freq_mult_doulle = 1407374.88355328;
*//*
#define      CLK_Set            11
const ulong  Freq_mult_ulong  = 1279432;
const double Freq_mult_doulle = 1279431.712321164;
*//*
#define      CLK_Set            12
const ulong  Freq_mult_ulong  = 1172812;
const double Freq_mult_doulle = 1172812.402961067;
*//*
#define      CLK_Set            13
const ulong  Freq_mult_ulong  = 1082596;
const double Freq_mult_doulle = 1082596.064271754;
*/#define      CLK_Set            14
//extern ulong  Freq_mult_ulong  = 1005268;
//extern double Freq_mult_doulle = 1005267.773966629;/*
#define      CLK_Set            15
const ulong  Freq_mult_ulong  = 938250;
const double Freq_mult_doulle = 938249.9223688533;
*/
//**************************修改硬件时要修改的部分********************************#define AD9854_DataBus P3OUT
#define AD9854_AdrBus  P2OUT
#define DIROUT_AD9854_DataBus  P3DIR = 0XFF //数据线IO口设为输出
#define DIROUT_AD9854_AdrBus   P2DIR = 0XFF//地址线IO口设为输出
#define DIROUT_RD    P4DIR |= BIT4;
#define DIROUT_WR    P4DIR |= BIT5;
#define DIROUT_UDCLK  P4DIR |= BIT6;
#define DIROUT_RST  P4DIR |= BIT7;
#define CLR_9854RD   P4OUT &= ~BIT4;   //AD9854读使能,低有效
#define SET_9854RD   P4OUT |= BIT4;
#define CLR_9854WR   P4OUT &= ~BIT5;   //AD9854写使能,低有效
#define SET_9854WR   P4OUT |= BIT5;
#define CLR_9854UDCLK   P4OUT &= ~BIT6;   //更新时钟
#define SET_9854UDCLK   P4OUT |= BIT6;
#define CLR_9854RST   P4OUT &= ~BIT7;   //复位信号
#define SET_9854RST   P4OUT |= BIT7;
//**************************以下部分为函数定义********************************void AD9854_WR_Byte(uchar addr,uchar dat);
void AD9854_Init(void);
void Freq_convert(long Freq);
void AD9854_SetSine(ulong Freq,uint Shape);
void Freq_double_convert(double Freq);
void AD9854_SetSine_double(double Freq,uint Shape);
#endif

基于AD9854个和MSP430的波形发生器相关推荐

  1. 基于stm32单片机的四种波形发生器正弦波、方波、三角波、锯齿波

    基于stm32单片机的四种波形发生器(源程序+仿真+设计报告)全套资料 资料编号:010 具体功能: (1) 可以实现四种波形:正弦波.方波.三角波.锯齿波: (2) 通过按键进行选择,频率可以调整: ...

  2. FPGA设计心得(9)基于DDS IP核的任意波形发生器设计

    博文目录 写在前面 正文 设计要求 IP核配置 定制输出数据位宽 定制相位位宽(或频率分辨率) 输出频率 输出正余弦选择以及数据格式 其他设置 电路设计 行为仿真 参考资料 交个朋友 写在前面 数据手 ...

  3. 【STM32入门】这个项目绝了,用手势来产生波形,基于手势控制的波形发生器

    大家好,我是张巧龙,之前有给实验室学生出了一道关于STM32的题:基于手势控制的波形产生题,题目简单,但综合性较强. 有些学生完成的还不错,个人觉得此题用来 入门 STM32再合适不过了. 展示视频: ...

  4. 基于51单片机的波形发生器(四种波形)(毕业设计资料)

    四种波形的产生,包括锯齿波.三角波.方波.正弦波.通过LCD液晶显示当前波形以及波形的频率.可以通过按键切换波形,并可以通过按键进行设置当前波形的频率大小,也可以设置频率设置不步进值.资料从主页链接中 ...

  5. 基于单片机超声波视力保护系统设计-基于51单片机8音键电子琴仿真设计-基于8086八路模拟信号采集均值显示系统设计-基于8086八路数据电压温度采集系统-基于8086波形发生器仿真设计【毕设课设分享】

    539基于单片机超声波视力保护系统设计-设计资料 硬件构成:单片机+最小系统+LCD1602液晶显示模块+超声波模块+DS18B20温度采集模块+光线检测模块+ADC0832模块+蜂鸣器模块+LED指 ...

  6. 基于单片机波形发生器PCB原理图报告设计资料-基于单片机比赛计时计分电路仿真设计-基于单片机报警器与旋转灯设计-基于单片机八路数据电压采集报警控制系统-基于单片机病房呼叫系统控制系统设计【毕设课设资】

    1302基于单片机波形发生器PCB原理图报告设计资料-毕设课设原理图程序资料 设计一个信号发生器,能在单片机的基础上控制并产生三角波.方波.正弦波和矩形波,且频率幅度和波形可以通过按键改变. #inc ...

  7. dac单缓冲方式C语言设计,课程设计基于DAC0832单缓冲工作波形发生器.doc

    课程设计基于DAC0832单缓冲工作波形发生器.doc 成绩 课程论文 题 目:基于DAC0832单缓冲工作波形发生器 学生姓名: 学生学号: 系别:电子工程学院 专业:通信工程 年级:2014 任课 ...

  8. 33220a 编程C语言,基于AT89C51单片机的数字式波形发生器(非常完整).doc

    摘要 本系统是基于AT89C51单片机的数字式波形发生器.采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832).运放电路(LM324).按键和LCD(1602)等.通过按 ...

  9. ​基于Verilog的DDS波形发生器的分析与实现(三角波、正弦波)

    原文作者:FPGA设计论坛 基于Verilog的DDS波形发生器的分析与实现(三角波.正弦波) 最近学习了一下关于DDS的相关知识,本篇概要记录一下自己的理解与实现. DDS信号发生器采用直接数字频率 ...

  10. 基于单片机的波形发生器设计

    单片机可以用来设计各种类型的波形发生器,下面是一种基于单片机的波形发生器设计方案. 所需材料: 单片机:可以选择常见的Atmel AVR单片机,如ATmega328P等. 调制器:可以使用AD9833 ...

最新文章

  1. 限制TextBox输入的内容
  2. C 这些东西的内存管理
  3. 移动端与pc端的区别 及 ios的 兼容性问题
  4. 深度学习loss值变为0_利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python源代码)...
  5. Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样
  6. 【吼吼睡cocos2d学习笔记】第四章 - 第一个游戏
  7. 6000毫安以上智能手机_展望2021年智能手机市场:这5大技术要爆发
  8. 登录自动填密码php,192 实现自动登录无限路由器后台管理网页,可以记住自己输入的密码 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  9. [未读]CLR via C#(第4版)
  10. BZOJ4305 数列的GCD
  11. 《深度学习Python实践》第22章——文本分类实例
  12. 关于定时任务的时间表达式
  13. 如何实现 ASP.NET Core WebApi 的版本化
  14. 【STM32】Fault 类异常_记一次STM32中HardFault问题的调试解决
  15. 谷歌插件——Vimium
  16. 计算机处理器的hz越大越好,cpu主频越高越好吗,教您CPU处理器主频率越高越好吗...
  17. access统计班级人数_Excel中怎么快速统计成绩表中分数段人数 - 卡饭网
  18. arcgis怎么关联excel表_ArcGIS如何将表连接到空间数据上
  19. sap hana连接
  20. Jest测试语法系列之Expect

热门文章

  1. 招投标异议与政府采购质疑二者差异大比拼,你必须掌握
  2. 香港渣打银行开户价格是多少?
  3. 一篇读懂深度学习中「训练」和「推断」的区别
  4. Cisco ACS 5.8 Radius认证服务器安装教程
  5. mysql 在线ddl_MySQL5.7—在线DDL总结
  6. 论文分享——Dynamic graph attention for referring expression comprehension
  7. v3.exo是什么文件_exo是什么文件?
  8. 机器学习 k-近邻算法
  9. 苹果手机应用分身_云手机应用多开app推荐 好用的多开分身软件
  10. 线程状态的区别 blocked waitting ,join 详解