历史上的今天
今天是: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;
上一篇:msp430输出PWM波
下一篇:MSP430切换主时钟
史海拾趣
|
中国的汽车产业在今年很有可能触及或跨越年产销一千万辆这个门槛,事实上在实现这个目标以前,中国就已经成为仅次于美国的全球第二大汽车市场。在当前的汽车中,汽车电子系统所占的比重越来越大,很多特色化的功能都是依赖汽车电子技术来实现的,如 ...… 查看全部问答> |
|
我是新手,以前都是跟着导师做单片机的。感觉单片机有点“不过瘾”的感觉,想往高深的学。想学linux下嵌入式编程,但是身边又没有的这方面的资源。于是想买一块开发板子。请问:淘宝上的那种便宜的开发板比如像2410、2440板子能买不?? 问题1:开 ...… 查看全部问答> |
|
本人在校学生,最近做的项目都用到了一些驱动的开发,感觉底层这方面的编程比普通的软件开发难度大一点。如果是软件公司招聘的话,他们会招聘新手吗?个人感觉做这方面的真正开发,都是有多年经验的老手。… 查看全部问答> |
|
三、伺服系统调试 接通伺服驱动器的电源, 先进入测试调整模式,测试调整模式可以执行伺服驱动器的测试操作,报警复位和参数编辑等等.其数字操作器的按键说明如表1: 键 出现的情况 MOD 在不同模式 ...… 查看全部问答> |
|
2812调试时关于看门狗的一些问题 大家好, 我目前正在调试一块自己做的2812的板子,遇到关于看门狗的一些问题: 一点连续运行按钮程序就跳到3FFC00处(此处应该是复位向量),而点单步运行的时候程序可以走的.点连续运行的时候用示波器观察reset引脚,发 ...… 查看全部问答> |
|
单片机的接收端是连接的GPS信号, 发送端连接的是GPRS的接收。 单片机就是把收到的经纬度找出来传给GPRS,用UDP发送。 只要不连GPS, 发送的数据就完全正确。 连了GPS之后,数据就乱了,GPS是一直在发送,速度很快 #include #include #incl ...… 查看全部问答> |




